RestStorageService service = getStorageService(getCredentials());
StorageBucket bucket = createBucketForTest("testSimpleThreadedStorageService");
String bucketName = bucket.getName();
try {
SimpleThreadedStorageService simpleThreadedService =
new SimpleThreadedStorageService(service);
StorageObject[] objects = new StorageObject[] {
new StorageObject("1-one.txt", "Some data"),
new StorageObject("2-twö.txt", "Some data"),
new StorageObject("3-thréè.txt", "Some data"),
new StorageObject("4-fôür.txt", "Some data"),
new StorageObject("5-fîvæ∫.txt", "Some data")
};
// Upload multiple objects
StorageObject[] putObjects =
simpleThreadedService.putObjects(bucketName, objects);
StorageObject[] listedObjects = service.listObjects(bucketName);
assertEquals(objects.length, listedObjects.length);
// Retrieve details for multiple objects
StorageObject[] headObjects = simpleThreadedService.getObjectsHeads(bucketName, objects);
assertEquals(objects.length, headObjects.length);
Arrays.sort(headObjects, new Comparator<StorageObject>() {
public int compare(StorageObject o1, StorageObject o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
for (int i = 0; i < objects.length; i++) {
assertEquals(objects[i].getKey(), headObjects[i].getKey());
assertEquals("Some data".length(), headObjects[i].getContentLength());
}
// Retrieve details for objects, some of which are missing but which we don't
// want to cause an error.
class Http404ErrorPermitter extends ErrorPermitter {
@Override
public boolean isPermitted(ServiceException ex) {
return ex.getResponseCode() == 404;
}
}
// Prepare object keys combining existing and non-existent key names
String objectKeys[] = new String[objects.length + 2];
for (int i = 0; i < objects.length; i++) {
objectKeys[i] = objects[i].getKey();
}
objectKeys[objects.length] = "missing-object-key-1";
objectKeys[objects.length + 1] = "missing-object-key-2";
StorageObject[] headObjectsWithMissing = simpleThreadedService.getObjectsHeads(
bucketName, objectKeys, new Http404ErrorPermitter());
assertEquals(objects.length + 2, headObjectsWithMissing.length);
for (int i = 0; i < objects.length; i++) {
assertEquals(objects[i].getKey(), headObjectsWithMissing[i].getKey());
assertEquals("Some data".length(), headObjectsWithMissing[i].getContentLength());
}
// Ensure we got ThrowableBearingStorageObject results with relevant info
assertEquals("missing-object-key-1", headObjectsWithMissing[objects.length].getKey());
assertEquals("missing-object-key-2", headObjectsWithMissing[objects.length + 1].getKey());
for (int i = objects.length; i < objects.length + 2; i++) {
assertEquals(
ThrowableBearingStorageObject.class, headObjectsWithMissing[i].getClass());
assertEquals(404,
((ServiceException)
((ThrowableBearingStorageObject)headObjectsWithMissing[i])
.getThrowable()).getResponseCode());
}
// Retrieve data for multiple objects
StorageObject[] getObjects = simpleThreadedService.getObjects(bucketName, objects);
assertEquals(objects.length, getObjects.length);
for (int i = 0; i < objects.length; i++) {
// TODO: Google Storage doesn't reliably return Content-Length in a GET
if (!TARGET_SERVICE_GS.equals(getTargetService())) {
assertEquals("Some data".length(), getObjects[i].getContentLength());
}
// Check all objects retrieved have expected data content.
assertEquals("Some data", ServiceUtils.readInputStreamToString(
getObjects[i].getDataInputStream(), Constants.DEFAULT_ENCODING));
}
// Delete multiple objects
simpleThreadedService.deleteObjects(bucketName, objects);
listedObjects = service.listObjects(bucketName);
assertEquals(0, listedObjects.length);
} finally {
cleanupBucketForTest("testSimpleThreadedStorageService");
}