Class MultiNodeSpec

java.lang.Object
org.apache.pekko.testkit.TestKit
org.apache.pekko.remote.testkit.MultiNodeSpec
All Implemented Interfaces:
MultiNodeSpecCallbacks, TestKitBase

public abstract class MultiNodeSpec extends TestKit implements MultiNodeSpecCallbacks
Note: To be able to run tests with everything ignored or excluded by tags you must not use testconductor, or helper methods that use testconductor, from the constructor of your test class. Otherwise the controller node might be shutdown before other nodes have completed and you will see errors like: AskTimeoutException: sending to terminated ref breaks promises. Using lazy val is fine.
  • Constructor Details

    • MultiNodeSpec

      public MultiNodeSpec(RoleName myself, ActorSystem _system, scala.collection.immutable.Seq<RoleName> _roles, scala.Function1<RoleName,scala.collection.immutable.Seq<String>> deployments)
    • MultiNodeSpec

      public MultiNodeSpec(MultiNodeConfig config, scala.Function1<com.typesafe.config.Config,ActorSystem> actorSystemCreator)
      Constructor for using arbitrary logic to create the actor system used in the multi node spec (the Config passed to the creator must be used in the created actor system for the multi node tests to work)
    • MultiNodeSpec

      public MultiNodeSpec(MultiNodeConfig config)
  • Method Details

    • maxNodes

      public static int maxNodes()
      Number of nodes node taking part in this test.

      
       -Dmultinode.max-nodes=4
       
    • selfName

      public static String selfName()
      Name (or IP address; must be resolvable using InetAddress.getByName) of the host this node is running on.

      
       -Dmultinode.host=host.example.com
       

      InetAddress.getLocalHost.getHostAddress is used if empty or "localhost" is defined as system property "multinode.host".

    • tcpPort

      public static int tcpPort()
      TCP Port number to be used when running tests on TCP. 0 means a random port.

      
       -Dmultinode.port=0
       
    • udpPort

      public static scala.Option<Object> udpPort()
      UDP Port number to be used when running tests on UDP. 0 means a random port.

      
       -Dmultinode.udp.port=0
       
    • selfPort

      public static int selfPort()
      Port number of this node.

      This is defined in function of property multinode.protocol. If set to 'udp', udpPort will be used. If unset or any other value, it will default to tcpPort.

    • serverName

      public static String serverName()
      Name (or IP address; must be resolvable using InetAddress.getByName) of the host that the server node is running on.

      
       -Dmultinode.server-host=server.example.com
       
    • serverPort

      public static int serverPort()
      Port number of the node that's running the server system. Defaults to 4711.

      
       -Dmultinode.server-port=4711
       
    • selfIndex

      public static Integer selfIndex()
      Index of this node in the roles sequence. The TestConductor is started in &ldquo;controller&rdquo; mode on selfIndex 0, i.e. there you can inject failures and shutdown other nodes etc.

      
       -Dmultinode.index=0
       
    • configureNextPortIfFixed

      public static com.typesafe.config.Config configureNextPortIfFixed(com.typesafe.config.Config config)
    • myself

      public RoleName myself()
    • log

      public LoggingAdapter log()
    • awaitHelper

      public <T> MultiNodeSpec.AwaitHelper<T> awaitHelper(scala.concurrent.Awaitable<T> w)
      Enrich .await() onto all Awaitables, using remaining duration from the innermost enclosing within block or QueryTimeout.
    • multiNodeSpecBeforeAll

      public final void multiNodeSpecBeforeAll()
      Description copied from interface: MultiNodeSpecCallbacks
      Call this before the start of the test run. NOT before every test case.
      Specified by:
      multiNodeSpecBeforeAll in interface MultiNodeSpecCallbacks
    • multiNodeSpecAfterAll

      public final void multiNodeSpecAfterAll()
      Description copied from interface: MultiNodeSpecCallbacks
      Call this after the all test cases have run. NOT after every test case.
      Specified by:
      multiNodeSpecAfterAll in interface MultiNodeSpecCallbacks
    • shutdownTimeout

      public scala.concurrent.duration.FiniteDuration shutdownTimeout()
    • verifySystemShutdown

      public boolean verifySystemShutdown()
      Override this and return true to assert that the shutdown of the ActorSystem was done properly.
    • atStartup

      protected void atStartup()
      Override this method to do something when the whole test is starting up.
    • afterTermination

      protected void afterTermination()
      Override this method to do something when the whole test is terminating.
    • roles

      public scala.collection.immutable.Seq<RoleName> roles()
      All registered roles
    • initialParticipants

      public abstract int initialParticipants()
      TO BE DEFINED BY USER: Defines the number of participants required for starting the test. This might not be equals to the number of nodes available to the test.

      Must be a def:

      
       def initialParticipants = 5
       
    • testConductor

      public TestConductorExt testConductor()
      Access to the barriers, failure injection, etc. The extension will have been started either in Conductor or Player mode when the constructor of MultiNodeSpec finishes, i.e. do not call the start*() methods yourself!
    • testConductor_$eq

      public void testConductor_$eq(TestConductorExt x$1)
    • runOn

      public void runOn(scala.collection.immutable.Seq<RoleName> nodes, scala.Function0<scala.runtime.BoxedUnit> thunk)
      Execute the given block of code only on the given nodes (names according to the roleMap).
    • isNode

      public boolean isNode(scala.collection.immutable.Seq<RoleName> nodes)
      Verify that the running node matches one of the given nodes
    • enterBarrier

      public void enterBarrier(scala.collection.immutable.Seq<String> name)
      Enter the named barriers in the order given. Use the remaining duration from the innermost enclosing within block or the default BarrierTimeout.
    • enterBarrier

      public void enterBarrier(scala.concurrent.duration.FiniteDuration max, scala.collection.immutable.Seq<String> name)
      Enter the named barriers in the order given. Use the remaining duration from the innermost enclosing within block or the passed max timeout.

      Note that the max timeout is scaled using Duration.dilated, which uses the configuration entry "pekko.test.timefactor".

    • node

      public ActorPath node(RoleName role)
      Query the controller for the transport address of the given node (by role name) and return that as an ActorPath for easy composition:

      
       val serviceA = system.actorSelection(node("master") / "user" / "serviceA")
       
    • muteDeadLetters

      public void muteDeadLetters(scala.collection.immutable.Seq<Class<?>> messageClasses, ActorSystem sys)
    • muteDeadLetters$default$2

      public ActorSystem muteDeadLetters$default$2(scala.collection.immutable.Seq<Class<?>> messageClasses)
    • attachConductor

      protected void attachConductor(TestConductorExt tc)
    • injectDeployments

      protected void injectDeployments(ActorSystem sys, RoleName role)
    • myAddress

      protected Address myAddress()
    • startNewSystem

      protected ActorSystem startNewSystem()
      This method starts a new ActorSystem with the same configuration as the previous one on the current node, including deployments. It also creates a new TestConductor client and registers itself with the conductor so that it is possible to use barriers etc. normally after this method has been called.

      NOTICE: you MUST start a new system before trying to enter a barrier or otherwise using the TestConductor after having terminated this node&rsquo;s system.