This is an automated email from the ASF dual-hosted git repository.

chibenwa pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 5eb5153619c4f7e8c4fce39b3ffa7af3aa4c4a26
Author: Quan Tran <[email protected]>
AuthorDate: Mon Jul 13 22:58:39 2026 +0700

    [BUILD] ImapKeywordsConsistencyContract: isolate using different users
---
 .../contract/ImapKeywordsConsistencyContract.scala | 85 +++++++++++++---------
 .../MemoryIMAPKeywordsInconsistenciesTest.java     |  2 +-
 2 files changed, 52 insertions(+), 35 deletions(-)

diff --git 
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/ImapKeywordsConsistencyContract.scala
 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/ImapKeywordsConsistencyContract.scala
index 58e57459a6..e55d78a188 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/ImapKeywordsConsistencyContract.scala
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/ImapKeywordsConsistencyContract.scala
@@ -21,8 +21,10 @@ package org.apache.james.jmap.rfc8621.contract
 
 import java.nio.charset.StandardCharsets
 import java.util
+import java.util.UUID
 import java.util.concurrent.TimeUnit
 
+import com.google.common.hash.Hashing
 import io.netty.handler.codec.http.HttpHeaderNames.ACCEPT
 import io.restassured.RestAssured
 import io.restassured.RestAssured.`given`
@@ -30,10 +32,10 @@ import io.restassured.http.ContentType.JSON
 import net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson
 import org.apache.http.HttpStatus.SC_OK
 import org.apache.james.GuiceJamesServer
+import org.apache.james.core.Username
 import org.apache.james.jmap.JMAPTestingConstants.{DOMAIN, LOCALHOST_IP}
 import org.apache.james.jmap.http.UserCredential
-import 
org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, 
ACCOUNT_ID, ANDRE, BOB, BOB_PASSWORD, authScheme, baseRequestSpecBuilder}
-import 
org.apache.james.jmap.rfc8621.contract.ImapKeywordsConsistencyContract.bobInboxPath
+import 
org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, 
BOB_PASSWORD, authScheme, baseRequestSpecBuilder}
 import org.apache.james.mailbox.DefaultMailboxes
 import org.apache.james.mailbox.MessageManager.AppendCommand
 import org.apache.james.mailbox.model.{MailboxConstants, MailboxPath, 
MessageId}
@@ -50,11 +52,21 @@ import org.junit.jupiter.params.provider.ValueSource
 
 import scala.jdk.CollectionConverters._
 
-object ImapKeywordsConsistencyContract {
-  private val bobInboxPath = MailboxPath.forUser(BOB, DefaultMailboxes.INBOX)
+object ImapKeywordsConsistencyContext {
+  case class TestContext(bobUsername: Username, bobAccountId: String, 
andreUsername: Username)
+  val currentContext: java.util.concurrent.atomic.AtomicReference[TestContext] 
= new java.util.concurrent.atomic.AtomicReference[TestContext]()
 }
 
+object ImapKeywordsConsistencyContract {}
+
 trait ImapKeywordsConsistencyContract {
+  import ImapKeywordsConsistencyContext.currentContext
+
+  def bobUsername: Username = currentContext.get().bobUsername
+  def bobAccountId: String = currentContext.get().bobAccountId
+  def andreUsername: Username = currentContext.get().andreUsername
+  def bobInboxPath: MailboxPath = MailboxPath.forUser(bobUsername, 
DefaultMailboxes.INBOX)
+
   private lazy val slowPacedPollInterval = ONE_HUNDRED_MILLISECONDS
   private lazy val calmlyAwait = Awaitility.`with`
     .pollInterval(slowPacedPollInterval)
@@ -66,18 +78,23 @@ trait ImapKeywordsConsistencyContract {
 
   @BeforeEach
   def setUp(server: GuiceJamesServer): Unit = {
+    val uniqueSuffix = UUID.randomUUID().toString.replace("-", "").take(8)
+    val bob = Username.fromLocalPartWithDomain(s"bob$uniqueSuffix", DOMAIN)
+    val andre = Username.fromLocalPartWithDomain(s"andre$uniqueSuffix", DOMAIN)
+    currentContext.set(ImapKeywordsConsistencyContext.TestContext(
+      bob, Hashing.sha256().hashString(bob.asString(), 
StandardCharsets.UTF_8).toString, andre))
     server.getProbe(classOf[DataProbeImpl])
       .fluent
       .addDomain(DOMAIN)
-      .addUser(BOB.asString, BOB_PASSWORD)
+      .addUser(bob.asString, BOB_PASSWORD)
 
     val mailboxProbe = server.getProbe(classOf[MailboxProbeImpl])
-    mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, BOB.asString, 
DefaultMailboxes.INBOX)
-    mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, BOB.asString, 
DefaultMailboxes.ARCHIVE)
-    mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, BOB.asString, 
DefaultMailboxes.TRASH)
+    mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, bob.asString, 
DefaultMailboxes.INBOX)
+    mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, bob.asString, 
DefaultMailboxes.ARCHIVE)
+    mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, bob.asString, 
DefaultMailboxes.TRASH)
 
     RestAssured.requestSpecification = baseRequestSpecBuilder(server)
-      .setAuth(authScheme(UserCredential(BOB, BOB_PASSWORD)))
+      .setAuth(authScheme(UserCredential(bob, BOB_PASSWORD)))
       .build
   }
 
@@ -96,7 +113,7 @@ trait ImapKeywordsConsistencyContract {
 
     // And the user has an open IMAP connection with mailbox "<mailbox>" 
selected
     imapClient.connect(LOCALHOST_IP, 
server.getProbe(classOf[ImapGuiceProbe]).getImapPort)
-      .login(BOB, BOB_PASSWORD)
+      .login(bobUsername, BOB_PASSWORD)
       .select(mailbox)
 
     // And the user set flags via IMAP to "(\Flagged)" for all messages in 
mailbox "<mailbox>"
@@ -136,7 +153,7 @@ trait ImapKeywordsConsistencyContract {
 
     // And the user has an open IMAP connection with mailbox "<mailbox>" 
selected
     imapClient.connect(LOCALHOST_IP, 
server.getProbe(classOf[ImapGuiceProbe]).getImapPort)
-      .login(BOB, BOB_PASSWORD)
+      .login(bobUsername, BOB_PASSWORD)
       .select(mailbox)
 
     // And the user set flags via IMAP to "(\Draft)" for all messages in 
mailbox "<mailbox>"
@@ -171,7 +188,7 @@ trait ImapKeywordsConsistencyContract {
 
     // And the user has an open IMAP connection with mailbox "archive" selected
     imapClient.connect(LOCALHOST_IP, 
server.getProbe(classOf[ImapGuiceProbe]).getImapPort)
-      .login(BOB, BOB_PASSWORD)
+      .login(bobUsername, BOB_PASSWORD)
       .select(DefaultMailboxes.ARCHIVE)
 
     // And the user set flags via IMAP to "(\Flagged)" for all messages in 
mailbox "archive"
@@ -197,7 +214,7 @@ trait ImapKeywordsConsistencyContract {
 
     // And the user has an open IMAP connection with mailbox "archive" selected
     imapClient.connect(LOCALHOST_IP, 
server.getProbe(classOf[ImapGuiceProbe]).getImapPort)
-      .login(BOB, BOB_PASSWORD)
+      .login(bobUsername, BOB_PASSWORD)
       .select(DefaultMailboxes.ARCHIVE)
 
     // And the user set flags via IMAP to "(\Flagged)" for all messages in 
mailbox "archive"
@@ -223,7 +240,7 @@ trait ImapKeywordsConsistencyContract {
 
     // And the user has an open IMAP connection with mailbox "archive" selected
     imapClient.connect(LOCALHOST_IP, 
server.getProbe(classOf[ImapGuiceProbe]).getImapPort)
-      .login(BOB, BOB_PASSWORD)
+      .login(bobUsername, BOB_PASSWORD)
       .select(DefaultMailboxes.ARCHIVE)
 
     // And the user set flags via IMAP to "(\Flagged)" for all messages in 
mailbox "archive"
@@ -247,7 +264,7 @@ trait ImapKeywordsConsistencyContract {
 
     // And the user has an open IMAP connection with mailbox "archive" selected
     imapClient.connect(LOCALHOST_IP, 
server.getProbe(classOf[ImapGuiceProbe]).getImapPort)
-      .login(BOB, BOB_PASSWORD)
+      .login(bobUsername, BOB_PASSWORD)
       .select(DefaultMailboxes.ARCHIVE)
 
     // And the user set flags via IMAP to "(\Flagged)" for all messages in 
mailbox "archive"
@@ -286,7 +303,7 @@ trait ImapKeywordsConsistencyContract {
 
     // And the user has an open IMAP connection with mailbox "archive" selected
     imapClient.connect(LOCALHOST_IP, 
server.getProbe(classOf[ImapGuiceProbe]).getImapPort)
-      .login(BOB, BOB_PASSWORD)
+      .login(bobUsername, BOB_PASSWORD)
       .select(DefaultMailboxes.ARCHIVE)
 
     // And the user set flags via IMAP to "(\Flagged)" for all messages in 
mailbox "archive"
@@ -337,7 +354,7 @@ trait ImapKeywordsConsistencyContract {
 
     // And the user has an open IMAP connection with mailbox "archive" selected
     imapClient.connect(LOCALHOST_IP, 
server.getProbe(classOf[ImapGuiceProbe]).getImapPort)
-      .login(BOB, BOB_PASSWORD)
+      .login(bobUsername, BOB_PASSWORD)
       .select(DefaultMailboxes.ARCHIVE)
 
     // And the user set flags via IMAP to "(\Flagged)" for all messages in 
mailbox "archive"
@@ -368,21 +385,21 @@ trait ImapKeywordsConsistencyContract {
     val message = Message.Builder
       .of
       .setSubject("test")
-      .setSender(ANDRE.asString)
-      .setFrom("ANDRE <" + ANDRE.asString + ">")
-      .setTo(BOB.asString)
+      .setSender(andreUsername.asString)
+      .setFrom("andreUsername <" + andreUsername.asString + ">")
+      .setTo(bobUsername.asString)
       .setSubject("My awesome subject")
       .setBody("This is the content", StandardCharsets.UTF_8)
       .build
 
     server.getProbe(classOf[MailboxProbeImpl])
-      .appendMessage(BOB.asString(), bobInboxPath, 
AppendCommand.builder().build(message))
+      .appendMessage(bobUsername.asString(), bobInboxPath, 
AppendCommand.builder().build(message))
       .getMessageId
   }
 
   def moveMessageFromInboxToArchive(server: GuiceJamesServer, messageId: 
MessageId): Unit = {
     val archiveMailboxId = server.getProbe(classOf[MailboxProbeImpl])
-      .getMailboxId(MailboxConstants.USER_NAMESPACE, BOB.asString, 
DefaultMailboxes.ARCHIVE)
+      .getMailboxId(MailboxConstants.USER_NAMESPACE, bobUsername.asString, 
DefaultMailboxes.ARCHIVE)
 
     val request =
       s"""{
@@ -391,7 +408,7 @@ trait ImapKeywordsConsistencyContract {
          |    "urn:ietf:params:jmap:mail"],
          |  "methodCalls": [
          |    ["Email/set", {
-         |      "accountId": "$ACCOUNT_ID",
+         |      "accountId": "$bobAccountId",
          |      "update": {
          |        "${messageId.serialize}": {
          |          "mailboxIds": {
@@ -413,9 +430,9 @@ trait ImapKeywordsConsistencyContract {
 
   def copyMessageFromInboxToArchive(server: GuiceJamesServer, messageId: 
MessageId): Unit = {
     val inboxId = server.getProbe(classOf[MailboxProbeImpl])
-      .getMailboxId(MailboxConstants.USER_NAMESPACE, BOB.asString, 
DefaultMailboxes.INBOX)
+      .getMailboxId(MailboxConstants.USER_NAMESPACE, bobUsername.asString, 
DefaultMailboxes.INBOX)
     val archiveMailboxId = server.getProbe(classOf[MailboxProbeImpl])
-      .getMailboxId(MailboxConstants.USER_NAMESPACE, BOB.asString, 
DefaultMailboxes.ARCHIVE)
+      .getMailboxId(MailboxConstants.USER_NAMESPACE, bobUsername.asString, 
DefaultMailboxes.ARCHIVE)
 
     val request =
       s"""{
@@ -424,7 +441,7 @@ trait ImapKeywordsConsistencyContract {
          |    "urn:ietf:params:jmap:mail"],
          |  "methodCalls": [
          |    ["Email/set", {
-         |      "accountId": "$ACCOUNT_ID",
+         |      "accountId": "$bobAccountId",
          |      "update": {
          |        "${messageId.serialize}": {
          |          "mailboxIds": {
@@ -452,7 +469,7 @@ trait ImapKeywordsConsistencyContract {
          |  "methodCalls": [[
          |    "Email/query",
          |    {
-         |      "accountId": "$ACCOUNT_ID"
+         |      "accountId": "$bobAccountId"
          |    },
          |    "c1"]]
          |}""".stripMargin
@@ -476,7 +493,7 @@ trait ImapKeywordsConsistencyContract {
          |  "methodCalls": [[
          |    "Email/query",
          |    {
-         |      "accountId": "$ACCOUNT_ID",
+         |      "accountId": "$bobAccountId",
          |      "filter" : {
          |        "hasKeyword": "$keyword"
          |      }
@@ -498,7 +515,7 @@ trait ImapKeywordsConsistencyContract {
 
   def listMessageIdsArchive(server: GuiceJamesServer): util.ArrayList[String] 
= {
     val archiveMailboxId = server.getProbe(classOf[MailboxProbeImpl])
-      .getMailboxId(MailboxConstants.USER_NAMESPACE, BOB.asString, 
DefaultMailboxes.ARCHIVE)
+      .getMailboxId(MailboxConstants.USER_NAMESPACE, bobUsername.asString, 
DefaultMailboxes.ARCHIVE)
 
     val request =
       s"""{
@@ -506,7 +523,7 @@ trait ImapKeywordsConsistencyContract {
          |  "methodCalls": [[
          |    "Email/query",
          |    {
-         |      "accountId": "$ACCOUNT_ID",
+         |      "accountId": "$bobAccountId",
          |      "filter": {"inMailbox": "${archiveMailboxId.serialize}"}
          |    },
          |    "c1"]]
@@ -526,7 +543,7 @@ trait ImapKeywordsConsistencyContract {
 
   def listMessageIdsByMailboxAndKeyword(server: GuiceJamesServer, mailbox: 
String, keyword: String): util.ArrayList[String] = {
     val mailboxId = server.getProbe(classOf[MailboxProbeImpl])
-      .getMailboxId(MailboxConstants.USER_NAMESPACE, BOB.asString, mailbox)
+      .getMailboxId(MailboxConstants.USER_NAMESPACE, bobUsername.asString, 
mailbox)
 
     val request =
       s"""{
@@ -534,7 +551,7 @@ trait ImapKeywordsConsistencyContract {
          |  "methodCalls": [[
          |    "Email/query",
          |    {
-         |      "accountId": "$ACCOUNT_ID",
+         |      "accountId": "$bobAccountId",
          |      "filter": {
          |        "inMailbox": "${mailboxId.serialize}",
          |        "hasKeyword": "$keyword"
@@ -562,7 +579,7 @@ trait ImapKeywordsConsistencyContract {
          |  "methodCalls": [[
          |     "Email/get",
          |     {
-         |       "accountId": "$ACCOUNT_ID",
+         |       "accountId": "$bobAccountId",
          |       "ids": [$idString]
          |     },
          |     "c1"]]
@@ -587,7 +604,7 @@ trait ImapKeywordsConsistencyContract {
          |  "using": ["urn:ietf:params:jmap:core", 
"urn:ietf:params:jmap:mail"],
          |  "methodCalls": [
          |    ["Email/set", {
-         |      "accountId": "$ACCOUNT_ID",
+         |      "accountId": "$bobAccountId",
          |      "update": {
          |        "${messageId.serialize}":{
          |          "keywords": {
diff --git 
a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryIMAPKeywordsInconsistenciesTest.java
 
b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryIMAPKeywordsInconsistenciesTest.java
index d83eba1795..687a15bf6f 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryIMAPKeywordsInconsistenciesTest.java
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryIMAPKeywordsInconsistenciesTest.java
@@ -23,7 +23,7 @@ import 
org.apache.james.jmap.rfc8621.contract.ImapKeywordsConsistencyContract;
 import org.apache.james.utils.TestIMAPClient;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class MemoryIMAPKeywordsInconsistenciesTest extends MemoryBase 
implements ImapKeywordsConsistencyContract {
+public class MemoryIMAPKeywordsInconsistenciesTest extends PerClassMemoryBase 
implements ImapKeywordsConsistencyContract {
     @RegisterExtension
     TestIMAPClient testIMAPClient = new TestIMAPClient();
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to