This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 7e8e2bea9d8b82d24b5624b43d67473a361b7e23 Author: Benoit Tellier <[email protected]> AuthorDate: Wed Jul 22 12:03:19 2020 +0700 JAMES-3314 Extract test enforcing content-based BlobId generation Some tests can be adapted to not rely on content based BlobId generation, others should be moved to a separated contract --- .../apache/james/blob/api/BlobStoreContract.java | 33 --------- .../blob/api/DeduplicationBlobStoreContract.java | 82 ++++++++++++++++++++++ .../james/blob/api/DeleteBlobStoreContract.java | 8 +-- .../blob/cassandra/CassandraBlobStoreTest.java | 3 +- .../james/blob/memory/MemoryBlobStoreTest.java | 4 +- .../ObjectStorageBlobStoreAWSCryptoTest.java | 3 +- .../ObjectStorageBlobStoreAWSNamespaceTest.java | 3 +- ...tStorageBlobStoreAWSPrefixAndNamespaceTest.java | 3 +- .../ObjectStorageBlobStoreAWSPrefixTest.java | 3 +- .../ObjectStorageBlobStoreAWSTest.java | 3 +- .../objectstorage/ObjectStorageBlobStoreTest.java | 3 +- 11 files changed, 102 insertions(+), 46 deletions(-) diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java index dc49969..b9f8e1b 100644 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/BlobStoreContract.java @@ -127,39 +127,6 @@ public interface BlobStoreContract extends DeleteBlobStoreContract, BucketBlobSt assertThat(new String(bytes, StandardCharsets.UTF_8)).isEmpty(); } - @ParameterizedTest - @MethodSource("storagePolicies") - default void saveShouldReturnBlobId(BlobStore.StoragePolicy storagePolicy) { - BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - - BlobId blobId = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, storagePolicy)).block(); - - assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); - } - - @ParameterizedTest - @MethodSource("storagePolicies") - default void saveShouldReturnBlobIdOfString(BlobStore.StoragePolicy storagePolicy) { - BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - - BlobId blobId = Mono.from(store.save(defaultBucketName, SHORT_STRING, storagePolicy)).block(); - - assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); - } - - @ParameterizedTest - @MethodSource("storagePolicies") - default void saveShouldReturnBlobIdOfInputStream(BlobStore.StoragePolicy storagePolicy) { - BlobStore store = testee(); - BucketName defaultBucketName = store.getDefaultBucketName(); - - BlobId blobId = Mono.from(store.save(defaultBucketName, new ByteArrayInputStream(SHORT_BYTEARRAY), storagePolicy)).block(); - - assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); - } - @Test default void readBytesShouldThrowWhenNoExisting() { BlobStore store = testee(); diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeduplicationBlobStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeduplicationBlobStoreContract.java new file mode 100644 index 0000000..b92e805 --- /dev/null +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeduplicationBlobStoreContract.java @@ -0,0 +1,82 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.blob.api; + +import static org.apache.james.blob.api.BlobStore.StoragePolicy.HIGH_PERFORMANCE; +import static org.apache.james.blob.api.BlobStore.StoragePolicy.LOW_COST; +import static org.apache.james.blob.api.BlobStore.StoragePolicy.SIZE_BASED; +import static org.apache.james.blob.api.BlobStoreContract.SHORT_BYTEARRAY; +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.ByteArrayInputStream; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import reactor.core.publisher.Mono; + +public interface DeduplicationBlobStoreContract { + static Stream<Arguments> storagePolicies() { + return Stream.of( + Arguments.arguments(LOW_COST), + Arguments.arguments(SIZE_BASED), + Arguments.arguments(HIGH_PERFORMANCE)); + } + String SHORT_STRING = "toto"; + + BlobStore testee(); + + BlobId.Factory blobIdFactory(); + + @ParameterizedTest + @MethodSource("storagePolicies") + default void saveShouldReturnBlobIdOfString(BlobStore.StoragePolicy storagePolicy) { + BlobStore store = testee(); + BucketName defaultBucketName = store.getDefaultBucketName(); + + BlobId blobId = Mono.from(store.save(defaultBucketName, SHORT_STRING, storagePolicy)).block(); + + assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); + } + + @ParameterizedTest + @MethodSource("storagePolicies") + default void saveShouldReturnBlobId(BlobStore.StoragePolicy storagePolicy) { + BlobStore store = testee(); + BucketName defaultBucketName = store.getDefaultBucketName(); + + BlobId blobId = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, storagePolicy)).block(); + + assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); + } + + @ParameterizedTest + @MethodSource("storagePolicies") + default void saveShouldReturnBlobIdOfInputStream(BlobStore.StoragePolicy storagePolicy) { + BlobStore store = testee(); + BucketName defaultBucketName = store.getDefaultBucketName(); + + BlobId blobId = Mono.from(store.save(defaultBucketName, new ByteArrayInputStream(SHORT_BYTEARRAY), storagePolicy)).block(); + + assertThat(blobId).isEqualTo(blobIdFactory().from("31f7a65e315586ac198bd798b6629ce4903d0899476d5741a9f32e2e521b6a66")); + } +} diff --git a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreContract.java b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreContract.java index a65362a..afc65f5 100644 --- a/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreContract.java +++ b/server/blob/blob-api/src/test/java/org/apache/james/blob/api/DeleteBlobStoreContract.java @@ -139,12 +139,12 @@ public interface DeleteBlobStoreContract { BlobStore store = testee(); BucketName defaultBucketName = store.getDefaultBucketName(); - Mono.from(store.save(CUSTOM, SHORT_BYTEARRAY, LOW_COST)).block(); - BlobId blobId = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, LOW_COST)).block(); + BlobId blobIdInCustomBucket = Mono.from(store.save(CUSTOM, SHORT_BYTEARRAY, LOW_COST)).block(); + BlobId blobIdInDefaultBucket = Mono.from(store.save(defaultBucketName, SHORT_BYTEARRAY, LOW_COST)).block(); - Mono.from(store.delete(defaultBucketName, blobId)).block(); + Mono.from(store.delete(defaultBucketName, blobIdInDefaultBucket)).block(); - InputStream read = store.read(CUSTOM, blobId); + InputStream read = store.read(CUSTOM, blobIdInCustomBucket); assertThat(read).hasSameContentAs(new ByteArrayInputStream(SHORT_BYTEARRAY)); } diff --git a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreTest.java b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreTest.java index 73b031a..56e6ac0 100644 --- a/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreTest.java +++ b/server/blob/blob-cassandra/src/test/java/org/apache/james/blob/cassandra/CassandraBlobStoreTest.java @@ -27,13 +27,14 @@ import org.apache.james.backends.cassandra.init.configuration.CassandraConfigura import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BucketName; +import org.apache.james.blob.api.DeduplicationBlobStoreContract; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.server.blob.deduplication.BlobStoreFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.RegisterExtension; -public class CassandraBlobStoreTest implements CassandraBlobStoreContract { +public class CassandraBlobStoreTest implements CassandraBlobStoreContract, DeduplicationBlobStoreContract { @RegisterExtension static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraBlobModule.MODULE); diff --git a/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java b/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java index a2ef603..f678066 100644 --- a/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java +++ b/server/blob/blob-memory/src/test/java/org/apache/james/blob/memory/MemoryBlobStoreTest.java @@ -21,13 +21,13 @@ package org.apache.james.blob.memory; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.DeduplicationBlobStoreContract; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.blob.api.MetricableBlobStoreContract; import org.junit.jupiter.api.BeforeEach; -public class MemoryBlobStoreTest implements MetricableBlobStoreContract { - +public class MemoryBlobStoreTest implements MetricableBlobStoreContract, DeduplicationBlobStoreContract { private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); private BlobStore blobStore; diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSCryptoTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSCryptoTest.java index aba7d13..3a23b22 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSCryptoTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSCryptoTest.java @@ -23,6 +23,7 @@ import java.io.IOException; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.DeduplicationBlobStoreContract; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.blob.api.MetricableBlobStoreContract; @@ -38,7 +39,7 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerAwsS3Extension.class) -public class ObjectStorageBlobStoreAWSCryptoTest implements MetricableBlobStoreContract { +public class ObjectStorageBlobStoreAWSCryptoTest implements MetricableBlobStoreContract, DeduplicationBlobStoreContract { private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); private static final Credentials PASSWORD = Credentials.of("testing"); private static final String SAMPLE_SALT = "c603a7327ee3dcbc031d8d34b1096c605feca5e1"; diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSNamespaceTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSNamespaceTest.java index fdf697b..9b17ceb 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSNamespaceTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSNamespaceTest.java @@ -24,6 +24,7 @@ import java.io.IOException; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BucketName; +import org.apache.james.blob.api.DeduplicationBlobStoreContract; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.blob.api.MetricableBlobStoreContract; @@ -37,7 +38,7 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerAwsS3Extension.class) -public class ObjectStorageBlobStoreAWSNamespaceTest implements MetricableBlobStoreContract { +public class ObjectStorageBlobStoreAWSNamespaceTest implements MetricableBlobStoreContract, DeduplicationBlobStoreContract { private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); private BlobStore testee; diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSPrefixAndNamespaceTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSPrefixAndNamespaceTest.java index aea96a0..4592820 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSPrefixAndNamespaceTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSPrefixAndNamespaceTest.java @@ -24,6 +24,7 @@ import java.io.IOException; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BucketName; +import org.apache.james.blob.api.DeduplicationBlobStoreContract; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.blob.api.MetricableBlobStoreContract; @@ -37,7 +38,7 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerAwsS3Extension.class) -public class ObjectStorageBlobStoreAWSPrefixAndNamespaceTest implements MetricableBlobStoreContract { +public class ObjectStorageBlobStoreAWSPrefixAndNamespaceTest implements MetricableBlobStoreContract, DeduplicationBlobStoreContract { private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); private BlobStore testee; diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSPrefixTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSPrefixTest.java index f82ed8f..3de820c 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSPrefixTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSPrefixTest.java @@ -23,6 +23,7 @@ import java.io.IOException; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.DeduplicationBlobStoreContract; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.blob.api.MetricableBlobStoreContract; @@ -36,7 +37,7 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerAwsS3Extension.class) -public class ObjectStorageBlobStoreAWSPrefixTest implements MetricableBlobStoreContract { +public class ObjectStorageBlobStoreAWSPrefixTest implements MetricableBlobStoreContract, DeduplicationBlobStoreContract { private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); private BlobStore testee; diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSTest.java index 6af3fd3..1e66e98 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreAWSTest.java @@ -23,6 +23,7 @@ import java.io.IOException; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; +import org.apache.james.blob.api.DeduplicationBlobStoreContract; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.blob.api.MetricableBlobStoreContract; @@ -36,7 +37,7 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(DockerAwsS3Extension.class) -public class ObjectStorageBlobStoreAWSTest implements MetricableBlobStoreContract { +public class ObjectStorageBlobStoreAWSTest implements MetricableBlobStoreContract, DeduplicationBlobStoreContract { private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory(); diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreTest.java index 10fb3c9..2505b39 100644 --- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreTest.java +++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/ObjectStorageBlobStoreTest.java @@ -31,6 +31,7 @@ import org.apache.commons.io.IOUtils; import org.apache.james.blob.api.BlobId; import org.apache.james.blob.api.BlobStore; import org.apache.james.blob.api.BucketName; +import org.apache.james.blob.api.DeduplicationBlobStoreContract; import org.apache.james.blob.api.HashBlobId; import org.apache.james.blob.api.MetricableBlobStore; import org.apache.james.blob.api.MetricableBlobStoreContract; @@ -56,7 +57,7 @@ import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; @ExtendWith(DockerSwiftExtension.class) -public class ObjectStorageBlobStoreTest implements MetricableBlobStoreContract { +public class ObjectStorageBlobStoreTest implements MetricableBlobStoreContract, DeduplicationBlobStoreContract { private static final String BIG_STRING = Strings.repeat("big blob content", 10 * 1024); private static final TenantName TENANT_NAME = TenantName.of("test"); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
