159 lines
No EOL
3.9 KiB
Scala
159 lines
No EOL
3.9 KiB
Scala
/**
|
|
* Copyright (C) 2009-2012 Typesafe Inc. <http://www.typesafe.com>
|
|
*/
|
|
package docs.testkit
|
|
|
|
import language.postfixOps
|
|
|
|
//#testkit-usage
|
|
import scala.util.Random
|
|
|
|
import org.scalatest.BeforeAndAfterAll
|
|
import org.scalatest.WordSpec
|
|
import org.scalatest.matchers.ShouldMatchers
|
|
|
|
import com.typesafe.config.ConfigFactory
|
|
|
|
import akka.actor.Actor
|
|
import akka.actor.ActorRef
|
|
import akka.actor.ActorSystem
|
|
import akka.actor.Props
|
|
import akka.testkit.DefaultTimeout
|
|
import akka.testkit.ImplicitSender
|
|
import akka.testkit.TestKit
|
|
import scala.concurrent.util.duration._
|
|
|
|
/**
|
|
* a Test to show some TestKit examples
|
|
*/
|
|
class TestKitUsageSpec
|
|
extends TestKit(ActorSystem("TestKitUsageSpec",
|
|
ConfigFactory.parseString(TestKitUsageSpec.config)))
|
|
with DefaultTimeout with ImplicitSender
|
|
with WordSpec with ShouldMatchers with BeforeAndAfterAll {
|
|
import TestKitUsageSpec._
|
|
|
|
val echoRef = system.actorOf(Props(new EchoActor))
|
|
val forwardRef = system.actorOf(Props(new ForwardingActor(testActor)))
|
|
val filterRef = system.actorOf(Props(new FilteringActor(testActor)))
|
|
val randomHead = Random.nextInt(6)
|
|
val randomTail = Random.nextInt(10)
|
|
val headList = Seq().padTo(randomHead, "0")
|
|
val tailList = Seq().padTo(randomTail, "1")
|
|
val seqRef =
|
|
system.actorOf(Props(new SequencingActor(testActor, headList, tailList)))
|
|
|
|
override def afterAll {
|
|
system.shutdown()
|
|
}
|
|
|
|
"An EchoActor" should {
|
|
"Respond with the same message it receives" in {
|
|
within(500 millis) {
|
|
echoRef ! "test"
|
|
expectMsg("test")
|
|
}
|
|
}
|
|
}
|
|
"A ForwardingActor" should {
|
|
"Forward a message it receives" in {
|
|
within(500 millis) {
|
|
forwardRef ! "test"
|
|
expectMsg("test")
|
|
}
|
|
}
|
|
}
|
|
"A FilteringActor" should {
|
|
"Filter all messages, except expected messagetypes it receives" in {
|
|
var messages = Seq[String]()
|
|
within(500 millis) {
|
|
filterRef ! "test"
|
|
expectMsg("test")
|
|
filterRef ! 1
|
|
expectNoMsg
|
|
filterRef ! "some"
|
|
filterRef ! "more"
|
|
filterRef ! 1
|
|
filterRef ! "text"
|
|
filterRef ! 1
|
|
|
|
receiveWhile(500 millis) {
|
|
case msg: String ⇒ messages = msg +: messages
|
|
}
|
|
}
|
|
messages.length should be(3)
|
|
messages.reverse should be(Seq("some", "more", "text"))
|
|
}
|
|
}
|
|
"A SequencingActor" should {
|
|
"receive an interesting message at some point " in {
|
|
within(500 millis) {
|
|
ignoreMsg {
|
|
case msg: String ⇒ msg != "something"
|
|
}
|
|
seqRef ! "something"
|
|
expectMsg("something")
|
|
ignoreMsg {
|
|
case msg: String ⇒ msg == "1"
|
|
}
|
|
expectNoMsg
|
|
ignoreNoMsg
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
object TestKitUsageSpec {
|
|
// Define your test specific configuration here
|
|
val config = """
|
|
akka {
|
|
loglevel = "WARNING"
|
|
}
|
|
"""
|
|
|
|
/**
|
|
* An Actor that echoes everything you send to it
|
|
*/
|
|
class EchoActor extends Actor {
|
|
def receive = {
|
|
case msg ⇒ sender ! msg
|
|
}
|
|
}
|
|
|
|
/**
|
|
* An Actor that forwards every message to a next Actor
|
|
*/
|
|
class ForwardingActor(next: ActorRef) extends Actor {
|
|
def receive = {
|
|
case msg ⇒ next ! msg
|
|
}
|
|
}
|
|
|
|
/**
|
|
* An Actor that only forwards certain messages to a next Actor
|
|
*/
|
|
class FilteringActor(next: ActorRef) extends Actor {
|
|
def receive = {
|
|
case msg: String ⇒ next ! msg
|
|
case _ ⇒ None
|
|
}
|
|
}
|
|
|
|
/**
|
|
* An actor that sends a sequence of messages with a random head list, an
|
|
* interesting value and a random tail list. The idea is that you would
|
|
* like to test that the interesting value is received and that you cant
|
|
* be bothered with the rest
|
|
*/
|
|
class SequencingActor(next: ActorRef, head: Seq[String], tail: Seq[String])
|
|
extends Actor {
|
|
def receive = {
|
|
case msg ⇒ {
|
|
head foreach { next ! _ }
|
|
next ! msg
|
|
tail foreach { next ! _ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//#testkit-usage |