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 50adb87ec2a6f73da293bb7d9ae88c1342579d40 Author: Quan Tran <[email protected]> AuthorDate: Mon Jul 13 22:58:40 2026 +0700 [BUILD] UploadContract: isolate using different users --- .../rfc8621/distributed/DistributedUploadTest.java | 2 +- .../jmap/rfc8621/contract/UploadContract.scala | 56 +++++++++++++++------- .../jmap/rfc8621/memory/MemoryUploadTest.java | 2 +- .../jmap/rfc8621/postgres/PostgresUploadTest.java | 2 +- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedUploadTest.java b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedUploadTest.java index 6927255ed2..2d1099f734 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedUploadTest.java +++ b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedUploadTest.java @@ -21,6 +21,6 @@ package org.apache.james.jmap.rfc8621.distributed; import org.apache.james.jmap.rfc8621.contract.UploadContract; -public class DistributedUploadTest extends DistributedBase implements UploadContract { +public class DistributedUploadTest extends PerClassDistributedBase implements UploadContract { } 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/UploadContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/UploadContract.scala index ef9047858f..0e4a70d68a 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/UploadContract.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/UploadContract.scala @@ -20,15 +20,17 @@ package org.apache.james.jmap.rfc8621.contract import java.io.ByteArrayInputStream import java.nio.charset.StandardCharsets +import java.util.UUID import io.netty.handler.codec.http.HttpHeaderNames.ACCEPT import io.restassured.RestAssured.{`given`, requestSpecification} import io.restassured.http.ContentType import org.apache.http.HttpStatus.{SC_BAD_REQUEST, SC_CREATED, SC_FORBIDDEN, SC_OK, SC_UNAUTHORIZED} import org.apache.james.GuiceJamesServer +import org.apache.james.core.Username import org.apache.james.jmap.core.AccountId import org.apache.james.jmap.http.UserCredential -import org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, ACCOUNT_ID, ALICE, ALICE_ACCOUNT_ID, ALICE_PASSWORD, ANDRE, ANDRE_PASSWORD, BOB, BOB_PASSWORD, DOMAIN, _2_DOT_DOMAIN, authScheme, baseRequestSpecBuilder} +import org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, ALICE_PASSWORD, ANDRE_PASSWORD, BOB_PASSWORD, DOMAIN, _2_DOT_DOMAIN, authScheme, baseRequestSpecBuilder} import org.apache.james.jmap.rfc8621.contract.UploadContract.{BIG_INPUT, VALID_INPUT} import org.apache.james.utils.DataProbeImpl import org.assertj.core.api.Assertions.assertThat @@ -37,24 +39,44 @@ import org.hamcrest.Matchers.equalTo import org.junit.jupiter.api.{BeforeEach, RepeatedTest, Test} import play.api.libs.json.{JsString, Json} +object UploadContractContext { + case class TestContext(bobUsername: Username, bobAccountId: String, aliceUsername: Username, aliceAccountId: String, andreUsername: Username) + val currentContext: java.util.concurrent.atomic.AtomicReference[TestContext] = new java.util.concurrent.atomic.AtomicReference[TestContext]() +} + object UploadContract { private val BIG_INPUT: Array[Byte] = "123456789\r\n".repeat(1024 * 1024 * 4).getBytes(StandardCharsets.UTF_8) private val VALID_INPUT: Array[Byte] = "123456789\r\n".repeat(1024 * 1024).getBytes(StandardCharsets.UTF_8) } trait UploadContract { + import UploadContractContext.currentContext + + def bobUsername: Username = currentContext.get().bobUsername + def bobAccountId: String = currentContext.get().bobAccountId + def aliceUsername: Username = currentContext.get().aliceUsername + def aliceAccountId: String = currentContext.get().aliceAccountId + def andreUsername: Username = currentContext.get().andreUsername + @BeforeEach def setUp(server: GuiceJamesServer): Unit = { + val uniqueSuffix = UUID.randomUUID().toString.replace("-", "").take(8) + val bob = Username.fromLocalPartWithDomain(s"bob$uniqueSuffix", DOMAIN) + val alice = Username.fromLocalPartWithDomain(s"alice$uniqueSuffix", _2_DOT_DOMAIN) + val andre = Username.fromLocalPartWithDomain(s"andre$uniqueSuffix", DOMAIN) + currentContext.set(UploadContractContext.TestContext( + bob, AccountId.from(bob).toOption.get.id.value, + alice, AccountId.from(alice).toOption.get.id.value, andre)) server.getProbe(classOf[DataProbeImpl]) .fluent .addDomain(DOMAIN.asString) - .addUser(BOB.asString, BOB_PASSWORD) + .addUser(bob.asString, BOB_PASSWORD) .addDomain(_2_DOT_DOMAIN.asString()) - .addUser(ALICE.asString(), ALICE_PASSWORD) - .addUser(ANDRE.asString(), ANDRE_PASSWORD) + .addUser(alice.asString(), ALICE_PASSWORD) + .addUser(andre.asString(), ANDRE_PASSWORD) requestSpecification = baseRequestSpecBuilder(server) - .setAuth(authScheme(UserCredential(BOB, BOB_PASSWORD))) + .setAuth(authScheme(UserCredential(bob, BOB_PASSWORD))) .build } @@ -65,7 +87,7 @@ trait UploadContract { .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) .body(VALID_INPUT) .when - .post(s"/upload/$ACCOUNT_ID") + .post(s"/upload/$bobAccountId") .`then` .statusCode(SC_CREATED) .extract @@ -78,7 +100,7 @@ trait UploadContract { .basePath("") .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) .when - .get(s"/download/$ACCOUNT_ID/$blobId") + .get(s"/download/$bobAccountId/$blobId") .`then` .statusCode(SC_OK) .contentType("application/json") @@ -97,7 +119,7 @@ trait UploadContract { .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) .body(VALID_INPUT) .when - .post(s"/upload/$ALICE_ACCOUNT_ID") + .post(s"/upload/$aliceAccountId") .`then` .statusCode(SC_FORBIDDEN) .header("Content-Length", "84") @@ -113,7 +135,7 @@ trait UploadContract { .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) .body(VALID_INPUT) .when - .post(s"/upload/$ACCOUNT_ID") + .post(s"/upload/$bobAccountId") .`then` .statusCode(SC_CREATED) .extract @@ -123,11 +145,11 @@ trait UploadContract { val blobId: String = Json.parse(uploadResponse).\("blobId").get.asInstanceOf[JsString].value `given` - .auth().basic(ALICE.asString(), ALICE_PASSWORD) + .auth().basic(aliceUsername.asString(), ALICE_PASSWORD) .basePath("") .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER) .when - .get(s"/download/$ALICE_ACCOUNT_ID/$blobId") + .get(s"/download/$bobAccountId/$blobId") .`then` .statusCode(SC_FORBIDDEN) .body("status", equalTo(403)) @@ -143,7 +165,7 @@ trait UploadContract { .contentType(ContentType.BINARY) .body(BIG_INPUT) .when - .post(s"/upload/$ACCOUNT_ID") + .post(s"/upload/$bobAccountId") .`then` .statusCode(SC_BAD_REQUEST) .body("status", equalTo(400)) @@ -161,7 +183,7 @@ trait UploadContract { .contentType(ContentType.BINARY) .body(VALID_INPUT) .when - .post(s"/upload/$ACCOUNT_ID") + .post(s"/upload/$bobAccountId") .`then` .statusCode(SC_UNAUTHORIZED) .header("WWW-Authenticate", "Basic realm=\"simple\", Bearer realm=\"JWT\"") @@ -172,9 +194,9 @@ trait UploadContract { @Test def bobShouldBeAllowedToUploadInAliceAccountWhenDelegated(server: GuiceJamesServer): Unit = { - server.getProbe(classOf[DataProbeImpl]).addAuthorizedUser(ALICE, BOB) + server.getProbe(classOf[DataProbeImpl]).addAuthorizedUser(aliceUsername, bobUsername) - val aliceAccountId: String = AccountId.from(ALICE).toOption.get.id.value + val aliceAccountId: String = AccountId.from(aliceUsername).toOption.get.id.value `given` .basePath("") @@ -192,9 +214,9 @@ trait UploadContract { @Test def bobShouldBeNotAllowedToUploadInAliceAccountWhenNotDelegated(server: GuiceJamesServer): Unit = { - server.getProbe(classOf[DataProbeImpl]).addAuthorizedUser(ALICE, ANDRE) + server.getProbe(classOf[DataProbeImpl]).addAuthorizedUser(aliceUsername, andreUsername) - val aliceAccountId: String = AccountId.from(ALICE).toOption.get.id.value + val aliceAccountId: String = AccountId.from(aliceUsername).toOption.get.id.value `given` .basePath("") 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/MemoryUploadTest.java b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryUploadTest.java index e6482ddc43..f195012d84 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryUploadTest.java +++ b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryUploadTest.java @@ -21,6 +21,6 @@ package org.apache.james.jmap.rfc8621.memory; import org.apache.james.jmap.rfc8621.contract.UploadContract; -public class MemoryUploadTest extends MemoryBase implements UploadContract { +public class MemoryUploadTest extends PerClassMemoryBase implements UploadContract { } diff --git a/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresUploadTest.java b/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresUploadTest.java index b280238f95..c5ed4f7e00 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresUploadTest.java +++ b/server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/postgres/PostgresUploadTest.java @@ -21,5 +21,5 @@ package org.apache.james.jmap.rfc8621.postgres; import org.apache.james.jmap.rfc8621.contract.UploadContract; -public class PostgresUploadTest extends PostgresBase implements UploadContract { +public class PostgresUploadTest extends PerClassPostgresBase implements UploadContract { } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
