This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit f162201fd61436c2712ce30700b90306487de27c Author: duc91 <[email protected]> AuthorDate: Tue Aug 11 16:11:16 2020 +0700 JAMES-3349: Add test for handle serverFail --- .../jmap/rfc8621/contract/EchoMethodContract.scala | 4 +- .../contract/MailboxGetMethodContract.scala | 2 +- .../org/apache/james/jmap/model/Invocation.scala | 10 +- .../james/jmap/routes/JMAPApiRoutesTest.scala | 103 ++++++++++++++++++++- 4 files changed, 109 insertions(+), 10 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/EchoMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EchoMethodContract.scala index 2306bc7..fcc9564 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EchoMethodContract.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EchoMethodContract.scala @@ -49,7 +49,7 @@ object EchoMethodContract { | [ | "error", | { - | "type": "Not implemented" + | "type": "unknownMethod" | }, | "notsupport" | ] @@ -71,7 +71,7 @@ object EchoMethodContract { | [ | "error", | { - | "type": "Not implemented" + | "type": "unknownMethod" | }, | "notsupport" | ] 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/MailboxGetMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxGetMethodContract.scala index 0e4a2af..b2c2d31 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxGetMethodContract.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/MailboxGetMethodContract.scala @@ -594,7 +594,7 @@ trait MailboxGetMethodContract { | "sessionState": "75128aab4b1b", | "methodResponses": [[ | "error", { - | "type": "invalidArguments", + | "type": "error", | "description": "The following properties [invalidProperty] do not exist." |}, | "c1"]] diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/model/Invocation.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/model/Invocation.scala index 7d80d0b..331d2f1 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/model/Invocation.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/model/Invocation.scala @@ -35,16 +35,14 @@ object Invocation { case class MethodCallId(value: NonEmptyString) - def error(errorCode: ErrorCode, description: NonEmptyString, methodCallId: MethodCallId): Invocation = { - Invocation(MethodName("error"), + def error(errorCode: ErrorCode, description: String, methodCallId: MethodCallId): Invocation = Invocation(MethodName("error"), Arguments(JsObject(Map("type" -> JsString(errorCode.code), "description" -> JsString(description)))), methodCallId) - } - def error(errorCode: ErrorCode, methodCallId: MethodCallId): Invocation = { - Invocation(MethodName("error"), + + def error(errorCode: ErrorCode, methodCallId: MethodCallId): Invocation = Invocation(MethodName("error"), Arguments(JsObject(Map("type" -> JsString(errorCode.code)))), methodCallId) - } + } sealed trait ErrorCode { diff --git a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala index 3cf728b..8c2f9b8 100644 --- a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala +++ b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala @@ -22,6 +22,7 @@ import java.nio.charset.StandardCharsets import java.util.Base64 import com.google.common.collect.ImmutableSet +import eu.timepit.refined.auto._ import io.netty.handler.codec.http.HttpHeaderNames.ACCEPT import io.restassured.RestAssured import io.restassured.builder.RequestSpecBuilder @@ -38,6 +39,8 @@ import org.apache.james.jmap._ import org.apache.james.jmap.http.{Authenticator, BasicAuthenticationStrategy, MailboxesProvisioner, UserProvisioning} import org.apache.james.jmap.json.Serializer import org.apache.james.jmap.method.{CoreEchoMethod, Method} +import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier +import org.apache.james.jmap.model.Invocation.MethodName import org.apache.james.jmap.model.RequestLevelErrorType import org.apache.james.jmap.routes.JMAPApiRoutesTest._ import org.apache.james.mailbox.extension.PreDeletionHook @@ -47,7 +50,8 @@ import org.apache.james.mailbox.store.StoreSubscriptionManager import org.apache.james.metrics.tests.RecordingMetricFactory import org.apache.james.user.memory.MemoryUsersRepository import org.hamcrest.Matchers.equalTo -import org.mockito.Mockito.mock +import org.mockito.ArgumentMatchers.any +import org.mockito.Mockito.{doThrow, mock, when} import org.scalatest.BeforeAndAfter import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers @@ -98,6 +102,32 @@ object JMAPApiRoutesTest { | ] | ] |}""".stripMargin + + private val REQUEST_OBJECT_WITH_2_ECHO_METHOD_CALL: String = + """{ + | "using": [ + | "urn:ietf:params:jmap:core" + | ], + | "methodCalls": [ + | [ + | "Core/echo", + | { + | "arg1": "arg1data", + | "arg2": "arg2data" + | }, + | "c1" + | ], + | [ + | "Core/echo", + | { + | "arg1": "arg1data", + | "arg2": "arg2data" + | }, + | "c2" + | ] + | ] + |}""".stripMargin + private val REQUEST_OBJECT_WITH_UNSUPPORTED_METHOD: String = """{ | "using": [ @@ -136,6 +166,30 @@ object JMAPApiRoutesTest { | ] | ] |}""".stripMargin + + private val SERVER_FAIL_RESPONSE_OBJECT: String = + """{ + | "sessionState": "75128aab4b1b", + | "methodResponses": [ + | [ + | "error", + | { + | "type": "serverFail", + | "description": "Unexpected Exception occur, the others method may proceed normally" + | }, + | "c1" + | ], + | [ + | "Core/echo", + | { + | "arg1": "arg1data", + | "arg2": "arg2data" + | }, + | "c2" + | ] + | ] + |}""".stripMargin + private val RESPONSE_OBJECT_WITH_UNSUPPORTED_METHOD: String = """{ | "sessionState": "75128aab4b1b", @@ -378,4 +432,51 @@ class JMAPApiRoutesTest extends AnyFlatSpec with BeforeAndAfter with Matchers { .body("type", equalTo(RequestLevelErrorType.UNKNOWN_CAPABILITY.value)) .body("detail", equalTo("The request used unsupported capabilities: Set(urn:ietf:params:jmap:core1)")) } + + "RFC-8621 with random error when processing request " should "return 200, with serverFail error, others method call proceed normally" in { + val mockCoreEchoMethod = mock(classOf[CoreEchoMethod]) + + doThrow(new RuntimeException("Unexpected Exception occur, the others method may proceed normally")) + .doCallRealMethod() + .when(mockCoreEchoMethod) + .process(any[Set[CapabilityIdentifier]], any(), any()) + + when(mockCoreEchoMethod.methodName).thenReturn(MethodName("Core/echo")) + + val methods: Set[Method] = Set(mockCoreEchoMethod) + val apiRoute: JMAPApiRoutes = new JMAPApiRoutes(AUTHENTICATOR, SERIALIZER, userProvisionner, mailboxesProvisioner, methods) + val routesHandler: ImmutableSet[JMAPRoutesHandler] = ImmutableSet.of(new JMAPRoutesHandler(Version.RFC8621, apiRoute)) + + val versionParser: VersionParser = new VersionParser(SUPPORTED_VERSIONS) + jmapServer = new JMAPServer(TEST_CONFIGURATION, routesHandler, versionParser) + jmapServer.start() + + RestAssured.requestSpecification = new RequestSpecBuilder() + .setContentType(ContentType.JSON) + .setAccept(ContentType.JSON) + .setConfig(newConfig.encoderConfig(encoderConfig.defaultContentCharset(StandardCharsets.UTF_8))) + .setPort(jmapServer.getPort.getValue) + .setBasePath(JMAP) + .build + + val headers: Headers = Headers.headers( + new Header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER), + new Header("Authorization", s"Basic ${userBase64String}") + ) + + val response = RestAssured + .`given`() + .headers(headers) + .body(REQUEST_OBJECT_WITH_2_ECHO_METHOD_CALL) + .when() + .post() + .`then` + .statusCode(HttpStatus.SC_OK) + .contentType(ContentType.JSON) + .extract() + .body() + .asString() + + assertThatJson(response).isEqualTo(SERVER_FAIL_RESPONSE_OBJECT) + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
