added test for range requests with filesystem backend and corrected behavior

This commit is contained in:
Sebastian Annies 2011-08-12 13:48:32 +02:00
parent 5843d5fee9
commit 173592f7d5
3 changed files with 752 additions and 726 deletions

View File

@ -567,7 +567,7 @@ public class FilesystemAsyncBlobStore extends BaseAsyncBlobStore {
String[] firstLast = s.split("\\-"); String[] firstLast = s.split("\\-");
int offset = Integer.parseInt(firstLast[0]); int offset = Integer.parseInt(firstLast[0]);
int last = Integer.parseInt(firstLast[1]); int last = Integer.parseInt(firstLast[1]);
int length = (last < data.length) ? last + 1 : data.length - offset; int length = last - offset + 1; // the range end is included
out.write(data, offset, length); out.write(data, offset, length);
} else { } else {
return immediateFailedFuture(new IllegalArgumentException("first and last were null!")); return immediateFailedFuture(new IllegalArgumentException("first and last were null!"));

View File

@ -35,7 +35,9 @@ import java.util.Iterator;
import java.util.Properties; import java.util.Properties;
import java.util.Set; import java.util.Set;
import junit.framework.Assert;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.BlobStoreContext; import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.BlobStoreContextFactory; import org.jclouds.blobstore.BlobStoreContextFactory;
@ -51,6 +53,7 @@ import org.jclouds.blobstore.options.ListContainerOptions;
import org.jclouds.crypto.CryptoStreams; import org.jclouds.crypto.CryptoStreams;
import org.jclouds.filesystem.reference.FilesystemConstants; import org.jclouds.filesystem.reference.FilesystemConstants;
import org.jclouds.filesystem.utils.TestUtils; import org.jclouds.filesystem.utils.TestUtils;
import org.jclouds.io.payloads.StringPayload;
import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test; import org.testng.annotations.Test;
@ -112,7 +115,6 @@ public class FilesystemAsyncBlobStoreTest {
/** /**
* Checks if context parameters are managed in the correct way * Checks if context parameters are managed in the correct way
*
*/ */
public void testParameters() { public void testParameters() {
// no base directory declared in properties // no base directory declared in properties
@ -707,6 +709,27 @@ public class FilesystemAsyncBlobStoreTest {
} }
} }
public void testRanges() throws IOException {
String payload = "abcdefgh";
Blob blob = blobStore.blobBuilder("test").payload(new StringPayload(payload)).build();
blobStore.putBlob(CONTAINER_NAME, blob);
GetOptions getOptionsRangeStartAt = new GetOptions();
getOptionsRangeStartAt.startAt(1);
Blob blobRangeStartAt = blobStore.getBlob(CONTAINER_NAME, blob.getMetadata().getName(), getOptionsRangeStartAt);
Assert.assertEquals("bcdefgh", IOUtils.toString(blobRangeStartAt.getPayload().getInput()));
GetOptions getOptionsRangeTail = new GetOptions();
getOptionsRangeTail.tail(3);
Blob blobRangeTail = blobStore.getBlob(CONTAINER_NAME, blob.getMetadata().getName(), getOptionsRangeTail);
Assert.assertEquals("fgh", IOUtils.toString(blobRangeTail.getPayload().getInput()));
GetOptions getOptionsFragment = new GetOptions();
getOptionsFragment.range(4, 6);
Blob blobFragment = blobStore.getBlob(CONTAINER_NAME, blob.getMetadata().getName(), getOptionsFragment);
Assert.assertEquals("efg", IOUtils.toString(blobFragment.getPayload().getInput()));
}
// public void testInvalidBlobKey() { // public void testInvalidBlobKey() {
// try { // try {
// blobStore.newBlob(File.separator + "testwrongblobkey"); // blobStore.newBlob(File.separator + "testwrongblobkey");

View File

@ -55,6 +55,9 @@ public class GetOptions {
/** /**
* download the specified range of the object. * download the specified range of the object.
* @param start first offset included in the response
* @param end last offset included in the response (inclusive).
* @return itself to enable daisy-chaining of expressions
*/ */
public GetOptions range(long start, long end) { public GetOptions range(long start, long end) {
checkArgument(start >= 0, "start must be >= 0"); checkArgument(start >= 0, "start must be >= 0");