mirror of https://github.com/apache/jclouds.git
Issue 207: increased ferocity of tests to do concurrent 5MB downloads w/checksum on both http and blobstore level.
This commit is contained in:
parent
b70da07b27
commit
614cbb24c6
|
@ -138,13 +138,13 @@
|
||||||
<category name="jclouds.compute">
|
<category name="jclouds.compute">
|
||||||
<priority value="TRACE" />
|
<priority value="TRACE" />
|
||||||
<appender-ref ref="ASYNCCOMPUTE" />
|
<appender-ref ref="ASYNCCOMPUTE" />
|
||||||
</category>
|
</category><!--
|
||||||
|
|
||||||
<category name="jclouds.wire">
|
<category name="jclouds.wire">
|
||||||
<priority value="DEBUG" />
|
<priority value="DEBUG" />
|
||||||
<appender-ref ref="ASYNCWIRE" />
|
<appender-ref ref="ASYNCWIRE" />
|
||||||
</category>
|
</category>
|
||||||
<!-- ======================= -->
|
--><!-- ======================= -->
|
||||||
<!-- Setup the Root category -->
|
<!-- Setup the Root category -->
|
||||||
<!-- ======================= -->
|
<!-- ======================= -->
|
||||||
|
|
||||||
|
|
|
@ -23,17 +23,21 @@ import static org.jclouds.blobstore.options.GetOptions.Builder.ifETagMatches;
|
||||||
import static org.jclouds.blobstore.options.GetOptions.Builder.ifModifiedSince;
|
import static org.jclouds.blobstore.options.GetOptions.Builder.ifModifiedSince;
|
||||||
import static org.jclouds.blobstore.options.GetOptions.Builder.ifUnmodifiedSince;
|
import static org.jclouds.blobstore.options.GetOptions.Builder.ifUnmodifiedSince;
|
||||||
import static org.jclouds.blobstore.options.GetOptions.Builder.range;
|
import static org.jclouds.blobstore.options.GetOptions.Builder.range;
|
||||||
|
import static org.jclouds.concurrent.ConcurrentUtils.awaitCompletion;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
import static org.testng.Assert.assertNotNull;
|
import static org.testng.Assert.assertNotNull;
|
||||||
import static org.testng.Assert.assertNull;
|
import static org.testng.Assert.assertNull;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.zip.GZIPInputStream;
|
||||||
|
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
@ -43,17 +47,103 @@ import org.jclouds.blobstore.domain.BlobMetadata;
|
||||||
import org.jclouds.blobstore.domain.PageSet;
|
import org.jclouds.blobstore.domain.PageSet;
|
||||||
import org.jclouds.blobstore.domain.StorageMetadata;
|
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||||
import org.jclouds.blobstore.util.internal.BlobStoreUtilsImpl;
|
import org.jclouds.blobstore.util.internal.BlobStoreUtilsImpl;
|
||||||
|
import org.jclouds.encryption.EncryptionService;
|
||||||
|
import org.jclouds.encryption.EncryptionService.MD5InputStreamResult;
|
||||||
import org.jclouds.encryption.internal.JCEEncryptionService;
|
import org.jclouds.encryption.internal.JCEEncryptionService;
|
||||||
|
import org.jclouds.http.BaseJettyTest;
|
||||||
import org.jclouds.http.HttpResponseException;
|
import org.jclouds.http.HttpResponseException;
|
||||||
import org.jclouds.http.Payloads;
|
import org.jclouds.http.Payloads;
|
||||||
|
import org.jclouds.logging.Logger;
|
||||||
import org.jclouds.util.Utils;
|
import org.jclouds.util.Utils;
|
||||||
|
import org.testng.ITestContext;
|
||||||
|
import org.testng.annotations.BeforeClass;
|
||||||
import org.testng.annotations.DataProvider;
|
import org.testng.annotations.DataProvider;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
import com.google.common.io.InputSupplier;
|
||||||
|
import com.google.common.util.concurrent.Futures;
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
|
public class BaseBlobIntegrationTest extends BaseBlobStoreIntegrationTest {
|
||||||
|
private byte[] oneHundredOneConstitutions;
|
||||||
|
private EncryptionService encryptionService;
|
||||||
|
private byte[] oneHundredOneConstitutionsMD5;
|
||||||
|
private long oneHundredOneConstitutionsLength;
|
||||||
|
|
||||||
|
@BeforeClass(groups = { "integration", "live" })
|
||||||
|
@Override
|
||||||
|
public void setUpResourcesOnThisThread(ITestContext testContext) throws Exception {
|
||||||
|
encryptionService = Guice.createInjector().getInstance(EncryptionService.class);
|
||||||
|
MD5InputStreamResult result = encryptionService.generateMD5Result(getTestDataSupplier()
|
||||||
|
.getInput());
|
||||||
|
oneHundredOneConstitutions = result.data;
|
||||||
|
oneHundredOneConstitutionsMD5 = result.md5;
|
||||||
|
oneHundredOneConstitutionsLength = result.length;
|
||||||
|
super.setUpResourcesOnThisThread(testContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static InputSupplier<InputStream> getTestDataSupplier() throws IOException {
|
||||||
|
byte[] oneConstitution = ByteStreams.toByteArray(new GZIPInputStream(BaseJettyTest.class
|
||||||
|
.getResourceAsStream("/const.txt.gz")));
|
||||||
|
InputSupplier<ByteArrayInputStream> constitutionSupplier = ByteStreams
|
||||||
|
.newInputStreamSupplier(oneConstitution);
|
||||||
|
|
||||||
|
InputSupplier<InputStream> temp = ByteStreams.join(constitutionSupplier);
|
||||||
|
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
temp = ByteStreams.join(temp, constitutionSupplier);
|
||||||
|
}
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(groups = { "integration", "live" })
|
||||||
|
public void testBigFileGets() throws InterruptedException, IOException {
|
||||||
|
String containerName = getContainerName();
|
||||||
|
try {
|
||||||
|
String key = "constitution.txt";
|
||||||
|
|
||||||
|
uploadConstitution(containerName, key);
|
||||||
|
Map<Integer, ListenableFuture<?>> responses = Maps.newHashMap();
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
|
||||||
|
responses.put(i, Futures.compose(context.getAsyncBlobStore()
|
||||||
|
.getBlob(containerName, key), new Function<Blob, Void>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void apply(Blob from) {
|
||||||
|
assertEquals(encryptionService.md5(from.getContent()),
|
||||||
|
oneHundredOneConstitutionsMD5);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
Map<Integer, Exception> exceptions = awaitCompletion(responses, exec, 30000l,
|
||||||
|
Logger.CONSOLE, "get constitution");
|
||||||
|
assert exceptions.size() == 0 : exceptions;
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
returnContainer(containerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void uploadConstitution(String containerName, String key) throws IOException {
|
||||||
|
Blob sourceObject = context.getBlobStore().newBlob(key);
|
||||||
|
sourceObject.getMetadata().setContentType("text/plain");
|
||||||
|
sourceObject.getMetadata().setContentMD5(oneHundredOneConstitutionsMD5);
|
||||||
|
sourceObject.setContentLength(oneHundredOneConstitutionsLength);
|
||||||
|
sourceObject.setPayload(oneHundredOneConstitutions);
|
||||||
|
context.getBlobStore().putBlob(containerName, sourceObject);
|
||||||
|
}
|
||||||
|
|
||||||
@Test(groups = { "integration", "live" })
|
@Test(groups = { "integration", "live" })
|
||||||
public void testGetIfModifiedSince() throws InterruptedException {
|
public void testGetIfModifiedSince() throws InterruptedException {
|
||||||
|
|
|
@ -21,7 +21,6 @@ package org.jclouds.encryption;
|
||||||
import static com.google.common.base.Preconditions.checkArgument;
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.security.InvalidKeyException;
|
import java.security.InvalidKeyException;
|
||||||
|
@ -57,7 +56,7 @@ public interface EncryptionService {
|
||||||
|
|
||||||
byte[] md5(byte[] plainBytes);
|
byte[] md5(byte[] plainBytes);
|
||||||
|
|
||||||
byte[] md5(File toEncode);
|
byte[] md5(InputStream toEncode);
|
||||||
|
|
||||||
String toBase64String(byte[] resBuf);
|
String toBase64String(byte[] resBuf);
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,8 @@ package org.jclouds.encryption.internal;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
@ -30,6 +32,8 @@ import java.security.NoSuchProviderException;
|
||||||
|
|
||||||
import org.jclouds.encryption.EncryptionService;
|
import org.jclouds.encryption.EncryptionService;
|
||||||
|
|
||||||
|
import com.google.common.base.Throwables;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
|
@ -90,9 +94,13 @@ public abstract class BaseEncryptionService implements EncryptionService {
|
||||||
} else if (data instanceof String) {
|
} else if (data instanceof String) {
|
||||||
md5 = md5(((String) data).getBytes());
|
md5 = md5(((String) data).getBytes());
|
||||||
} else if (data instanceof File) {
|
} else if (data instanceof File) {
|
||||||
md5 = md5(((File) data));
|
try {
|
||||||
|
md5 = md5(new FileInputStream((File) data));
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
Throwables.propagate(e);
|
||||||
|
}
|
||||||
} else if (data instanceof InputStream) {
|
} else if (data instanceof InputStream) {
|
||||||
md5 = generateMD5Result(((InputStream) data)).md5;
|
md5 = md5(((InputStream) data));
|
||||||
} else {
|
} else {
|
||||||
throw new UnsupportedOperationException("Content not supported " + data.getClass());
|
throw new UnsupportedOperationException("Content not supported " + data.getClass());
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.encryption.internal;
|
package org.jclouds.encryption.internal;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.security.InvalidKeyException;
|
import java.security.InvalidKeyException;
|
||||||
|
@ -30,8 +29,6 @@ import java.security.NoSuchProviderException;
|
||||||
import javax.crypto.Mac;
|
import javax.crypto.Mac;
|
||||||
import javax.crypto.spec.SecretKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
|
|
||||||
import com.google.common.io.Closeables;
|
import com.google.common.io.Closeables;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -78,15 +75,13 @@ public class JCEEncryptionService extends BaseEncryptionService {
|
||||||
return eTag.digest();
|
return eTag.digest();
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] md5(File toEncode) {
|
public byte[] md5(InputStream toEncode) {
|
||||||
MessageDigest eTag = getDigest();
|
MessageDigest eTag = getDigest();
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
int numRead = -1;
|
int numRead = -1;
|
||||||
InputStream i = null;
|
|
||||||
try {
|
try {
|
||||||
i = new FileInputStream(toEncode);
|
|
||||||
do {
|
do {
|
||||||
numRead = i.read(buffer);
|
numRead = toEncode.read(buffer);
|
||||||
if (numRead > 0) {
|
if (numRead > 0) {
|
||||||
eTag.update(buffer, 0, numRead);
|
eTag.update(buffer, 0, numRead);
|
||||||
}
|
}
|
||||||
|
@ -94,7 +89,7 @@ public class JCEEncryptionService extends BaseEncryptionService {
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
} finally {
|
} finally {
|
||||||
Closeables.closeQuietly(i);
|
Closeables.closeQuietly(toEncode);
|
||||||
}
|
}
|
||||||
return eTag.digest();
|
return eTag.digest();
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ import com.google.inject.Module;
|
||||||
* @author James Murty
|
* @author James Murty
|
||||||
*/
|
*/
|
||||||
@Test(sequential = true)
|
@Test(sequential = true)
|
||||||
public class BackoffLimitedRetryJavaIntegrationTest extends BaseJettyTest {
|
public class BackoffLimitedRetryJavaTest extends BaseJettyTest {
|
||||||
private int beginToFailOnRequestNumber = 0;
|
private int beginToFailOnRequestNumber = 0;
|
||||||
private int endFailuresOnRequestNumber = 0;
|
private int endFailuresOnRequestNumber = 0;
|
||||||
private int requestCount = 0;
|
private int requestCount = 0;
|
|
@ -38,8 +38,8 @@ import com.google.common.collect.ImmutableMap;
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test(threadPoolSize = 10, sequential = true)
|
@Test(threadPoolSize = 10, groups = "integration", sequential = true)
|
||||||
public abstract class BaseHttpCommandExecutorServiceTest extends BaseJettyTest {
|
public abstract class BaseHttpCommandExecutorServiceIntegrationTest extends BaseJettyTest {
|
||||||
|
|
||||||
@Test(invocationCount = 25, timeOut = 5000)
|
@Test(invocationCount = 25, timeOut = 5000)
|
||||||
public void testRequestFilter() throws MalformedURLException, ExecutionException,
|
public void testRequestFilter() throws MalformedURLException, ExecutionException,
|
||||||
|
@ -92,6 +92,13 @@ public abstract class BaseHttpCommandExecutorServiceTest extends BaseJettyTest {
|
||||||
assertEquals(client.download("redirect").trim(), XML2);
|
assertEquals(client.download("redirect").trim(), XML2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(invocationCount = 100, timeOut = 5000)
|
||||||
|
public void testGetBigFile() throws MalformedURLException, ExecutionException,
|
||||||
|
InterruptedException, TimeoutException {
|
||||||
|
assertEquals(encryptionService.toBase64String(encryptionService.md5(client
|
||||||
|
.downloadStream("101constitutions"))), md5);
|
||||||
|
}
|
||||||
|
|
||||||
@Test(enabled = false, invocationCount = 25, timeOut = 5000)
|
@Test(enabled = false, invocationCount = 25, timeOut = 5000)
|
||||||
public void testGetStringPermanentRedirect() throws MalformedURLException, ExecutionException,
|
public void testGetStringPermanentRedirect() throws MalformedURLException, ExecutionException,
|
||||||
InterruptedException, TimeoutException {
|
InterruptedException, TimeoutException {
|
|
@ -18,7 +18,9 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.http;
|
package org.jclouds.http;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -26,6 +28,7 @@ import java.util.Properties;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.zip.GZIPInputStream;
|
||||||
|
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
|
@ -35,6 +38,7 @@ import javax.ws.rs.core.HttpHeaders;
|
||||||
|
|
||||||
import org.jclouds.PropertiesBuilder;
|
import org.jclouds.PropertiesBuilder;
|
||||||
import org.jclouds.concurrent.internal.SyncProxy;
|
import org.jclouds.concurrent.internal.SyncProxy;
|
||||||
|
import org.jclouds.encryption.EncryptionService;
|
||||||
import org.jclouds.lifecycle.Closer;
|
import org.jclouds.lifecycle.Closer;
|
||||||
import org.jclouds.rest.ConfiguresRestClient;
|
import org.jclouds.rest.ConfiguresRestClient;
|
||||||
import org.jclouds.rest.RestClientFactory;
|
import org.jclouds.rest.RestClientFactory;
|
||||||
|
@ -53,7 +57,10 @@ import org.testng.annotations.Optional;
|
||||||
import org.testng.annotations.Parameters;
|
import org.testng.annotations.Parameters;
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
import com.google.common.io.InputSupplier;
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
|
import com.google.inject.Guice;
|
||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
|
@ -139,12 +146,22 @@ public abstract class BaseJettyTest {
|
||||||
private Server server2;
|
private Server server2;
|
||||||
protected RestContext<IntegrationTestAsyncClient, IntegrationTestClient> context;
|
protected RestContext<IntegrationTestAsyncClient, IntegrationTestClient> context;
|
||||||
private int testPort;
|
private int testPort;
|
||||||
|
protected EncryptionService encryptionService;
|
||||||
|
protected String md5;
|
||||||
static final Pattern actionPattern = Pattern.compile("/objects/(.*)/action/([a-z]*);?(.*)");
|
static final Pattern actionPattern = Pattern.compile("/objects/(.*)/action/([a-z]*);?(.*)");
|
||||||
|
|
||||||
@BeforeTest
|
@BeforeTest
|
||||||
@Parameters( { "test-jetty-port" })
|
@Parameters( { "test-jetty-port" })
|
||||||
public void setUpJetty(@Optional("8123") final int testPort) throws Exception {
|
public void setUpJetty(@Optional("8123") final int testPort) throws Exception {
|
||||||
this.testPort = testPort;
|
this.testPort = testPort;
|
||||||
|
|
||||||
|
final InputSupplier<InputStream> oneHundredOneConstitutions = getTestDataSupplier();
|
||||||
|
|
||||||
|
encryptionService = Guice.createInjector().getInstance(EncryptionService.class);
|
||||||
|
|
||||||
|
md5 = encryptionService.md5Base64(ByteStreams.toByteArray(oneHundredOneConstitutions
|
||||||
|
.getInput()));
|
||||||
|
|
||||||
Handler server1Handler = new AbstractHandler() {
|
Handler server1Handler = new AbstractHandler() {
|
||||||
public void handle(String target, HttpServletRequest request,
|
public void handle(String target, HttpServletRequest request,
|
||||||
HttpServletResponse response, int dispatch) throws IOException, ServletException {
|
HttpServletResponse response, int dispatch) throws IOException, ServletException {
|
||||||
|
@ -152,6 +169,11 @@ public abstract class BaseJettyTest {
|
||||||
return;
|
return;
|
||||||
} else if (target.indexOf("redirect") > 0) {
|
} else if (target.indexOf("redirect") > 0) {
|
||||||
response.sendRedirect("http://localhost:" + (testPort + 1));
|
response.sendRedirect("http://localhost:" + (testPort + 1));
|
||||||
|
} else if (target.indexOf("101constitutions") > 0) {
|
||||||
|
response.setContentType("text/plain");
|
||||||
|
response.setHeader("Content-MD5", md5);
|
||||||
|
response.setStatus(HttpServletResponse.SC_OK);
|
||||||
|
ByteStreams.copy(oneHundredOneConstitutions.getInput(), response.getOutputStream());
|
||||||
} else if (request.getMethod().equals("PUT")) {
|
} else if (request.getMethod().equals("PUT")) {
|
||||||
if (request.getContentLength() > 0) {
|
if (request.getContentLength() > 0) {
|
||||||
response.setStatus(HttpServletResponse.SC_OK);
|
response.setStatus(HttpServletResponse.SC_OK);
|
||||||
|
@ -245,6 +267,21 @@ public abstract class BaseJettyTest {
|
||||||
assert client.newStringBuffer() != null;
|
assert client.newStringBuffer() != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static InputSupplier<InputStream> getTestDataSupplier() throws IOException {
|
||||||
|
byte[] oneConstitution = ByteStreams.toByteArray(new GZIPInputStream(BaseJettyTest.class
|
||||||
|
.getResourceAsStream("/const.txt.gz")));
|
||||||
|
InputSupplier<ByteArrayInputStream> constitutionSupplier = ByteStreams
|
||||||
|
.newInputStreamSupplier(oneConstitution);
|
||||||
|
|
||||||
|
InputSupplier<InputStream> temp = ByteStreams.join(constitutionSupplier);
|
||||||
|
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
temp = ByteStreams.join(temp, constitutionSupplier);
|
||||||
|
}
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
public static RestContextBuilder<IntegrationTestAsyncClient, IntegrationTestClient> newBuilder(
|
public static RestContextBuilder<IntegrationTestAsyncClient, IntegrationTestClient> newBuilder(
|
||||||
final int testPort, final Properties properties, Module connectionModule) {
|
final int testPort, final Properties properties, Module connectionModule) {
|
||||||
return new IntegrationContextBuilder(properties, testPort).withModules(connectionModule);
|
return new IntegrationContextBuilder(properties, testPort).withModules(connectionModule);
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.http;
|
package org.jclouds.http;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
|
@ -62,6 +63,10 @@ public interface IntegrationTestAsyncClient {
|
||||||
@Path("objects/{id}")
|
@Path("objects/{id}")
|
||||||
ListenableFuture<String> download(@PathParam("id") String id);
|
ListenableFuture<String> download(@PathParam("id") String id);
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("{path}")
|
||||||
|
ListenableFuture<InputStream> downloadStream(@PathParam("path") String path);
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("{path}")
|
@Path("{path}")
|
||||||
ListenableFuture<String> synch(@PathParam("path") String id);
|
ListenableFuture<String> synch(@PathParam("path") String id);
|
||||||
|
@ -136,7 +141,7 @@ public interface IntegrationTestAsyncClient {
|
||||||
@GET
|
@GET
|
||||||
@Path("objects/{id}")
|
@Path("objects/{id}")
|
||||||
ListenableFuture<String> download(@PathParam("id") String id, @HeaderParam("test") String header);
|
ListenableFuture<String> download(@PathParam("id") String id, @HeaderParam("test") String header);
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("objects/{id}")
|
@Path("objects/{id}")
|
||||||
@XMLResponseParser(BarHandler.class)
|
@XMLResponseParser(BarHandler.class)
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.http;
|
package org.jclouds.http;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@ -38,6 +39,8 @@ public interface IntegrationTestClient {
|
||||||
|
|
||||||
String download(String id);
|
String download(String id);
|
||||||
|
|
||||||
|
InputStream downloadStream(String id);
|
||||||
|
|
||||||
String downloadException(String id, HttpRequestOptions options);
|
String downloadException(String id, HttpRequestOptions options);
|
||||||
|
|
||||||
String synchException(String id, String header);
|
String synchException(String id, String header);
|
||||||
|
|
|
@ -37,7 +37,7 @@ import com.google.inject.Module;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public class JavaUrlHttpCommandExecutorServiceTest extends BaseHttpCommandExecutorServiceTest {
|
public class JavaUrlHttpCommandExecutorServiceIntegrationTest extends BaseHttpCommandExecutorServiceIntegrationTest {
|
||||||
|
|
||||||
protected Module createConnectionModule() {
|
protected Module createConnectionModule() {
|
||||||
return new JavaUrlHttpCommandExecutorServiceModule();
|
return new JavaUrlHttpCommandExecutorServiceModule();
|
Binary file not shown.
|
@ -25,7 +25,7 @@ import static org.jclouds.Constants.PROPERTY_USER_THREADS;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.jclouds.http.BaseHttpCommandExecutorServiceTest;
|
import org.jclouds.http.BaseHttpCommandExecutorServiceIntegrationTest;
|
||||||
import org.jclouds.http.apachehc.config.ApacheHCHttpCommandExecutorServiceModule;
|
import org.jclouds.http.apachehc.config.ApacheHCHttpCommandExecutorServiceModule;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ import com.google.inject.Module;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public class ApacheHCHttpCommandExecutorServiceTest extends BaseHttpCommandExecutorServiceTest {
|
public class ApacheHCHttpCommandExecutorServiceTest extends BaseHttpCommandExecutorServiceIntegrationTest {
|
||||||
static {
|
static {
|
||||||
System.setProperty("http.conn-manager.timeout", 1000 + "");
|
System.setProperty("http.conn-manager.timeout", 1000 + "");
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,6 @@
|
||||||
package org.jclouds.encryption.bouncycastle;
|
package org.jclouds.encryption.bouncycastle;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.security.InvalidKeyException;
|
import java.security.InvalidKeyException;
|
||||||
|
@ -83,16 +81,14 @@ public class BouncyCastleEncryptionService extends BaseEncryptionService {
|
||||||
return resBuf;
|
return resBuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] md5(File toEncode) {
|
public byte[] md5(InputStream toEncode) {
|
||||||
MD5Digest eTag = new MD5Digest();
|
MD5Digest eTag = new MD5Digest();
|
||||||
byte[] resBuf = new byte[eTag.getDigestSize()];
|
byte[] resBuf = new byte[eTag.getDigestSize()];
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[1024];
|
||||||
int numRead = -1;
|
int numRead = -1;
|
||||||
InputStream i = null;
|
|
||||||
try {
|
try {
|
||||||
i = new FileInputStream(toEncode);
|
|
||||||
do {
|
do {
|
||||||
numRead = i.read(buffer);
|
numRead = toEncode.read(buffer);
|
||||||
if (numRead > 0) {
|
if (numRead > 0) {
|
||||||
eTag.update(buffer, 0, numRead);
|
eTag.update(buffer, 0, numRead);
|
||||||
}
|
}
|
||||||
|
@ -100,7 +96,7 @@ public class BouncyCastleEncryptionService extends BaseEncryptionService {
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
} finally {
|
} finally {
|
||||||
Closeables.closeQuietly(i);
|
Closeables.closeQuietly(toEncode);
|
||||||
}
|
}
|
||||||
eTag.doFinal(resBuf, 0);
|
eTag.doFinal(resBuf, 0);
|
||||||
return resBuf;
|
return resBuf;
|
||||||
|
|
|
@ -25,7 +25,7 @@ import static org.jclouds.Constants.PROPERTY_USER_THREADS;
|
||||||
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.jclouds.http.BaseHttpCommandExecutorServiceTest;
|
import org.jclouds.http.BaseHttpCommandExecutorServiceIntegrationTest;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
|
@ -36,7 +36,7 @@ import com.google.inject.Module;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public class EnterpriseConfigurationModuleTest extends BaseHttpCommandExecutorServiceTest {
|
public class EnterpriseConfigurationModuleTest extends BaseHttpCommandExecutorServiceIntegrationTest {
|
||||||
|
|
||||||
protected Module createConnectionModule() {
|
protected Module createConnectionModule() {
|
||||||
return new EnterpriseConfigurationModule();
|
return new EnterpriseConfigurationModule();
|
||||||
|
|
|
@ -28,7 +28,7 @@ import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
import org.jclouds.gae.config.GoogleAppEngineConfigurationModule;
|
import org.jclouds.gae.config.GoogleAppEngineConfigurationModule;
|
||||||
import org.jclouds.http.BaseHttpCommandExecutorServiceTest;
|
import org.jclouds.http.BaseHttpCommandExecutorServiceIntegrationTest;
|
||||||
import org.testng.annotations.BeforeMethod;
|
import org.testng.annotations.BeforeMethod;
|
||||||
import org.testng.annotations.BeforeTest;
|
import org.testng.annotations.BeforeTest;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
@ -46,7 +46,7 @@ import com.google.inject.Module;
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public class GaeHttpCommandExecutorServiceIntegrationTest extends
|
public class GaeHttpCommandExecutorServiceIntegrationTest extends
|
||||||
BaseHttpCommandExecutorServiceTest {
|
BaseHttpCommandExecutorServiceIntegrationTest {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Test(invocationCount = 50, timeOut = 3000)
|
@Test(invocationCount = 50, timeOut = 3000)
|
||||||
|
@ -248,4 +248,11 @@ public class GaeHttpCommandExecutorServiceIntegrationTest extends
|
||||||
protected void addConnectionProperties(Properties props) {
|
protected void addConnectionProperties(Properties props) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Test(invocationCount = 50, timeOut = 3000)
|
||||||
|
public void testGetBigFile() throws MalformedURLException, ExecutionException,
|
||||||
|
InterruptedException, TimeoutException {
|
||||||
|
// disabled since test data is too big
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.http.httpnio.pool;
|
package org.jclouds.http.httpnio.pool;
|
||||||
|
|
||||||
import org.jclouds.http.BackoffLimitedRetryJavaIntegrationTest;
|
import org.jclouds.http.BackoffLimitedRetryJavaTest;
|
||||||
import org.jclouds.http.handlers.BackoffLimitedRetryHandler;
|
import org.jclouds.http.handlers.BackoffLimitedRetryHandler;
|
||||||
import org.jclouds.http.httpnio.config.NioTransformingHttpCommandExecutorServiceModule;
|
import org.jclouds.http.httpnio.config.NioTransformingHttpCommandExecutorServiceModule;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
@ -35,7 +35,7 @@ import com.google.inject.Module;
|
||||||
*/
|
*/
|
||||||
@Test(sequential = true)
|
@Test(sequential = true)
|
||||||
public class NioBackoffLimitedRetryJavaIntegrationTest extends
|
public class NioBackoffLimitedRetryJavaIntegrationTest extends
|
||||||
BackoffLimitedRetryJavaIntegrationTest {
|
BackoffLimitedRetryJavaTest {
|
||||||
|
|
||||||
protected Module createConnectionModule() {
|
protected Module createConnectionModule() {
|
||||||
return new NioTransformingHttpCommandExecutorServiceModule();
|
return new NioTransformingHttpCommandExecutorServiceModule();
|
||||||
|
|
|
@ -27,7 +27,7 @@ import java.util.Properties;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
import org.jclouds.http.BaseHttpCommandExecutorServiceTest;
|
import org.jclouds.http.BaseHttpCommandExecutorServiceIntegrationTest;
|
||||||
import org.jclouds.http.httpnio.config.NioTransformingHttpCommandExecutorServiceModule;
|
import org.jclouds.http.httpnio.config.NioTransformingHttpCommandExecutorServiceModule;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ import com.google.inject.Module;
|
||||||
*/
|
*/
|
||||||
@Test(threadPoolSize = 10, sequential = true)
|
@Test(threadPoolSize = 10, sequential = true)
|
||||||
public class NioTransformingHttpCommandExecutorServiceTest extends
|
public class NioTransformingHttpCommandExecutorServiceTest extends
|
||||||
BaseHttpCommandExecutorServiceTest {
|
BaseHttpCommandExecutorServiceIntegrationTest {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Test(enabled = false)
|
@Test(enabled = false)
|
||||||
|
@ -66,4 +66,10 @@ public class NioTransformingHttpCommandExecutorServiceTest extends
|
||||||
props.setProperty(PROPERTY_USER_THREADS, 0 + "");
|
props.setProperty(PROPERTY_USER_THREADS, 0 + "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Test(enabled = false)
|
||||||
|
public void testGetBigFile() throws MalformedURLException, ExecutionException,
|
||||||
|
InterruptedException, TimeoutException {
|
||||||
|
// disabled since test data is too big
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue