Skip to content

Commit ae9e42c

Browse files
quantranhong1999chibenwa
authored andcommitted
ISSUE-133 Adding COMPRESS command
1 parent 44bd259 commit ae9e42c

File tree

8 files changed

+115
-1
lines changed

8 files changed

+115
-1
lines changed

README.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ For now only the following commands are supported:
4444
- UID EXPUNGE
4545
- UID MOVE
4646
- UID STORE
47+
- COMPRESS (link:https://datatracker.ietf.org/doc/html/rfc4978[RFC-4978])
4748

4849
== Supported checks
4950

src/it/scala-2.12/com/linagora/gatling/imap/scenario/it/ImapAuthenticationScenarioIT.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.linagora.gatling.imap.scenario.it
22

33
import com.linagora.gatling.imap.Fixture.bart
44
import com.linagora.gatling.imap.PreDef.imap
5-
import com.linagora.gatling.imap.scenario.{ImapAuthenticationScenario, ImapCapabilityScenario, ImapCheckScenario, ImapCloseScenario, ImapCopyMessageScenario, ImapCreateFolderScenario, ImapDeleteFolderScenario, ImapEnableScenario, ImapExamineFolderScenario, ImapExpungeScenario, ImapGetAclScenario, ImapGetQuotaRootScenario, ImapGetQuotaScenario, ImapIdleScenario, ImapLogoutScenario, ImapLsubScenario, ImapMoveMessageScenario, ImapMyRightsScenario, ImapNamespaceScenario, ImapNoopScenario, ImapRenameFolderScenario, ImapSearchScenario, ImapSimpleScenario, ImapStatusScenario, ImapSubscribeScenario, ImapUIDFetchScenario, ImapUidCopyMessageScenario, ImapUidExpungeMessageScenario, ImapUidMoveMessageScenario, ImapUidStoreScenario, ImapUnselectScenario, ImapUnsubscribeScenario}
5+
import com.linagora.gatling.imap.scenario.{ImapAuthenticationScenario, ImapCapabilityScenario, ImapCheckScenario, ImapCloseScenario, ImapCompressScenario, ImapCopyMessageScenario, ImapCreateFolderScenario, ImapDeleteFolderScenario, ImapEnableScenario, ImapExamineFolderScenario, ImapExpungeScenario, ImapGetAclScenario, ImapGetQuotaRootScenario, ImapGetQuotaScenario, ImapIdleScenario, ImapLogoutScenario, ImapLsubScenario, ImapMoveMessageScenario, ImapMyRightsScenario, ImapNamespaceScenario, ImapNoopScenario, ImapRenameFolderScenario, ImapSearchScenario, ImapSimpleScenario, ImapStatusScenario, ImapSubscribeScenario, ImapUIDFetchScenario, ImapUidCopyMessageScenario, ImapUidExpungeMessageScenario, ImapUidMoveMessageScenario, ImapUidStoreScenario, ImapUnselectScenario, ImapUnsubscribeScenario}
66
import com.linagora.gatling.imap.{CyrusServer, Fixture, JamesServer, RunningServer}
77
import io.gatling.core.feeder.FeederBuilder
88
import io.gatling.core.funspec.GatlingFunSpec
@@ -91,6 +91,10 @@ class ImapGetQuotaScenarioJamesIT extends BaseIt(JamesServer.start()) {
9191
scenario(ImapGetQuotaScenario(_))
9292
}
9393

94+
class ImapCompressScenarioJamesIT extends BaseIt(JamesServer.start()) {
95+
scenario(ImapCompressScenario(_))
96+
}
97+
9498
class ImapIdleScenarioJamesIT extends BaseIt(JamesServer.start()) {
9599
scenario(ImapIdleScenario(_))
96100
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.linagora.gatling.imap.action
2+
3+
import akka.actor.Props
4+
import com.linagora.gatling.imap.check.ImapCheck
5+
import com.linagora.gatling.imap.protocol.{Command, UserId}
6+
import io.gatling.commons.validation.Validation
7+
import io.gatling.core.action.ValidatedActionActor
8+
import io.gatling.core.session._
9+
10+
import scala.collection.immutable.Seq
11+
12+
object CompressAction {
13+
def props(imapContext: ImapActionContext, requestname: String, checks: Seq[ImapCheck]) =
14+
Props(new CompressAction(imapContext, requestname, checks))
15+
}
16+
17+
class CompressAction(val imapContext: ImapActionContext, val requestName: String, override val checks: Seq[ImapCheck]) extends ValidatedActionActor with ImapActionActor {
18+
19+
override protected def executeOrFail(session: Session): Validation[_] = {
20+
Validation.unit
21+
.map(_ => {
22+
val id: Long = session.userId
23+
val handler = handleResponse(session, imapContext.clock.nowMillis)
24+
sessions.tell(Command.Compress(UserId(id)), handler)
25+
})
26+
}
27+
}

src/main/scala-2.12/com/linagora/gatling/imap/action/ImapActionBuilder.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ class ImapActionBuilder(requestName: String) {
9494
def setQuota(quotaRootAndResourceLimits: Expression[String]): ImapSetQuotaActionBuilder =
9595
ImapSetQuotaActionBuilder(requestName, quotaRootAndResourceLimits, Seq.empty)
9696

97+
def compress(): ImapCompressActionBuilder =
98+
ImapCompressActionBuilder(requestName, Seq.empty)
99+
97100
def getAcl(mailbox: Expression[String]): ImapGetAclActionBuilder =
98101
ImapGetAclActionBuilder(requestName, mailbox, Seq.empty)
99102

@@ -402,6 +405,15 @@ case class ImapSetQuotaActionBuilder(requestName: String, capability: Expression
402405
override val actionName: String = "set-quota-action"
403406
}
404407

408+
case class ImapCompressActionBuilder(requestName: String, private val checks: Seq[ImapCheck]) extends ImapCommandActionBuilder {
409+
def check(checks: ImapCheck*): ImapCompressActionBuilder = copy(checks = this.checks ++ checks)
410+
411+
override def props(ctx: ImapActionContext): Props =
412+
CompressAction.props(ctx, requestName, checks)
413+
414+
override val actionName: String = "compress-action"
415+
}
416+
405417
case class ImapGetAclActionBuilder(requestName: String, capability: Expression[String], private val checks: Seq[ImapCheck]) extends ImapCommandActionBuilder {
406418
def check(checks: ImapCheck*): ImapGetAclActionBuilder = copy(checks = this.checks ++ checks)
407419

src/main/scala-2.12/com/linagora/gatling/imap/protocol/ImapSessions.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ private class ImapSession(client: => ImapAsyncClient, protocol: ImapProtocol) ex
123123
case cmd@Command.SetQuota(_, _) =>
124124
val handler = context.actorOf(SetQuotaHandler.props(session), genName("setQuota"))
125125
handler forward cmd
126+
case cmd@Command.Compress(_) =>
127+
val handler = context.actorOf(CompressHandler.props(session), genName("compress"))
128+
handler forward cmd
126129
case cmd@Command.Idle(_) =>
127130
val handler = context.actorOf(IdleHandler.props(session), genName("idle"))
128131
handler forward cmd
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.linagora.gatling.imap.protocol.command
2+
3+
import java.util.function.Consumer
4+
5+
import akka.actor.{ActorRef, Props}
6+
import com.linagora.gatling.imap.protocol._
7+
import com.yahoo.imapnio.async.client.ImapAsyncSession
8+
import com.yahoo.imapnio.async.response.ImapAsyncResponse
9+
import io.gatling.core.akka.BaseActor
10+
11+
import scala.collection.immutable.Seq
12+
13+
object CompressHandler {
14+
def props(session: ImapAsyncSession) = Props(new CompressHandler(session))
15+
}
16+
17+
class CompressHandler(session: ImapAsyncSession) extends BaseActor {
18+
override def receive: Receive = {
19+
case Command.Compress(userId) =>
20+
logger.trace(s"CompressHandler for user : ${userId.value}, on actor ${self.path} responding to ${sender.path}")
21+
context.become(waitCallback(sender()))
22+
23+
val responseCallback: Consumer[ImapAsyncResponse] = responses => {
24+
import collection.JavaConverters._
25+
26+
val responsesList = ImapResponses(responses.getResponseLines.asScala.to[Seq])
27+
logger.trace(s"On response for $userId :\n ${responsesList.mkString("\n")}")
28+
self ! Response.CompressResponse(responsesList)
29+
}
30+
val errorCallback: Consumer[Exception] = e => {
31+
logger.trace(s"${getClass.getSimpleName} command failed", e)
32+
logger.error(s"${getClass.getSimpleName} command failed")
33+
sender ! e
34+
context.stop(self)
35+
}
36+
37+
val future = session.startCompression()
38+
future.setDoneCallback(responseCallback)
39+
future.setExceptionCallback(errorCallback)
40+
}
41+
42+
def waitCallback(sender: ActorRef): Receive = {
43+
case msg@Response.CompressResponse(_) =>
44+
logger.trace(s"CompressHandler respond to ${sender.path} with $msg")
45+
sender ! msg
46+
context.stop(self)
47+
}
48+
}

src/main/scala-2.12/com/linagora/gatling/imap/protocol/package.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ package object protocol {
8383

8484
case class SetQuota(userId: UserId, quotaRootAndResourcesLimits: String) extends Command
8585

86+
case class Compress(userId: UserId) extends Command
87+
8688
case class GetAcl(userId: UserId, mailbox: String) extends Command
8789

8890
case class MyRights(userId: UserId, mailbox: String) extends Command
@@ -173,6 +175,8 @@ package object protocol {
173175

174176
case class SetQuotaResponse(responses: ImapResponses) extends Response
175177

178+
case class CompressResponse(responses: ImapResponses) extends Response
179+
176180
case class AclResponse(responses: ImapResponses) extends Response
177181

178182
case class MyRightsResponse(responses: ImapResponses) extends Response
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.linagora.gatling.imap.scenario
2+
3+
import com.linagora.gatling.imap.PreDef._
4+
import io.gatling.core.Predef._
5+
import io.gatling.core.feeder.FeederBuilder
6+
import io.gatling.core.structure.ScenarioBuilder
7+
8+
object ImapCompressScenario {
9+
def apply(feeder: FeederBuilder): ScenarioBuilder =
10+
scenario("Imap")
11+
.feed(feeder)
12+
.exec(imap("Connect").connect()).exitHereIfFailed
13+
.exec(imap("compress").compress().check(ok))
14+
.exec(imap("noop").noop().check(ok))
15+
}

0 commit comments

Comments
 (0)