This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 1a7e0588d24a86728dd04289c899fead15c78355 Author: Rene Cordier <rcord...@linagora.com> AuthorDate: Mon Jul 1 10:55:21 2019 +0700 JAMES-2806 Add deleteBucket implementation for memory and its contract --- .../james/blob/api/BucketBlobStoreContract.java | 36 ++++++++++++++++++++++ .../apache/james/blob/memory/MemoryBlobStore.java | 11 ++++--- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreContract.java index 4655bb0..d52d703 100644 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreContract.java +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BucketBlobStoreContract.java @@ -20,6 +20,7 @@ package org.apache.james.blob.api; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.io.ByteArrayInputStream; @@ -39,6 +40,30 @@ public interface BucketBlobStoreContract { BlobId.Factory blobIdFactory(); @Test + default void deleteBucketShouldThrowWhenNullBucketName() { + assertThatThrownBy(() -> testee().deleteBucket(null).block()) + .isInstanceOf(NullPointerException.class); + } + + @Test + default void deleteBucketShouldDeleteExistingBucketWithItsData() { + BlobId blobId = testee().save(CUSTOM, SHORT_BYTEARRAY).block(); + testee().deleteBucket(CUSTOM).block(); + + assertThatThrownBy(() -> testee().read(CUSTOM, blobId)) + .isInstanceOf(ObjectStoreException.class); + } + + @Test + default void deleteBucketShouldBeIdempotent(){ + testee().save(CUSTOM, SHORT_BYTEARRAY).block(); + testee().deleteBucket(CUSTOM).block(); + + assertThatCode(() -> testee().deleteBucket(CUSTOM).block()) + .doesNotThrowAnyException(); + } + + @Test default void saveBytesShouldThrowWhenNullBucketName() { assertThatThrownBy(() -> testee().save(null, SHORT_BYTEARRAY).block()) .isInstanceOf(NullPointerException.class); @@ -103,4 +128,15 @@ public interface BucketBlobStoreContract { .operationCount(10) .runSuccessfullyWithin(Duration.ofMinutes(1)); } + + @Test + default void deleteBucketConcurrentlyShouldNotFail() throws Exception { + testee().save(CUSTOM, SHORT_BYTEARRAY).block(); + + ConcurrentTestRunner.builder() + .operation(((threadNumber, step) -> testee().deleteBucket(CUSTOM).block())) + .threadCount(10) + .operationCount(10) + .runSuccessfullyWithin(Duration.ofMinutes(1)); + } } diff --git a/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java b/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java index b7f907a..812ea3d 100644 --- a/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java +++ b/server/blob/blob-memory/src/main/java/org/apache/james/blob/memory/MemoryBlobStore.java @@ -27,7 +27,6 @@ import java.util.Optional; import javax.inject.Inject; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.NotImplementedException; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BucketName; @@ -35,10 +34,8 @@ import org.apache.james.blob.api.ObjectStoreException; import com.google.common.base.Preconditions; import com.google.common.collect.HashBasedTable; -import com.google.common.collect.ImmutableList; import com.google.common.collect.Table; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; public class MemoryBlobStore implements BlobStore { @@ -92,7 +89,13 @@ public class MemoryBlobStore implements BlobStore { @Override public Mono<Void> deleteBucket(BucketName bucketName) { - throw new NotImplementedException("not implemented"); + Preconditions.checkNotNull(bucketName); + + return Mono.fromRunnable(() -> { + synchronized (blobs) { + blobs.row(bucketName).clear(); + } + }); } private byte[] retrieveStoredValue(BucketName bucketName, BlobId blobId) { --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org