This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit d2a68638e1c699d146ab6ad7f6aa9a1a94e349b9 Author: Jan-Eric Hellenberg <janeric.hellenb...@gmail.com> AuthorDate: Fri Jan 3 11:40:17 2025 +0100 James-4099 Introduce common superclass for mailbox path delimiter aware tests --- .../model/MailboxFolderDelimiterAwareTest.java | 71 ++++++++++++++++ .../james/imap/main/DefaultPathConverterTest.java | 4 +- .../imap/main/PathConverterBasicContract.java | 98 ++++++++-------------- 3 files changed, 109 insertions(+), 64 deletions(-) diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxFolderDelimiterAwareTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxFolderDelimiterAwareTest.java new file mode 100644 index 0000000000..858c515de9 --- /dev/null +++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxFolderDelimiterAwareTest.java @@ -0,0 +1,71 @@ +/**************************************************************** + * 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.mailbox.model; + +import org.apache.james.core.Username; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + +/** + * A base class for all tests that have to deal with the mailbox path delimiter. + * It will make sure to install the delimiter specified by the subclass during the test lifecycle and provides + * some utility methods for writing tests using the active delimiter. + * <p> + * NOTE: If you add a new folder delimiter, make sure to add tests for it in all classes extending this one! + */ +public abstract class MailboxFolderDelimiterAwareTest { + public abstract char folderDelimiter(); + + static char initialFolderDelimiter; + + @BeforeEach + public void setUp() { + initialFolderDelimiter = MailboxConstants.FOLDER_DELIMITER; + MailboxConstants.FOLDER_DELIMITER = folderDelimiter(); + } + + @AfterEach + public void tearDown() { + MailboxConstants.FOLDER_DELIMITER = initialFolderDelimiter; + } + + /** + * Adjust the given string assumed to contain path delimiter dots ('.') to an equivalent version for a different + * delimiter. + * For example, a string "folder.subfolder.subsubfolder" would be converted into "folder/subfolder/subsubfolder" when + * the active FOLDER_DELIMITER is '/'. + * This is used to test that all delimiters are handled correctly in a lot of different scenarios + * without having to manually assemble strings with the active path delimiter + * (like "folder" + MailboxConstants.FOLDER_DELIMITER + "subfolder" + MailboxConstants.FOLDER_DELIMITER + "subsubfolder") + * everywhere, which quickly becomes tedious. + */ + public static String adjustToActiveFolderDelimiter(String valueWithDots) { + // Because the test setup will configure the desired delimiter to be used, + // we do not need to pass it in manually here. + return valueWithDots.replace('.', MailboxConstants.FOLDER_DELIMITER); + } + + /** + * See {@link #adjustToActiveFolderDelimiter(String)}. + */ + public static Username adjustToActiveFolderDelimiter(Username username) { + return Username.of(adjustToActiveFolderDelimiter(username.asString())); + } +} diff --git a/protocols/imap/src/test/java/org/apache/james/imap/main/DefaultPathConverterTest.java b/protocols/imap/src/test/java/org/apache/james/imap/main/DefaultPathConverterTest.java index 95172d8928..476d1c670e 100644 --- a/protocols/imap/src/test/java/org/apache/james/imap/main/DefaultPathConverterTest.java +++ b/protocols/imap/src/test/java/org/apache/james/imap/main/DefaultPathConverterTest.java @@ -25,7 +25,7 @@ public class DefaultPathConverterTest { @Nested public class DotDelimiter extends TestBase { @Override - public char pathDelimiter() { + public char folderDelimiter() { return '.'; } } @@ -33,7 +33,7 @@ public class DefaultPathConverterTest { @Nested public class SlashDelimiter extends TestBase { @Override - public char pathDelimiter() { + public char folderDelimiter() { return '/'; } } diff --git a/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterBasicContract.java b/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterBasicContract.java index a627462750..d2d89d9648 100644 --- a/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterBasicContract.java +++ b/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterBasicContract.java @@ -26,13 +26,12 @@ import org.apache.james.core.Username; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MailboxSessionUtil; import org.apache.james.mailbox.model.MailboxConstants; +import org.apache.james.mailbox.model.MailboxFolderDelimiterAwareTest; import org.apache.james.mailbox.model.MailboxPath; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -public abstract class PathConverterBasicContract { +public abstract class PathConverterBasicContract extends MailboxFolderDelimiterAwareTest { public static final Username USERNAME = Username.of("username"); public static final Username USERNAME_WITH_DELIMITER = Username.of("username.with.delimiter"); public static final Username USERNAME_WITH_UNDERSCORE = Username.of("username_with_underscore"); @@ -42,35 +41,10 @@ public abstract class PathConverterBasicContract { public static final Username USERNAME2_WITH_MAIL = Username.of("userna...@apache.org"); public static final boolean RELATIVE = true; - public final MailboxSession mailboxSession = MailboxSessionUtil.create(USERNAME, pathDelimiter()); + public final MailboxSession mailboxSession = MailboxSessionUtil.create(USERNAME, folderDelimiter()); abstract PathConverter pathConverter(); - abstract char pathDelimiter(); - - static char initialPathDelimiter; - - @BeforeEach - public void setUp() { - initialPathDelimiter = MailboxConstants.FOLDER_DELIMITER; - MailboxConstants.FOLDER_DELIMITER = pathDelimiter(); - } - - @AfterEach - public void tearDown() { - MailboxConstants.FOLDER_DELIMITER = initialPathDelimiter; - } - - static String adjustToTestDelimiter(String valueWithDots) { - // Because the test setup will configure the desired delimiter to be used, - // we do not need to pass it in manually here. - return valueWithDots.replace('.', MailboxConstants.FOLDER_DELIMITER); - } - - static Username adjustToTestDelimiter(Username username) { - return Username.of(adjustToTestDelimiter(username.asString())); - } - @Test public void buildFullPathShouldAcceptNull() { assertThat(pathConverter().buildFullPath(null)) @@ -98,53 +72,53 @@ public abstract class PathConverterBasicContract { @Test public void buildFullPathShouldAcceptUserNamespaceAndDelimiter() { - assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + pathDelimiter())) + assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + folderDelimiter())) .isEqualTo(MailboxPath.forUser(USERNAME, "")); } @Test public void buildFullPathShouldAcceptFullAbsoluteUserPath() { String mailboxName = "mailboxName"; - assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + pathDelimiter() + mailboxName)) + assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + folderDelimiter() + mailboxName)) .isEqualTo(MailboxPath.forUser(USERNAME, mailboxName)); } @Test public void buildFullPathShouldAcceptRelativePathWithSubFolder() { - String mailboxName = adjustToTestDelimiter("mailboxName.subFolder"); + String mailboxName = adjustToActiveFolderDelimiter("mailboxName.subFolder"); assertThat(pathConverter().buildFullPath(mailboxName)) .isEqualTo(MailboxPath.forUser(USERNAME, mailboxName)); } @Test public void buildFullPathShouldAcceptAbsoluteUserPathWithSubFolder() { - String mailboxName = adjustToTestDelimiter("mailboxName.subFolder"); - assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + pathDelimiter() + mailboxName)) + String mailboxName = adjustToActiveFolderDelimiter("mailboxName.subFolder"); + assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + folderDelimiter() + mailboxName)) .isEqualTo(MailboxPath.forUser(USERNAME, mailboxName)); } @Test public void buildFullPathShouldAcceptAbsoluteOtherUserPath() { - assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username2.abc"))) + assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username2.abc"))) .isEqualTo(MailboxPath.forUser(USERNAME2, "abc")); } @Test public void buildFullPathShouldAcceptAbsoluteOtherUserPathWithDelimiter() { - assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username__with__delimiter.abc"))) - .isEqualTo(MailboxPath.forUser(adjustToTestDelimiter(USERNAME_WITH_DELIMITER), "abc")); + assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username__with__delimiter.abc"))) + .isEqualTo(MailboxPath.forUser(adjustToActiveFolderDelimiter(USERNAME_WITH_DELIMITER), "abc")); } @Test public void buildFullPathShouldAcceptAbsoluteOtherUserPathWithUnderscore() { - assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username_-with_-underscore.abc"))) + assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username_-with_-underscore.abc"))) .isEqualTo(MailboxPath.forUser(USERNAME_WITH_UNDERSCORE, "abc")); } @Test public void buildFullPathShouldAcceptAbsoluteOtherUserPathWithSubfolder() { - assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username2.abc.def"))) - .isEqualTo(MailboxPath.forUser(USERNAME2, adjustToTestDelimiter("abc.def"))); + assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username2.abc.def"))) + .isEqualTo(MailboxPath.forUser(USERNAME2, adjustToActiveFolderDelimiter("abc.def"))); } @Test @@ -162,30 +136,30 @@ public abstract class PathConverterBasicContract { @Test public void mailboxNameShouldReturnFQDNWhenRelativeAndOtherUserMailbox() { assertThat(pathConverter().mailboxName(RELATIVE, MailboxPath.forUser(USERNAME2, "abc"), mailboxSession)) - .contains(adjustToTestDelimiter("#user.username2.abc")); + .contains(adjustToActiveFolderDelimiter("#user.username2.abc")); } @Test public void mailboxNameShouldEscapeDelimiterInUsername() { - assertThat(pathConverter().mailboxName(RELATIVE, MailboxPath.forUser(adjustToTestDelimiter(USERNAME_WITH_DELIMITER), "abc"), mailboxSession)) - .contains(adjustToTestDelimiter("#user.username__with__delimiter.abc")); + assertThat(pathConverter().mailboxName(RELATIVE, MailboxPath.forUser(adjustToActiveFolderDelimiter(USERNAME_WITH_DELIMITER), "abc"), mailboxSession)) + .contains(adjustToActiveFolderDelimiter("#user.username__with__delimiter.abc")); } @Test public void mailboxNameShouldEscapeUnderscoreInUsername() { assertThat(pathConverter().mailboxName(RELATIVE, MailboxPath.forUser(USERNAME_WITH_UNDERSCORE, "abc"), mailboxSession)) - .contains(adjustToTestDelimiter("#user.username_-with_-underscore.abc")); + .contains(adjustToActiveFolderDelimiter("#user.username_-with_-underscore.abc")); } @Test public void mailboxNameShouldReturnFQDNWhenRelativeAndSharedMailbox() { assertThat(pathConverter().mailboxName(RELATIVE, new MailboxPath("#Shared", Username.of("marketing"), "abc"), mailboxSession)) - .contains(adjustToTestDelimiter("#Shared.marketing.abc")); + .contains(adjustToActiveFolderDelimiter("#Shared.marketing.abc")); } @Test public void mailboxNameShouldReturnFQDNWhenNotRelativeAndUserMailbox() { - String mailboxName = adjustToTestDelimiter("#private.abc"); + String mailboxName = adjustToActiveFolderDelimiter("#private.abc"); assertThat(pathConverter().mailboxName(!RELATIVE, MailboxPath.forUser(USERNAME, "abc"), mailboxSession)) .contains(mailboxName); } @@ -193,18 +167,18 @@ public abstract class PathConverterBasicContract { @Test public void mailboxNameShouldReturnFQDNWhenNotRelativeAndOtherUserMailbox() { assertThat(pathConverter().mailboxName(!RELATIVE, MailboxPath.forUser(USERNAME2, "abc"), mailboxSession)) - .contains(adjustToTestDelimiter("#user.username2.abc")); + .contains(adjustToActiveFolderDelimiter("#user.username2.abc")); } @Test public void mailboxNameShouldReturnFQDNWhenNotRelativeAndSharedMailbox() { assertThat(pathConverter().mailboxName(!RELATIVE, new MailboxPath("#Shared", Username.of("marketing"), "abc"), mailboxSession)) - .contains(adjustToTestDelimiter("#Shared.marketing.abc")); + .contains(adjustToActiveFolderDelimiter("#Shared.marketing.abc")); } @Nested public abstract class WithEmail { - public final MailboxSession mailboxWithEmailSession = MailboxSessionUtil.create(USERNAME_WITH_MAIL, pathDelimiter()); + public final MailboxSession mailboxWithEmailSession = MailboxSessionUtil.create(USERNAME_WITH_MAIL, folderDelimiter()); public abstract PathConverter pathConverter(); @@ -235,41 +209,41 @@ public abstract class PathConverterBasicContract { @Test public void buildFullPathShouldAcceptUserNamespaceAndDelimiter() { - assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + pathDelimiter())) + assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + folderDelimiter())) .isEqualTo(MailboxPath.forUser(USERNAME_WITH_MAIL, "")); } @Test public void buildFullPathShouldAcceptFullAbsoluteUserPath() { String mailboxName = "mailboxName"; - assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + pathDelimiter() + mailboxName)) + assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + folderDelimiter() + mailboxName)) .isEqualTo(MailboxPath.forUser(USERNAME_WITH_MAIL, mailboxName)); } @Test public void buildFullPathShouldAcceptRelativePathWithSubFolder() { - String mailboxName = "mailboxName" + pathDelimiter() + "subFolder"; + String mailboxName = "mailboxName" + folderDelimiter() + "subFolder"; assertThat(pathConverter().buildFullPath(mailboxName)) .isEqualTo(MailboxPath.forUser(USERNAME_WITH_MAIL, mailboxName)); } @Test public void buildFullPathShouldAcceptAbsoluteUserPathWithSubFolder() { - String mailboxName = adjustToTestDelimiter("mailboxName.subFolder"); - assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + pathDelimiter() + mailboxName)) + String mailboxName = adjustToActiveFolderDelimiter("mailboxName.subFolder"); + assertThat(pathConverter().buildFullPath(MailboxConstants.USER_NAMESPACE + folderDelimiter() + mailboxName)) .isEqualTo(MailboxPath.forUser(USERNAME_WITH_MAIL, mailboxName)); } @Test public void buildFullPathShouldAcceptAbsoluteOtherUserPath() { - assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username2.abc"))) + assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username2.abc"))) .isEqualTo(MailboxPath.forUser(USERNAME2_WITH_MAIL, "abc")); } @Test public void buildFullPathShouldAcceptAbsoluteOtherUserPathWithSubfolder() { - assertThat(pathConverter().buildFullPath(adjustToTestDelimiter("#user.username2.abc.def"))) - .isEqualTo(MailboxPath.forUser(USERNAME2_WITH_MAIL, adjustToTestDelimiter("abc.def"))); + assertThat(pathConverter().buildFullPath(adjustToActiveFolderDelimiter("#user.username2.abc.def"))) + .isEqualTo(MailboxPath.forUser(USERNAME2_WITH_MAIL, adjustToActiveFolderDelimiter("abc.def"))); } @Test @@ -281,31 +255,31 @@ public abstract class PathConverterBasicContract { @Test public void mailboxNameShouldReturnFQDNWhenRelativeAndOtherUserMailbox() { assertThat(pathConverter().mailboxName(RELATIVE, MailboxPath.forUser(USERNAME2_WITH_MAIL, "abc"), mailboxWithEmailSession)) - .contains(adjustToTestDelimiter("#user.username2.abc")); + .contains(adjustToActiveFolderDelimiter("#user.username2.abc")); } @Test public void mailboxNameShouldReturnFQDNWhenRelativeAndSharedMailbox() { assertThat(pathConverter().mailboxName(RELATIVE, new MailboxPath("#Shared", Username.of("market...@apache.org"), "abc"), mailboxWithEmailSession)) - .contains(adjustToTestDelimiter("#Shared.marketing.abc")); + .contains(adjustToActiveFolderDelimiter("#Shared.marketing.abc")); } @Test public void mailboxNameShouldReturnFQDNWhenNotRelativeAndUserMailbox() { assertThat(pathConverter().mailboxName(!RELATIVE, MailboxPath.forUser(USERNAME_WITH_MAIL, "abc"), mailboxWithEmailSession)) - .contains(adjustToTestDelimiter("#private.abc")); + .contains(adjustToActiveFolderDelimiter("#private.abc")); } @Test public void mailboxNameShouldReturnFQDNWhenNotRelativeAndOtherUserMailbox() { assertThat(pathConverter().mailboxName(!RELATIVE, MailboxPath.forUser(USERNAME2_WITH_MAIL, "abc"), mailboxWithEmailSession)) - .contains(adjustToTestDelimiter("#user.username2.abc")); + .contains(adjustToActiveFolderDelimiter("#user.username2.abc")); } @Test public void mailboxNameShouldReturnFQDNWhenNotRelativeAndSharedMailbox() { assertThat(pathConverter().mailboxName(!RELATIVE, new MailboxPath("#Shared", Username.of("market...@apache.org"), "abc"), mailboxWithEmailSession)) - .contains(adjustToTestDelimiter("#Shared.marketing.abc")); + .contains(adjustToActiveFolderDelimiter("#Shared.marketing.abc")); } } } --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@james.apache.org For additional commands, e-mail: notifications-h...@james.apache.org