org.apache.pekko.testkit.TestFSMRef.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of pekko-testkit_2.13 Show documentation
Show all versions of pekko-testkit_2.13 Show documentation
Apache Pekko is a toolkit for building highly concurrent, distributed, and resilient message-driven applications for Java and Scala.
The newest version!
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* license agreements; and to You under the Apache License, version 2.0:
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* This file is part of the Apache Pekko project, which was derived from Akka.
*/
/*
* Copyright (C) 2009-2022 Lightbend Inc.
*/
package org.apache.pekko.testkit
import scala.concurrent.duration.FiniteDuration
import scala.reflect.ClassTag
import org.apache.pekko
import pekko.actor._
/**
* This is a specialized form of the TestActorRef with support for querying and
* setting the state of a FSM. Use a LoggingFSM with this class if you also
* need to inspect event traces.
*
*
* val fsm = TestFSMRef(new Actor with LoggingFSM[Int, Null] {
* override def logDepth = 12
* startWith(1, null)
* when(1) {
* case Event("hello", _) => goto(2)
* }
* when(2) {
* case Event("world", _) => goto(1)
* }
* })
* assert (fsm.stateName == 1)
* fsm ! "hallo"
* assert (fsm.stateName == 2)
* assert (fsm.underlyingActor.getLog == IndexedSeq(FSMLogEntry(1, null, "hallo")))
*
*/
class TestFSMRef[S, D, T <: Actor](system: ActorSystem, props: Props, supervisor: ActorRef, name: String)(
implicit ev: T <:< FSM[S, D])
extends TestActorRef[T](system, props, supervisor, name) {
private def fsm: T = underlyingActor
/**
* Get current state name of this FSM.
*/
def stateName: S = fsm.stateName
/**
* Get current state data of this FSM.
*/
def stateData: D = fsm.stateData
/**
* Change FSM state; any value left out defaults to the current FSM state
* (timeout defaults to None). This method is directly equivalent to a
* corresponding transition initiated from within the FSM, including timeout
* and stop handling.
*/
def setState(
stateName: S = fsm.stateName,
stateData: D = fsm.stateData,
timeout: FiniteDuration = null,
stopReason: Option[FSM.Reason] = None): Unit = {
fsm.applyState(FSM.State(stateName, stateData, Option(timeout), stopReason))
}
/**
* Proxy for [[pekko.actor.FSM#startTimerWithFixedDelay]].
*/
def startTimerWithFixedDelay(name: String, msg: Any, delay: FiniteDuration): Unit =
fsm.startTimerWithFixedDelay(name, msg, delay)
/**
* Proxy for [[pekko.actor.FSM#startTimerAtFixedRate]].
*/
def startTimerAtFixedRate(name: String, msg: Any, interval: FiniteDuration): Unit =
fsm.startTimerAtFixedRate(name, msg, interval)
/**
* Proxy for [[pekko.actor.FSM#startSingleTimer]].
*/
def startSingleTimer(name: String, msg: Any, delay: FiniteDuration): Unit =
fsm.startSingleTimer(name, msg, delay)
/**
* Proxy for [[pekko.actor.FSM#setTimer]].
*/
@deprecated(
"Use startTimerWithFixedDelay or startTimerAtFixedRate instead. This has the same semantics as " +
"startTimerAtFixedRate, but startTimerWithFixedDelay is often preferred.",
since = "Akka 2.6.0")
def setTimer(name: String, msg: Any, timeout: FiniteDuration, repeat: Boolean = false): Unit = {
fsm.setTimer(name, msg, timeout, repeat)
}
/**
* Proxy for [[pekko.actor.FSM#cancelTimer]].
*/
def cancelTimer(name: String): Unit = { fsm.cancelTimer(name) }
/**
* Proxy for [[pekko.actor.FSM#isStateTimerActive]].
*/
def isTimerActive(name: String) = fsm.isTimerActive(name)
/**
* Proxy for [[pekko.actor.FSM#isStateTimerActive]].
*/
def isStateTimerActive = fsm.isStateTimerActive
}
object TestFSMRef {
def apply[S, D, T <: Actor: ClassTag](
factory: => T)(implicit ev: T <:< FSM[S, D], system: ActorSystem): TestFSMRef[S, D, T] = {
val impl = system.asInstanceOf[ActorSystemImpl]
new TestFSMRef(impl, Props(factory), impl.guardian.asInstanceOf[InternalActorRef], TestActorRef.randomName)
}
def apply[S, D, T <: Actor: ClassTag](factory: => T, name: String)(
implicit ev: T <:< FSM[S, D],
system: ActorSystem): TestFSMRef[S, D, T] = {
val impl = system.asInstanceOf[ActorSystemImpl]
new TestFSMRef(impl, Props(factory), impl.guardian.asInstanceOf[InternalActorRef], name)
}
def apply[S, D, T <: Actor: ClassTag](factory: => T, supervisor: ActorRef, name: String)(
implicit ev: T <:< FSM[S, D],
system: ActorSystem): TestFSMRef[S, D, T] = {
val impl = system.asInstanceOf[ActorSystemImpl]
new TestFSMRef(impl, Props(factory), supervisor.asInstanceOf[InternalActorRef], name)
}
def apply[S, D, T <: Actor: ClassTag](factory: => T, supervisor: ActorRef)(
implicit ev: T <:< FSM[S, D],
system: ActorSystem): TestFSMRef[S, D, T] = {
val impl = system.asInstanceOf[ActorSystemImpl]
new TestFSMRef(impl, Props(factory), supervisor.asInstanceOf[InternalActorRef], TestActorRef.randomName)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy