pekko/akka-remote-tests/src/multi-jvm/scala/akka/remote/RemoteDeliverySpec.scala
Johan Andrén a939e30b49 Fix artery test file leak #21484
* Include actor system name in artery dir path to ease debugging leaks
* Base class name changed to make actor system autonaming work
* Add shutdown hook directly in transport start
* Wait for completion in shutdown hook (actual leak fix)
2016-09-19 13:22:54 +02:00

86 lines
2.9 KiB
Scala

/**
* Copyright (C) 2009-2016 Lightbend Inc. <http://www.lightbend.com>
*/
package akka.remote
import scala.language.postfixOps
import scala.concurrent.duration._
import com.typesafe.config.ConfigFactory
import akka.actor.Actor
import akka.actor.ActorRef
import akka.actor.Props
import akka.remote.testconductor.RoleName
import akka.remote.testkit.MultiNodeConfig
import akka.remote.testkit.MultiNodeSpec
import akka.remote.testkit.STMultiNodeSpec
import akka.testkit._
import akka.actor.ActorIdentity
import akka.actor.Identify
class RemoteDeliveryConfig(artery: Boolean) extends MultiNodeConfig {
val first = role("first")
val second = role("second")
val third = role("third")
commonConfig(debugConfig(on = false).withFallback(
ConfigFactory.parseString(s"""
akka.remote.artery.enabled = $artery
""")).withFallback(RemotingMultiNodeSpec.arteryFlightRecordingConf))
}
class RemoteDeliveryMultiJvmNode1 extends RemoteDeliverySpec(new RemoteDeliveryConfig(artery = false))
class RemoteDeliveryMultiJvmNode2 extends RemoteDeliverySpec(new RemoteDeliveryConfig(artery = false))
class RemoteDeliveryMultiJvmNode3 extends RemoteDeliverySpec(new RemoteDeliveryConfig(artery = false))
class ArteryRemoteDeliveryMultiJvmNode1 extends RemoteDeliverySpec(new RemoteDeliveryConfig(artery = true))
class ArteryRemoteDeliveryMultiJvmNode2 extends RemoteDeliverySpec(new RemoteDeliveryConfig(artery = true))
class ArteryRemoteDeliveryMultiJvmNode3 extends RemoteDeliverySpec(new RemoteDeliveryConfig(artery = true))
object RemoteDeliverySpec {
final case class Letter(n: Int, route: List[ActorRef])
class Postman extends Actor {
def receive = {
case Letter(n, route) route.head ! Letter(n, route.tail)
}
}
}
abstract class RemoteDeliverySpec(multiNodeConfig: RemoteDeliveryConfig)
extends RemotingMultiNodeSpec(multiNodeConfig) {
import multiNodeConfig._
import RemoteDeliverySpec._
override def initialParticipants = roles.size
def identify(role: RoleName, actorName: String): ActorRef = within(10 seconds) {
system.actorSelection(node(role) / "user" / actorName) ! Identify(actorName)
expectMsgType[ActorIdentity].ref.get
}
"Remote message delivery" must {
"not drop messages under normal circumstances" in {
system.actorOf(Props[Postman], "postman-" + myself.name)
enterBarrier("actors-started")
runOn(first) {
val p1 = identify(first, "postman-first")
val p2 = identify(second, "postman-second")
val p3 = identify(third, "postman-third")
val route = p2 :: p3 :: p2 :: p3 :: testActor :: Nil
for (n 1 to 500) {
p1 ! Letter(n, route)
expectMsg(5.seconds, Letter(n, Nil))
// in case the loop count is increased it is good with some progress feedback
if (n % 10000 == 0) log.info("Passed [{}]", n)
}
}
enterBarrier("after-1")
}
}
}