JAMES-2525 adds createContainer operation to ObjectStorageBlobsDAO

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/a2c7e989
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/a2c7e989
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/a2c7e989

Branch: refs/heads/master
Commit: a2c7e989f662c70eb5d0f46031eba2e2433ed381
Parents: 7c57ae1
Author: Jean Helou <j...@codamens.fr>
Authored: Tue Sep 11 13:19:38 2018 +0200
Committer: Benoit Tellier <btell...@linagora.com>
Committed: Thu Oct 11 09:27:00 2018 +0700

----------------------------------------------------------------------
 .../objectstorage/ObjectStorageBlobsDAO.java    | 13 ++++++++
 .../ObjectStorageBlobsDAOContract.java          |  9 ++----
 .../ObjectStorageBlobsDAOTest.java              | 34 ++++++++++++++++----
 3 files changed, 42 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/a2c7e989/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
----------------------------------------------------------------------
diff --git 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
index 176e5a4..1e0d12a 100644
--- 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
+++ 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
@@ -33,6 +33,7 @@ import 
org.apache.james.blob.objectstorage.swift.SwiftKeystone3ObjectStorage;
 import org.apache.james.blob.objectstorage.swift.SwiftTempAuthObjectStorage;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.options.CopyOptions;
+import org.jclouds.domain.Location;
 
 import com.github.fge.lambdas.Throwing;
 import com.google.common.base.Preconditions;
@@ -41,6 +42,7 @@ import com.google.common.hash.HashingInputStream;
 
 public class ObjectStorageBlobsDAO implements BlobStore {
     private static final InputStream EMPTY_STREAM = new 
ByteArrayInputStream(new byte[0]);
+    public static final Location DEFAULT_LOCATION = null;
 
 
     private final BlobId.Factory blobIdFactory;
@@ -67,6 +69,17 @@ public class ObjectStorageBlobsDAO implements BlobStore {
         return SwiftKeystone3ObjectStorage.daoBuilder(testConfig);
     }
 
+    public CompletableFuture<ContainerName> createContainer(ContainerName 
name) {
+        return CompletableFuture.supplyAsync(() -> 
blobStore.createContainerInLocation(DEFAULT_LOCATION,
+            name.value())).thenApply(created -> {
+            if (created) {
+                return name;
+            } else {
+                throw new ObjectStoreException("Unable to create container " + 
name.value());
+            }
+        });
+    }
+
     @Override
     public CompletableFuture<BlobId> save(byte[] data) {
         return save(new ByteArrayInputStream(data));

http://git-wip-us.apache.org/repos/asf/james-project/blob/a2c7e989/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOContract.java
----------------------------------------------------------------------
diff --git 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOContract.java
 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOContract.java
index a6cb4b4..36501f3 100644
--- 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOContract.java
+++ 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOContract.java
@@ -29,22 +29,17 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
-
 import org.apache.james.blob.api.BlobId;
-import org.jclouds.blobstore.BlobStore;
-import org.jclouds.domain.Location;
 
-public interface ObjectStorageBlobsDAOContract {
 
-    Location DEFAULT_LOCATION = null;
+public interface ObjectStorageBlobsDAOContract {
 
     ContainerName containerName();
 
     default void 
assertBlobsDAOCanStoreAndRetrieve(ObjectStorageBlobsDAOBuilder builder)
         throws InterruptedException, ExecutionException, TimeoutException {
-        BlobStore blobStore = builder.getSupplier().get();
-        blobStore.createContainerInLocation(DEFAULT_LOCATION, 
containerName().value());
         ObjectStorageBlobsDAO dao = builder.build();
+        dao.createContainer(containerName());
         byte[] bytes = "content".getBytes(StandardCharsets.UTF_8);
         CompletableFuture<BlobId> save = dao.save(bytes);
         InputStream inputStream = save.thenApply(dao::read).get(10, 
TimeUnit.SECONDS);

http://git-wip-us.apache.org/repos/asf/james-project/blob/a2c7e989/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java
----------------------------------------------------------------------
diff --git 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java
 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java
index 92eeed1..5dd3cbc 100644
--- 
a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java
+++ 
b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAOTest.java
@@ -19,12 +19,17 @@
 
 package org.apache.james.blob.objectstorage;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import java.util.UUID;
 
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.blob.api.BlobStoreContract;
 import org.apache.james.blob.api.HashBlobId;
+import org.apache.james.blob.api.ObjectStoreException;
 import org.apache.james.blob.objectstorage.swift.Credentials;
 import org.apache.james.blob.objectstorage.swift.Identity;
 import org.apache.james.blob.objectstorage.swift.PassHeaderName;
@@ -34,6 +39,7 @@ import 
org.apache.james.blob.objectstorage.swift.UserHeaderName;
 import org.apache.james.blob.objectstorage.swift.UserName;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 @ExtendWith(DockerSwiftExtension.class)
@@ -46,6 +52,7 @@ public class ObjectStorageBlobsDAOTest implements 
BlobStoreContract {
     private ContainerName containerName;
     private org.jclouds.blobstore.BlobStore blobStore;
     private SwiftTempAuthObjectStorage.Configuration testConfig;
+    private ObjectStorageBlobsDAO testee;
 
     @BeforeEach
     void setUp(DockerSwift dockerSwift) throws Exception {
@@ -57,12 +64,14 @@ public class ObjectStorageBlobsDAOTest implements 
BlobStoreContract {
             .tempAuthHeaderUserName(UserHeaderName.of("X-Storage-User"))
             .tempAuthHeaderPassName(PassHeaderName.of("X-Storage-Pass"))
             .build();
+        BlobId.Factory blobIdFactory = blobIdFactory();
         blobStore = ObjectStorageBlobsDAO
             .builder(testConfig)
             .container(containerName)
-            .blobIdFactory(new HashBlobId.Factory())
+            .blobIdFactory(blobIdFactory)
             .getSupplier().get();
-        blobStore.createContainerInLocation(null, containerName.value());
+        testee = new ObjectStorageBlobsDAO(containerName, blobIdFactory, 
blobStore);
+        testee.createContainer(containerName);
     }
 
     @AfterEach
@@ -73,16 +82,27 @@ public class ObjectStorageBlobsDAOTest implements 
BlobStoreContract {
 
     @Override
     public BlobStore testee() {
-        return ObjectStorageBlobsDAO
-            .builder(testConfig)
-            .container(containerName)
-            .blobIdFactory(new HashBlobId.Factory())
-            .build();
+        return testee;
     }
 
     @Override
     public BlobId.Factory blobIdFactory() {
         return new HashBlobId.Factory();
     }
+
+    @Test
+    void canCreateContainer() throws Exception {
+        ContainerName containerName = 
ContainerName.of(UUID.randomUUID().toString());
+        testee.createContainer(containerName).get();
+        assertThat(blobStore.containerExists(containerName.value())).isTrue();
+    }
+    @Test
+    void failsWithRuntimeExceptionOnCreateContainerTwice() throws Exception {
+        ContainerName containerName = 
ContainerName.of(UUID.randomUUID().toString());
+        testee.createContainer(containerName).get();
+        assertThatThrownBy(() -> testee.createContainer(containerName).get())
+            .hasCauseInstanceOf(ObjectStoreException.class)
+            .hasMessageContaining("Unable to create container");
+    }
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to