You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2018/03/14 02:20:38 UTC

[1/6] james-project git commit: JAMES-2347 Demonstrate that IsOverQuota matcher is working in mailet pipeline

Repository: james-project
Updated Branches:
  refs/heads/master c105847d0 -> 43d732497


JAMES-2347 Demonstrate that IsOverQuota matcher is working in mailet pipeline


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

Branch: refs/heads/master
Commit: 142438a52e7c80b1f248bcaf1842afdc88b7b316
Parents: c105847
Author: Antoine Duprat <ad...@linagora.com>
Authored: Mon Mar 12 16:03:29 2018 +0100
Committer: benwa <bt...@linagora.com>
Committed: Wed Mar 14 09:05:15 2018 +0700

----------------------------------------------------------------------
 .../mailets/IsOverQuotaMatcherTest.java         | 133 +++++++++++++++++++
 1 file changed, 133 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/142438a5/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
new file mode 100644
index 0000000..7e514f9
--- /dev/null
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
@@ -0,0 +1,133 @@
+/****************************************************************
+ * 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.transport.mailets;
+
+import static org.apache.james.mailets.configuration.Constants.DEFAULT_DOMAIN;
+import static org.apache.james.mailets.configuration.Constants.IMAP_PORT;
+import static org.apache.james.mailets.configuration.Constants.LOCALHOST_IP;
+import static org.apache.james.mailets.configuration.Constants.PASSWORD;
+import static org.apache.james.mailets.configuration.Constants.SMTP_PORT;
+import static org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.MemoryJamesServerMain;
+import org.apache.james.mailbox.quota.QuotaSize;
+import org.apache.james.mailbox.store.mail.model.SerializableQuotaValue;
+import org.apache.james.mailbox.store.probe.QuotaProbe;
+import org.apache.james.mailets.TemporaryJamesServer;
+import org.apache.james.mailets.configuration.CommonProcessors;
+import org.apache.james.mailets.configuration.MailetConfiguration;
+import org.apache.james.mailets.configuration.MailetContainer;
+import org.apache.james.mailets.configuration.ProcessorConfiguration;
+import org.apache.james.modules.QuotaProbesImpl;
+import org.apache.james.probe.DataProbe;
+import org.apache.james.transport.matchers.IsOverQuota;
+import org.apache.james.utils.DataProbeImpl;
+import org.apache.james.utils.IMAPMessageReader;
+import org.apache.james.utils.SMTPMessageSender;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+public class IsOverQuotaMatcherTest {
+
+    private static final String FROM = "fromuser@" + DEFAULT_DOMAIN;
+    private static final String RECIPIENT = "touser@" + DEFAULT_DOMAIN;
+    private static final String BOUNCE_SENDER = "bounce.sender@" + DEFAULT_DOMAIN;
+
+    private static final String OVER_QUOTA_MESSAGE = "The recipient is over quota";
+    private static final String RECIPIENT_QUOTA_ROOT = "#private&" + RECIPIENT;
+    private static final QuotaSize SMALL_SIZE = QuotaSize.size(1);
+    private static final QuotaSize LARGE_SIZE = QuotaSize.size(10000);
+
+    @Rule
+    public TemporaryFolder temporaryFolder = new TemporaryFolder();
+    @Rule
+    public IMAPMessageReader imapMessageReader = new IMAPMessageReader();
+    @Rule
+    public SMTPMessageSender messageSender = new SMTPMessageSender(DEFAULT_DOMAIN);
+    
+    private TemporaryJamesServer jamesServer;
+
+    @Before
+    public void setup() throws Exception {
+        MailetContainer.Builder mailetContainer = TemporaryJamesServer.DEFAULT_MAILET_CONTAINER_CONFIGURATION
+                .putProcessor(ProcessorConfiguration.transport()
+                        .addMailet(MailetConfiguration.builder()
+                                .matcher(IsOverQuota.class)
+                                .mailet(Bounce.class)
+                                .addProperty("sender", BOUNCE_SENDER)
+                                .addProperty("message", OVER_QUOTA_MESSAGE)
+                                .addProperty("passThrough", "false"))
+                        .addMailetsFrom(CommonProcessors.transport())
+                        .build());
+
+        jamesServer = TemporaryJamesServer.builder()
+            .withBase(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
+            .withMailetContainer(mailetContainer)
+            .build(temporaryFolder);
+
+        DataProbe dataProbe = jamesServer.getProbe(DataProbeImpl.class);
+        dataProbe.addDomain(DEFAULT_DOMAIN);
+        dataProbe.addUser(FROM, PASSWORD);
+        dataProbe.addUser(RECIPIENT, PASSWORD);
+        dataProbe.addUser(BOUNCE_SENDER, PASSWORD);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        jamesServer.shutdown();
+    }
+
+    @Test
+    public void aBounceMessageShouldBeSentToTheSenderWhenRecipientAsReachedHisQuota() throws Exception {
+        QuotaProbe quotaProbes = jamesServer.getProbe(QuotaProbesImpl.class);
+        quotaProbes.setMaxStorage(RECIPIENT_QUOTA_ROOT, new SerializableQuotaValue<>(SMALL_SIZE));
+
+        messageSender.connect(LOCALHOST_IP, SMTP_PORT)
+            .sendMessage(FROM, RECIPIENT)
+            .awaitSent(awaitAtMostOneMinute);
+
+        IMAPMessageReader messageReader = imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
+            .login(FROM, PASSWORD)
+            .select(IMAPMessageReader.INBOX)
+            .awaitMessage(awaitAtMostOneMinute);
+
+        String bounceMessage = messageReader.readFirstMessage();
+        assertThat(bounceMessage).contains(OVER_QUOTA_MESSAGE);
+    }
+
+    @Test
+    public void aBounceMessageShouldBeSentToTheRecipientWhenRecipientQuotaIsNotExceeded() throws Exception {
+        QuotaProbe quotaProbes = jamesServer.getProbe(QuotaProbesImpl.class);
+        quotaProbes.setMaxStorage(RECIPIENT_QUOTA_ROOT, new SerializableQuotaValue<>(LARGE_SIZE));
+
+        messageSender.connect(LOCALHOST_IP, SMTP_PORT)
+            .sendMessage(FROM, RECIPIENT)
+            .awaitSent(awaitAtMostOneMinute);
+
+        imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
+            .login(RECIPIENT, PASSWORD)
+            .select(IMAPMessageReader.INBOX)
+            .awaitMessage(awaitAtMostOneMinute);
+    }
+}


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


[3/6] james-project git commit: JAMES-2347 Bind users quota routes

Posted by bt...@apache.org.
JAMES-2347 Bind users quota routes


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

Branch: refs/heads/master
Commit: ee22e0f08ff48353a0c13cad119fdd47f9c675a4
Parents: 0769dba
Author: benwa <bt...@linagora.com>
Authored: Tue Mar 13 10:15:33 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Mar 14 09:10:10 2018 +0700

----------------------------------------------------------------------
 .../java/org/apache/james/modules/server/MailboxRoutesModule.java | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/ee22e0f0/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java
index d6431dc..00cea90 100644
--- a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java
+++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java
@@ -23,6 +23,7 @@ import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.jackson.QuotaModule;
 import org.apache.james.webadmin.routes.GlobalQuotaRoutes;
 import org.apache.james.webadmin.routes.UserMailboxesRoutes;
+import org.apache.james.webadmin.routes.UserQuotaRoutes;
 import org.apache.james.webadmin.utils.JsonTransformerModule;
 
 import com.google.inject.AbstractModule;
@@ -35,6 +36,8 @@ public class MailboxRoutesModule extends AbstractModule {
         Multibinder<Routes> routesMultibinder = Multibinder.newSetBinder(binder(), Routes.class);
         routesMultibinder.addBinding().to(UserMailboxesRoutes.class);
         routesMultibinder.addBinding().to(GlobalQuotaRoutes.class);
+        routesMultibinder.addBinding().to(UserQuotaRoutes.class);
+
         Multibinder<JsonTransformerModule> jsonTransformerModuleMultibinder = Multibinder.newSetBinder(binder(), JsonTransformerModule.class);
         jsonTransformerModuleMultibinder.addBinding().to(QuotaModule.class);
     }


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


[2/6] james-project git commit: JAMES-2347 Solve some intelliJ warnings in UserQuotaRoutesTest

Posted by bt...@apache.org.
JAMES-2347 Solve some intelliJ warnings in UserQuotaRoutesTest


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

Branch: refs/heads/master
Commit: e235572c3b77f5da3ea81b1eb7d503a9bea8c2ac
Parents: 142438a
Author: benwa <bt...@linagora.com>
Authored: Tue Mar 13 10:12:09 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Mar 14 09:06:02 2018 +0700

----------------------------------------------------------------------
 .../webadmin/routes/UserQuotaRoutesTest.java    | 43 ++++++++++----------
 1 file changed, 22 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/e235572c/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
index fa3dd6e..4a9b82d 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
@@ -35,7 +35,6 @@ import org.apache.james.mailbox.quota.QuotaSize;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.metrics.api.NoopMetricFactory;
-import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.james.user.memory.MemoryUsersRepository;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.WebAdminUtils;
@@ -65,7 +64,6 @@ public class UserQuotaRoutesTest {
     private static final String SIZE = "size";
     private WebAdminServer webAdminServer;
     private InMemoryPerUserMaxQuotaManager maxQuotaManager;
-    private MemoryUsersRepository usersRepository;
     private DefaultUserQuotaRootResolver userQuotaRootResolver;
 
     @Before
@@ -74,7 +72,7 @@ public class UserQuotaRoutesTest {
         MemoryDomainList memoryDomainList = new MemoryDomainList(new InMemoryDNSService());
         memoryDomainList.setAutoDetect(false);
         memoryDomainList.addDomain(PERDU_COM);
-        usersRepository = MemoryUsersRepository.withVirtualHosting();
+        MemoryUsersRepository usersRepository = MemoryUsersRepository.withVirtualHosting();
         usersRepository.setDomainList(memoryDomainList);
         usersRepository.addUser(BOB.asString(), PASSWORD);
         MailboxSessionMapperFactory factory = null;
@@ -107,7 +105,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void getCountShouldReturnNoContentByDefault() throws UsersRepositoryException {
+    public void getCountShouldReturnNoContentByDefault() {
         given()
             .get(QUOTA_USERS + "/" + BOB.asString() + "/" + COUNT)
         .then()
@@ -115,7 +113,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void getCountShouldReturnStoredValue() throws Exception {
+    public void getCountShouldReturnStoredValue() {
         int value = 42;
         maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(value));
 
@@ -143,7 +141,7 @@ public class UserQuotaRoutesTest {
 
 
     @Test
-    public void putCountShouldRejectInvalid() throws Exception {
+    public void putCountShouldRejectInvalid() {
         Map<String, Object> errors = given()
             .body("invalid")
             .put(QUOTA_USERS + "/" + BOB.asString() + "/" + COUNT)
@@ -175,7 +173,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void putCountShouldRejectNegativeOtherThanMinusOne() throws Exception {
+    public void putCountShouldRejectNegativeOtherThanMinusOne() {
         Map<String, Object> errors = given()
             .body("-2")
             .put(QUOTA_USERS + "/" + BOB.asString() + "/" + COUNT)
@@ -246,7 +244,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void getSizeShouldReturnNoContentByDefault() throws UsersRepositoryException {
+    public void getSizeShouldReturnNoContentByDefault() {
         when()
             .get(QUOTA_USERS + "/" + BOB.asString() + "/" + SIZE)
         .then()
@@ -254,7 +252,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void getSizeShouldReturnStoredValue() throws Exception {
+    public void getSizeShouldReturnStoredValue() {
         long value = 42;
         maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(value));
 
@@ -272,7 +270,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void putSizeShouldRejectInvalid() throws Exception {
+    public void putSizeShouldRejectInvalid() {
         Map<String, Object> errors = given()
             .body("invalid")
             .put(QUOTA_USERS + "/" + BOB.asString() + "/" + SIZE)
@@ -292,7 +290,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void putSizeShouldReturnNotFoundWhenUserDoesntExist() throws Exception {
+    public void putSizeShouldReturnNotFoundWhenUserDoesntExist() {
         given()
             .body("123")
         .when()
@@ -310,11 +308,12 @@ public class UserQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB))).contains(QuotaSize.unlimited());
+        assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
+            .contains(QuotaSize.unlimited());
     }
 
     @Test
-    public void putSizeShouldRejectNegativeOtherThanMinusOne() throws Exception {
+    public void putSizeShouldRejectNegativeOtherThanMinusOne() {
         Map<String, Object> errors = given()
             .body("-2")
             .put(QUOTA_USERS + "/" + BOB.asString() + "/" + SIZE)
@@ -345,7 +344,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void deleteSizeShouldReturnNotFoundWhenUserDoesntExist() throws Exception {
+    public void deleteSizeShouldReturnNotFoundWhenUserDoesntExist() {
         when()
             .delete(QUOTA_USERS + "/" + JOE.asString() + "/" + SIZE)
         .then()
@@ -365,7 +364,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void getQuotaShouldReturnNotFoundWhenUserDoesntExist() throws Exception {
+    public void getQuotaShouldReturnNotFoundWhenUserDoesntExist() {
         when()
             .get(QUOTA_USERS + "/" + JOE.asString())
         .then()
@@ -443,7 +442,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void getQuotaShouldReturnBothEmptyWhenDefaultValues() throws Exception {
+    public void getQuotaShouldReturnBothEmptyWhenDefaultValues() {
         JsonPath jsonPath =
             given()
                 .get(QUOTA_USERS + "/" + BOB.asString())
@@ -458,7 +457,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void getQuotaShouldReturnSizeWhenNoCount() throws Exception {
+    public void getQuotaShouldReturnSizeWhenNoCount() {
         int maxStorage = 42;
         maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(maxStorage));
 
@@ -476,7 +475,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void getQuotaShouldReturnBothWhenNoSize() throws Exception {
+    public void getQuotaShouldReturnBothWhenNoSize() {
         int maxMessage = 42;
         maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(maxMessage));
 
@@ -495,7 +494,7 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
-    public void putQuotaShouldReturnNotFoundWhenUserDoesntExist() throws Exception {
+    public void putQuotaShouldReturnNotFoundWhenUserDoesntExist() {
         when()
             .put(QUOTA_USERS + "/" + JOE.asString())
         .then()
@@ -510,8 +509,10 @@ public class UserQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB))).contains(QuotaCount.count(52));
-        assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB))).contains(QuotaSize.size(42));
+        assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB)))
+            .contains(QuotaCount.count(52));
+        assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
+            .contains(QuotaSize.size(42));
     }
 
     @Test


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


[6/6] james-project git commit: JAMES-2347 Users can be escaped in UsersQuotaRoutes

Posted by bt...@apache.org.
JAMES-2347 Users can be escaped in UsersQuotaRoutes

RestAssured testing library tend to escape '@'.


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

Branch: refs/heads/master
Commit: 0769dba5ac1d1b5daa4233129f1a3d4eac95ab82
Parents: e235572
Author: benwa <bt...@linagora.com>
Authored: Tue Mar 13 10:15:05 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Mar 14 09:10:10 2018 +0700

----------------------------------------------------------------------
 .../james/webadmin/routes/UserQuotaRoutes.java  |  9 +++-
 .../webadmin/routes/UserQuotaRoutesTest.java    | 54 ++++++++++++++++++++
 2 files changed, 61 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/0769dba5/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
index a5fff50..d9e2953 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
@@ -19,6 +19,9 @@
 
 package org.apache.james.webadmin.routes;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -248,8 +251,10 @@ public class UserQuotaRoutes implements Routes {
         }, jsonTransformer);
     }
 
-    private User checkUserExist(Request request) throws UsersRepositoryException {
-        String user = request.params(USER);
+    private User checkUserExist(Request request) throws UsersRepositoryException, UnsupportedEncodingException {
+        String user = URLDecoder.decode(request.params(USER),
+            StandardCharsets.UTF_8.displayName());
+
         if (!usersRepository.contains(user)) {
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.NOT_FOUND_404)

http://git-wip-us.apache.org/repos/asf/james-project/blob/0769dba5/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
index 4a9b82d..0d84759 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
@@ -58,6 +58,7 @@ public class UserQuotaRoutesTest {
     private static final String QUOTA_USERS = "/quota/users";
     private static final String PERDU_COM = "perdu.com";
     private static final User BOB = User.fromUsername("bob@" + PERDU_COM);
+    private static final User ESCAPED_BOB = User.fromUsername("bob%40" + PERDU_COM);
     private static final User JOE = User.fromUsername("joe@" + PERDU_COM);
     private static final String PASSWORD = "secret";
     private static final String COUNT = "count";
@@ -139,6 +140,25 @@ public class UserQuotaRoutesTest {
             .statusCode(HttpStatus.NOT_FOUND_404);
     }
 
+    @Test
+    public void putCountShouldAcceptEscapedUsers() {
+        given()
+            .body("35")
+        .when()
+            .put(QUOTA_USERS + "/" + ESCAPED_BOB.asString() + "/" + COUNT)
+        .then()
+            .statusCode(HttpStatus.NO_CONTENT_204);
+    }
+
+    @Test
+    public void putCountSizeAcceptEscapedUsers() {
+        given()
+            .body("36")
+        .when()
+            .put(QUOTA_USERS + "/" + ESCAPED_BOB.asString() + "/" + SIZE)
+        .then()
+            .statusCode(HttpStatus.NO_CONTENT_204);
+    }
 
     @Test
     public void putCountShouldRejectInvalid() {
@@ -442,6 +462,26 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
+    public void getQuotaShouldReturnBothWhenValueSpecifiedAndEscaped() {
+        int maxStorage = 42;
+        int maxMessage = 52;
+        maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(maxStorage));
+        maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(maxMessage));
+
+        JsonPath jsonPath =
+            given()
+                .get(QUOTA_USERS + "/" + ESCAPED_BOB.asString())
+            .then()
+                .statusCode(HttpStatus.OK_200)
+                .contentType(ContentType.JSON)
+                .extract()
+                .jsonPath();
+
+        assertThat(jsonPath.getLong("user." + SIZE)).isEqualTo(maxStorage);
+        assertThat(jsonPath.getLong("user." + COUNT)).isEqualTo(maxMessage);
+    }
+
+    @Test
     public void getQuotaShouldReturnBothEmptyWhenDefaultValues() {
         JsonPath jsonPath =
             given()
@@ -516,6 +556,20 @@ public class UserQuotaRoutesTest {
     }
 
     @Test
+    public void putQuotaShouldUpdateBothQuotaWhenEscaped() throws Exception {
+        given()
+            .body("{\"count\":52,\"size\":42}")
+            .put(QUOTA_USERS + "/" + ESCAPED_BOB.asString())
+        .then()
+            .statusCode(HttpStatus.NO_CONTENT_204);
+
+        assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB)))
+            .contains(QuotaCount.count(52));
+        assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
+            .contains(QuotaSize.size(42));
+    }
+
+    @Test
     public void putQuotaShouldBeAbleToRemoveBothQuota() throws Exception {
         given()
             .body("{\"count\":null,\"count\":null}")


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


[5/6] james-project git commit: JAMES-2347 Add integration tests for Count quotas

Posted by bt...@apache.org.
JAMES-2347 Add integration tests for Count quotas


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

Branch: refs/heads/master
Commit: 43d7324975fddf30b0c4bfe16fa126cfeb569d59
Parents: dc43430
Author: benwa <bt...@linagora.com>
Authored: Tue Mar 13 10:20:15 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Mar 14 09:10:10 2018 +0700

----------------------------------------------------------------------
 .../mailets/IsOverQuotaMatcherTest.java         | 46 +++++++++++++++++---
 1 file changed, 41 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/43d73249/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
index 213df73..493fff9 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
@@ -29,6 +29,7 @@ import static org.apache.james.mailets.configuration.Constants.awaitAtMostOneMin
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.MemoryJamesServerMain;
+import org.apache.james.mailbox.quota.QuotaCount;
 import org.apache.james.mailbox.quota.QuotaSize;
 import org.apache.james.mailets.TemporaryJamesServer;
 import org.apache.james.mailets.configuration.CommonProcessors;
@@ -57,9 +58,10 @@ public class IsOverQuotaMatcherTest {
     private static final String BOUNCE_SENDER = "bounce.sender@" + DEFAULT_DOMAIN;
 
     private static final String OVER_QUOTA_MESSAGE = "The recipient is over quota";
-    private static final String RECIPIENT_QUOTA_ROOT = "#private&" + RECIPIENT;
     private static final QuotaSize SMALL_SIZE = QuotaSize.size(1);
     private static final QuotaSize LARGE_SIZE = QuotaSize.size(10000);
+    private static final QuotaCount SMALL_COUNT = QuotaCount.count(0);
+    private static final QuotaCount LARGE_COUNT = QuotaCount.count(100);
 
     @Rule
     public TemporaryFolder temporaryFolder = new TemporaryFolder();
@@ -81,8 +83,7 @@ public class IsOverQuotaMatcherTest {
                                 .addProperty("sender", BOUNCE_SENDER)
                                 .addProperty("message", OVER_QUOTA_MESSAGE)
                                 .addProperty("passThrough", "false"))
-                        .addMailetsFrom(CommonProcessors.transport())
-                        .build());
+                        .addMailetsFrom(CommonProcessors.transport()));
 
         jamesServer = TemporaryJamesServer.builder()
             .withBase(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
@@ -107,7 +108,7 @@ public class IsOverQuotaMatcherTest {
     }
 
     @Test
-    public void aBounceMessageShouldBeSentToTheSenderWhenRecipientAsReachedHisQuota() throws Exception {
+    public void aBounceMessageShouldBeSentToTheSenderWhenRecipientAsReachedHisSizeQuota() throws Exception {
         webAdminApi.given()
             .body(SMALL_SIZE.asLong())
             .put("/quota/users/" + RECIPIENT + "/size");
@@ -126,7 +127,7 @@ public class IsOverQuotaMatcherTest {
     }
 
     @Test
-    public void aBounceMessageShouldBeSentToTheRecipientWhenRecipientQuotaIsNotExceeded() throws Exception {
+    public void aBounceMessageShouldBeSentToTheRecipientWhenRecipientSizeQuotaIsNotExceeded() throws Exception {
         webAdminApi.given()
             .body(LARGE_SIZE.asLong())
             .put("/quota/users/" + RECIPIENT + "/size");
@@ -140,4 +141,39 @@ public class IsOverQuotaMatcherTest {
             .select(IMAPMessageReader.INBOX)
             .awaitMessage(awaitAtMostOneMinute);
     }
+
+    @Test
+    public void aBounceMessageShouldBeSentToTheSenderWhenRecipientAsReachedHisCountQuota() throws Exception {
+        webAdminApi.given()
+            .body(SMALL_COUNT.asLong())
+            .put("/quota/users/" + RECIPIENT + "/count");
+
+        messageSender.connect(LOCALHOST_IP, SMTP_PORT)
+            .sendMessage(FROM, RECIPIENT)
+            .awaitSent(awaitAtMostOneMinute);
+
+        IMAPMessageReader messageReader = imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
+            .login(FROM, PASSWORD)
+            .select(IMAPMessageReader.INBOX)
+            .awaitMessage(awaitAtMostOneMinute);
+
+        String bounceMessage = messageReader.readFirstMessage();
+        assertThat(bounceMessage).contains(OVER_QUOTA_MESSAGE);
+    }
+
+    @Test
+    public void aBounceMessageShouldBeSentToTheRecipientWhenRecipientCountQuotaIsNotExceeded() throws Exception {
+        webAdminApi.given()
+            .body(LARGE_COUNT.asLong())
+            .put("/quota/users/" + RECIPIENT + "/count");
+
+        messageSender.connect(LOCALHOST_IP, SMTP_PORT)
+            .sendMessage(FROM, RECIPIENT)
+            .awaitSent(awaitAtMostOneMinute);
+
+        imapMessageReader.connect(LOCALHOST_IP, IMAP_PORT)
+            .login(RECIPIENT, PASSWORD)
+            .select(IMAPMessageReader.INBOX)
+            .awaitMessage(awaitAtMostOneMinute);
+    }
 }


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


[4/6] james-project git commit: JAMES-2347 Use WebAdmin to set quotas in integration tests

Posted by bt...@apache.org.
JAMES-2347 Use WebAdmin to set quotas in integration tests

This strengthen the integration test to match actual scenario and not rely on internal tools.


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

Branch: refs/heads/master
Commit: dc434304d73dde4a7f7c8a34018a1d3edb520dd9
Parents: ee22e0f
Author: benwa <bt...@linagora.com>
Authored: Tue Mar 13 10:17:38 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Mar 14 09:10:10 2018 +0700

----------------------------------------------------------------------
 .../mailets/IsOverQuotaMatcherTest.java         | 26 ++++++++++++++------
 1 file changed, 18 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/dc434304/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
index 7e514f9..213df73 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.transport.mailets;
 
+import static com.jayway.restassured.RestAssured.given;
 import static org.apache.james.mailets.configuration.Constants.DEFAULT_DOMAIN;
 import static org.apache.james.mailets.configuration.Constants.IMAP_PORT;
 import static org.apache.james.mailets.configuration.Constants.LOCALHOST_IP;
@@ -29,25 +30,26 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.MemoryJamesServerMain;
 import org.apache.james.mailbox.quota.QuotaSize;
-import org.apache.james.mailbox.store.mail.model.SerializableQuotaValue;
-import org.apache.james.mailbox.store.probe.QuotaProbe;
 import org.apache.james.mailets.TemporaryJamesServer;
 import org.apache.james.mailets.configuration.CommonProcessors;
 import org.apache.james.mailets.configuration.MailetConfiguration;
 import org.apache.james.mailets.configuration.MailetContainer;
 import org.apache.james.mailets.configuration.ProcessorConfiguration;
-import org.apache.james.modules.QuotaProbesImpl;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.transport.matchers.IsOverQuota;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
+import org.apache.james.utils.WebAdminGuiceProbe;
+import org.apache.james.webadmin.WebAdminUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
+import com.jayway.restassured.specification.RequestSpecification;
+
 public class IsOverQuotaMatcherTest {
 
     private static final String FROM = "fromuser@" + DEFAULT_DOMAIN;
@@ -67,6 +69,7 @@ public class IsOverQuotaMatcherTest {
     public SMTPMessageSender messageSender = new SMTPMessageSender(DEFAULT_DOMAIN);
     
     private TemporaryJamesServer jamesServer;
+    private RequestSpecification webAdminApi;
 
     @Before
     public void setup() throws Exception {
@@ -86,6 +89,11 @@ public class IsOverQuotaMatcherTest {
             .withMailetContainer(mailetContainer)
             .build(temporaryFolder);
 
+        WebAdminGuiceProbe webAdminGuiceProbe = jamesServer.getProbe(WebAdminGuiceProbe.class);
+        webAdminGuiceProbe.await();
+        webAdminApi = given()
+            .spec(WebAdminUtils.buildRequestSpecification(webAdminGuiceProbe.getWebAdminPort()).build());
+
         DataProbe dataProbe = jamesServer.getProbe(DataProbeImpl.class);
         dataProbe.addDomain(DEFAULT_DOMAIN);
         dataProbe.addUser(FROM, PASSWORD);
@@ -94,14 +102,15 @@ public class IsOverQuotaMatcherTest {
     }
 
     @After
-    public void tearDown() throws Exception {
+    public void tearDown() {
         jamesServer.shutdown();
     }
 
     @Test
     public void aBounceMessageShouldBeSentToTheSenderWhenRecipientAsReachedHisQuota() throws Exception {
-        QuotaProbe quotaProbes = jamesServer.getProbe(QuotaProbesImpl.class);
-        quotaProbes.setMaxStorage(RECIPIENT_QUOTA_ROOT, new SerializableQuotaValue<>(SMALL_SIZE));
+        webAdminApi.given()
+            .body(SMALL_SIZE.asLong())
+            .put("/quota/users/" + RECIPIENT + "/size");
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .sendMessage(FROM, RECIPIENT)
@@ -118,8 +127,9 @@ public class IsOverQuotaMatcherTest {
 
     @Test
     public void aBounceMessageShouldBeSentToTheRecipientWhenRecipientQuotaIsNotExceeded() throws Exception {
-        QuotaProbe quotaProbes = jamesServer.getProbe(QuotaProbesImpl.class);
-        quotaProbes.setMaxStorage(RECIPIENT_QUOTA_ROOT, new SerializableQuotaValue<>(LARGE_SIZE));
+        webAdminApi.given()
+            .body(LARGE_SIZE.asLong())
+            .put("/quota/users/" + RECIPIENT + "/size");
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .sendMessage(FROM, RECIPIENT)


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