add test to ActorModelSpec
dispatcherShouldHandleQueueingFromMultipleThreads tests for possible race conditions in prohibiting multiple threads running the same actor concurrently
This commit is contained in:
parent
50b2c14235
commit
2deb47f8fa
3 changed files with 25 additions and 3 deletions
|
|
@ -26,6 +26,7 @@ object ActorModelSpec {
|
||||||
case class Meet(acknowledge: CountDownLatch, waitFor: CountDownLatch) extends ActorModelMessage
|
case class Meet(acknowledge: CountDownLatch, waitFor: CountDownLatch) extends ActorModelMessage
|
||||||
case class CountDownNStop(latch: CountDownLatch) extends ActorModelMessage
|
case class CountDownNStop(latch: CountDownLatch) extends ActorModelMessage
|
||||||
case class Wait(time: Long) extends ActorModelMessage
|
case class Wait(time: Long) extends ActorModelMessage
|
||||||
|
case class WaitAck(time: Long, latch: CountDownLatch) extends ActorModelMessage
|
||||||
case object Restart extends ActorModelMessage
|
case object Restart extends ActorModelMessage
|
||||||
|
|
||||||
val Ping = "Ping"
|
val Ping = "Ping"
|
||||||
|
|
@ -52,6 +53,7 @@ object ActorModelSpec {
|
||||||
case Await(latch) => ack; latch.await(); busy.switchOff()
|
case Await(latch) => ack; latch.await(); busy.switchOff()
|
||||||
case Meet(sign, wait) => ack; sign.countDown(); wait.await(); busy.switchOff()
|
case Meet(sign, wait) => ack; sign.countDown(); wait.await(); busy.switchOff()
|
||||||
case Wait(time) => ack; Thread.sleep(time); busy.switchOff()
|
case Wait(time) => ack; Thread.sleep(time); busy.switchOff()
|
||||||
|
case WaitAck(time, l) => ack; Thread.sleep(time); l.countDown; busy.switchOff()
|
||||||
case Reply(msg) => ack; self.reply(msg); busy.switchOff()
|
case Reply(msg) => ack; self.reply(msg); busy.switchOff()
|
||||||
case Reply_?(msg) => ack; self.reply_?(msg); busy.switchOff()
|
case Reply_?(msg) => ack; self.reply_?(msg); busy.switchOff()
|
||||||
case Forward(to,msg) => ack; to.forward(msg); busy.switchOff()
|
case Forward(to,msg) => ack; to.forward(msg); busy.switchOff()
|
||||||
|
|
@ -235,6 +237,26 @@ abstract class ActorModelSpec extends JUnitSuite {
|
||||||
assertRefDefaultZero(a)(registers = 1, unregisters = 1, msgsReceived = 3, msgsProcessed = 3)
|
assertRefDefaultZero(a)(registers = 1, unregisters = 1, msgsReceived = 3, msgsProcessed = 3)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test def dispatcherShouldHandleQueueingFromMultipleThreads {
|
||||||
|
implicit val dispatcher = newInterceptedDispatcher
|
||||||
|
val a = newTestActor
|
||||||
|
val counter = new CountDownLatch(200)
|
||||||
|
a.start
|
||||||
|
|
||||||
|
def start = spawn { for (i <- 1 to 20) { a ! WaitAck(1, counter) } }
|
||||||
|
for (i <- 1 to 10) { start }
|
||||||
|
assertCountDown(counter, 3000, "Should process 200 messages")
|
||||||
|
assertRefDefaultZero(a)(registers = 1, msgsReceived = 200, msgsProcessed = 200)
|
||||||
|
|
||||||
|
a.stop
|
||||||
|
}
|
||||||
|
|
||||||
|
def spawn(f : => Unit) = {
|
||||||
|
val thread = new Thread { override def run { f } }
|
||||||
|
thread.start
|
||||||
|
thread
|
||||||
|
}
|
||||||
|
|
||||||
@Test def dispatcherShouldProcessMessagesInParallel: Unit = {
|
@Test def dispatcherShouldProcessMessagesInParallel: Unit = {
|
||||||
implicit val dispatcher = newInterceptedDispatcher
|
implicit val dispatcher = newInterceptedDispatcher
|
||||||
val a, b = newTestActor.start
|
val a, b = newTestActor.start
|
||||||
|
|
@ -296,7 +318,7 @@ abstract class ActorModelSpec extends JUnitSuite {
|
||||||
}
|
}
|
||||||
for(run <- 1 to 3) {
|
for(run <- 1 to 3) {
|
||||||
flood(10000)
|
flood(10000)
|
||||||
await(dispatcher.stops.get == run)(withinMs = 10000)
|
await(dispatcher.stops.get == run)(withinMs = 11000)
|
||||||
assertDispatcher(dispatcher)(starts = run, stops = run)
|
assertDispatcher(dispatcher)(starts = run, stops = run)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -101,7 +101,7 @@ class CallingThreadDispatcher(val warnings: Boolean = true) extends MessageDispa
|
||||||
|
|
||||||
private[akka] override def shutdown {}
|
private[akka] override def shutdown {}
|
||||||
|
|
||||||
private[akka] override def timeoutMs = 0L
|
private[akka] override def timeoutMs = 100L
|
||||||
|
|
||||||
override def suspend(actor: ActorRef) {
|
override def suspend(actor: ActorRef) {
|
||||||
getMailbox(actor).suspended.switchOn
|
getMailbox(actor).suspended.switchOn
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package akka.testkit
|
||||||
|
|
||||||
import akka.actor.dispatch.ActorModelSpec
|
import akka.actor.dispatch.ActorModelSpec
|
||||||
|
|
||||||
class CallingThreadDispatcherTest extends ActorModelSpec {
|
class CallingThreadDispatcherModelSpec extends ActorModelSpec {
|
||||||
import ActorModelSpec._
|
import ActorModelSpec._
|
||||||
def newInterceptedDispatcher = new CallingThreadDispatcher with MessageDispatcherInterceptor
|
def newInterceptedDispatcher = new CallingThreadDispatcher with MessageDispatcherInterceptor
|
||||||
override def dispatcherShouldProcessMessagesInParallel {}
|
override def dispatcherShouldProcessMessagesInParallel {}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue