JAMES-2418 Provide MailRepositoryUrlStore API, contract and memory implementation
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/435a3277 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/435a3277 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/435a3277 Branch: refs/heads/master Commit: 435a3277012887a0bb9de886acb84497cc22ae1b Parents: b3d27f8 Author: benwa <btell...@linagora.com> Authored: Fri Jun 8 11:29:07 2018 +0700 Committer: benwa <btell...@linagora.com> Committed: Thu Jun 14 15:15:29 2018 +0700 ---------------------------------------------------------------------- server/data/data-api/pom.xml | 4 + .../api/MailRepositoryUrlStore.java | 31 +++++++ .../api/MailRepositoryUrlStoreContract.java | 86 ++++++++++++++++++++ server/data/data-memory/pom.xml | 24 +++++- .../memory/MemoryMailRepositoryUrlStore.java | 51 ++++++++++++ .../MemoryMailRepositoryUrlStoreExtension.java | 38 +++++++++ .../MemoryMailRepositoryUrlStoreTest.java | 28 +++++++ 7 files changed, 258 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/435a3277/server/data/data-api/pom.xml ---------------------------------------------------------------------- diff --git a/server/data/data-api/pom.xml b/server/data/data-api/pom.xml index 35a2572..7a58cfc 100644 --- a/server/data/data-api/pom.xml +++ b/server/data/data-api/pom.xml @@ -47,6 +47,10 @@ <artifactId>james-server-mailrepository-api</artifactId> </dependency> <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>james-server-util</artifactId> + </dependency> + <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/435a3277/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryUrlStore.java ---------------------------------------------------------------------- diff --git a/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryUrlStore.java b/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryUrlStore.java new file mode 100644 index 0000000..d16232a --- /dev/null +++ b/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryUrlStore.java @@ -0,0 +1,31 @@ +/**************************************************************** + * 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.mailrepository.api; + +import java.util.Set; + +public interface MailRepositoryUrlStore { + + void add(MailRepositoryUrl url); + + Set<MailRepositoryUrl> list(); + + boolean contains(MailRepositoryUrl url); +} http://git-wip-us.apache.org/repos/asf/james-project/blob/435a3277/server/data/data-api/src/test/java/org/apache/james/mailrepository/api/MailRepositoryUrlStoreContract.java ---------------------------------------------------------------------- diff --git a/server/data/data-api/src/test/java/org/apache/james/mailrepository/api/MailRepositoryUrlStoreContract.java b/server/data/data-api/src/test/java/org/apache/james/mailrepository/api/MailRepositoryUrlStoreContract.java new file mode 100644 index 0000000..38b7ee4 --- /dev/null +++ b/server/data/data-api/src/test/java/org/apache/james/mailrepository/api/MailRepositoryUrlStoreContract.java @@ -0,0 +1,86 @@ +/**************************************************************** + * 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.mailrepository.api; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.concurrent.TimeUnit; + +import org.apache.james.util.concurrency.ConcurrentTestRunner; +import org.junit.jupiter.api.Test; + +public interface MailRepositoryUrlStoreContract { + MailRepositoryUrl URL_1 = MailRepositoryUrl.from("proto://var/mail/toto"); + MailRepositoryUrl URL_2 = MailRepositoryUrl.from("proto://var/mail/tata"); + + @Test + default void retrieveUsedUrlsShouldBeEmptyByDefault(MailRepositoryUrlStore store) { + assertThat(store.list()).isEmpty(); + } + + @Test + default void retrieveUsedUrlsShouldReturnAddedUrl(MailRepositoryUrlStore store) { + store.add(URL_1); + + assertThat(store.list()).containsOnly(URL_1); + } + + @Test + default void retrieveUsedUrlsShouldNotReturnDuplicates(MailRepositoryUrlStore store) { + store.add(URL_1); + store.add(URL_1); + + assertThat(store.list()).containsOnly(URL_1); + } + + @Test + default void retrieveUsedUrlsShouldReturnAddedUrls(MailRepositoryUrlStore store) { + store.add(URL_1); + store.add(URL_2); + + assertThat(store.list()).containsOnly(URL_1, URL_2); + } + + @Test + default void containsShouldReturnFalseWhenNotExisting(MailRepositoryUrlStore store) { + assertThat(store.contains(URL_1)).isFalse(); + } + + @Test + default void containsShouldReturnTrueWhenExisting(MailRepositoryUrlStore store) { + store.add(URL_1); + + assertThat(store.contains(URL_1)).isTrue(); + } + + @Test + default void addShouldWorkInConcurrentEnvironment(MailRepositoryUrlStore store) throws Exception { + int operationCount = 10; + int threadCount = 10; + ConcurrentTestRunner testRunner = new ConcurrentTestRunner(threadCount, operationCount, + (a, b) -> store.add(MailRepositoryUrl.from("proto://" + a + "/" + b))) + .run(); + testRunner.awaitTermination(1, TimeUnit.MINUTES); + testRunner.assertNoException(); + + assertThat(store.list()).hasSize(threadCount * operationCount); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/435a3277/server/data/data-memory/pom.xml ---------------------------------------------------------------------- diff --git a/server/data/data-memory/pom.xml b/server/data/data-memory/pom.xml index 8e14a9e..6b4661b 100644 --- a/server/data/data-memory/pom.xml +++ b/server/data/data-memory/pom.xml @@ -39,6 +39,12 @@ </dependency> <dependency> <groupId>${project.groupId}</groupId> + <artifactId>james-server-data-api</artifactId> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> <artifactId>james-server-data-library</artifactId> </dependency> <dependency> @@ -69,13 +75,23 @@ <scope>test</scope> </dependency> <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> + <groupId>org.assertj</groupId> + <artifactId>assertj-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-engine</artifactId> <scope>test</scope> </dependency> <dependency> - <groupId>org.assertj</groupId> - <artifactId>assertj-core</artifactId> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-launcher</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.vintage</groupId> + <artifactId>junit-vintage-engine</artifactId> <scope>test</scope> </dependency> <dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/435a3277/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStore.java ---------------------------------------------------------------------- diff --git a/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStore.java b/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStore.java new file mode 100644 index 0000000..c6ab960 --- /dev/null +++ b/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStore.java @@ -0,0 +1,51 @@ +/**************************************************************** + * 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.mailrepository.memory; + +import java.util.Set; + +import org.apache.james.mailrepository.api.MailRepositoryUrl; +import org.apache.james.mailrepository.api.MailRepositoryUrlStore; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; + +public class MemoryMailRepositoryUrlStore implements MailRepositoryUrlStore { + private final Set<MailRepositoryUrl> urls; + + public MemoryMailRepositoryUrlStore() { + urls = Sets.newConcurrentHashSet(); + } + + @Override + public void add(MailRepositoryUrl url) { + urls.add(url); + } + + @Override + public Set<MailRepositoryUrl> list() { + return ImmutableSet.copyOf(urls); + } + + @Override + public boolean contains(MailRepositoryUrl url) { + return urls.contains(url); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/435a3277/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStoreExtension.java ---------------------------------------------------------------------- diff --git a/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStoreExtension.java b/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStoreExtension.java new file mode 100644 index 0000000..bb4cb10 --- /dev/null +++ b/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStoreExtension.java @@ -0,0 +1,38 @@ +/**************************************************************** + * 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.mailrepository.memory; + +import org.apache.james.mailrepository.api.MailRepositoryUrlStore; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; + +public class MemoryMailRepositoryUrlStoreExtension implements ParameterResolver { + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + return (parameterContext.getParameter().getType() == MailRepositoryUrlStore.class); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + return new MemoryMailRepositoryUrlStore(); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/435a3277/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStoreTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStoreTest.java b/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStoreTest.java new file mode 100644 index 0000000..047957f --- /dev/null +++ b/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryUrlStoreTest.java @@ -0,0 +1,28 @@ +/**************************************************************** + * 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.mailrepository.memory; + +import org.apache.james.mailrepository.api.MailRepositoryUrlStoreContract; +import org.junit.jupiter.api.extension.ExtendWith; + +@ExtendWith(MemoryMailRepositoryUrlStoreExtension.class) +public class MemoryMailRepositoryUrlStoreTest implements MailRepositoryUrlStoreContract { + +} --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org