Convert NodeStartupSpec to MultiNodeSpec. See #1948

This commit is contained in:
Patrik Nordwall 2012-05-23 16:35:42 +02:00
parent 63e4b6e96e
commit 3ab02e9519
5 changed files with 113 additions and 98 deletions

View file

@ -0,0 +1,87 @@
/**
* Copyright (C) 2009-2012 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.cluster
import com.typesafe.config.ConfigFactory
import akka.remote.testkit.MultiNodeConfig
import akka.remote.testkit.MultiNodeSpec
import akka.testkit._
object NodeStartupMultiJvmSpec extends MultiNodeConfig {
val first = role("first")
val second = role("second")
commonConfig(debugConfig(on = false).withFallback(ConfigFactory.parseString("""
# FIXME get rid of this hardcoded host:port
akka.cluster.node-to-join = "akka://MultiNodeSpec@localhost:2601"
""")))
nodeConfig(first, ConfigFactory.parseString("""
# FIXME get rid of this hardcoded port
akka.remote.netty.port=2601
"""))
}
class NodeStartupMultiJvmNode1 extends NodeStartupSpec
class NodeStartupMultiJvmNode2 extends NodeStartupSpec
class NodeStartupSpec extends MultiNodeSpec(NodeStartupMultiJvmSpec) with ImplicitSender {
import NodeStartupMultiJvmSpec._
override def initialParticipants = 2
var firstNode: Cluster = _
runOn(first) {
firstNode = Cluster(system)
}
"A first cluster node with a 'node-to-join' config set to empty string (singleton cluster)" must {
"be a singleton cluster when started up" taggedAs LongRunningTest in {
runOn(first) {
awaitCond(firstNode.isSingletonCluster)
}
testConductor.enter("done")
}
"be in 'Joining' phase when started up" taggedAs LongRunningTest in {
runOn(first) {
val members = firstNode.latestGossip.members
members.size must be(1)
val firstAddress = testConductor.getAddressFor(first).await
val joiningMember = members find (_.address == firstAddress)
joiningMember must not be (None)
joiningMember.get.status must be(MemberStatus.Joining)
}
testConductor.enter("done")
}
}
"A second cluster node with a 'node-to-join' config defined" must {
"join the other node cluster when sending a Join command" taggedAs LongRunningTest in {
runOn(second) {
// start cluster on second node, and join
Cluster(system)
}
runOn(first) {
val secondAddress = testConductor.getAddressFor(second).await
awaitCond {
firstNode.latestGossip.members.exists { member
member.address == secondAddress && member.status == MemberStatus.Up
}
}
firstNode.latestGossip.members.size must be(2)
}
testConductor.enter("done")
}
}
}

View file

@ -1,84 +0,0 @@
/**
* Copyright (C) 2009-2012 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.cluster
import java.net.InetSocketAddress
import akka.testkit._
import akka.dispatch._
import akka.actor._
import akka.remote._
import akka.util.duration._
import com.typesafe.config._
class NodeStartupSpec extends ClusterSpec with ImplicitSender {
val portPrefix = 8
var node0: Cluster = _
var node1: Cluster = _
var system0: ActorSystemImpl = _
var system1: ActorSystemImpl = _
try {
"A first cluster node with a 'node-to-join' config set to empty string (singleton cluster)" must {
system0 = ActorSystem("system0", ConfigFactory
.parseString("""
akka {
actor.provider = "akka.remote.RemoteActorRefProvider"
remote.netty.port=%d550
}""".format(portPrefix))
.withFallback(system.settings.config))
.asInstanceOf[ActorSystemImpl]
val remote0 = system0.provider.asInstanceOf[RemoteActorRefProvider]
node0 = Cluster(system0)
"be a singleton cluster when started up" taggedAs LongRunningTest in {
Thread.sleep(1.seconds.dilated.toMillis)
node0.isSingletonCluster must be(true)
}
"be in 'Joining' phase when started up" taggedAs LongRunningTest in {
val members = node0.latestGossip.members
val joiningMember = members find (_.address.port.get == 550.withPortPrefix)
joiningMember must be('defined)
joiningMember.get.status must be(MemberStatus.Joining)
}
}
"A second cluster node with a 'node-to-join' config defined" must {
"join the other node cluster when sending a Join command" taggedAs LongRunningTest in {
system1 = ActorSystem("system1", ConfigFactory
.parseString("""
akka {
actor.provider = "akka.remote.RemoteActorRefProvider"
remote.netty.port=%d551
cluster.node-to-join = "akka://system0@localhost:%d550"
}""".format(portPrefix, portPrefix))
.withFallback(system.settings.config))
.asInstanceOf[ActorSystemImpl]
val remote1 = system1.provider.asInstanceOf[RemoteActorRefProvider]
node1 = Cluster(system1)
Thread.sleep(10.seconds.dilated.toMillis) // give enough time for node1 to JOIN node0 and leader to move him to UP
val members = node0.latestGossip.members
val joiningMember = members find (_.address.port.get == 551.withPortPrefix)
joiningMember must be('defined)
joiningMember.get.status must be(MemberStatus.Up)
}
}
} catch {
case e: Exception
e.printStackTrace
fail(e.toString)
}
override def atTermination() {
if (node0 ne null) node0.shutdown()
if (system0 ne null) system0.shutdown()
if (node1 ne null) node1.shutdown()
if (system1 ne null) system1.shutdown()
}
}

View file

@ -1,3 +1,6 @@
/**
* Copyright (C) 2009-2012 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.remote.testconductor
import akka.remote.AkkaRemoteSpec
@ -16,17 +19,7 @@ import akka.remote.testkit.MultiNodeSpec
import akka.remote.testkit.MultiNodeConfig
object TestConductorMultiJvmSpec extends MultiNodeConfig {
commonConfig(ConfigFactory.parseString("""
# akka.loglevel = DEBUG
akka.remote {
log-received-messages = on
log-sent-messages = on
}
akka.actor.debug {
receive = on
fsm = on
}
"""))
commonConfig(debugConfig(on = true))
val master = role("master")
val slave = role("slave")

View file

@ -37,6 +37,25 @@ abstract class MultiNodeConfig {
*/
def nodeConfig(role: RoleName, config: Config): Unit = _nodeConf += role -> config
/**
* Include for verbose debug logging
* @param on when `true` debug Config is returned, otherwise empty Config
*/
def debugConfig(on: Boolean): Config =
if (on)
ConfigFactory.parseString("""
akka.loglevel = DEBUG
akka.remote {
log-received-messages = on
log-sent-messages = on
}
akka.actor.debug {
receive = on
fsm = on
}
""")
else ConfigFactory.empty
/**
* Construct a RoleName and return it, to be used as an identifier in the
* test. Registration of a role name creates a role which then needs to be

View file

@ -114,7 +114,7 @@ object AkkaBuild extends Build {
lazy val cluster = Project(
id = "akka-cluster",
base = file("akka-cluster"),
dependencies = Seq(remote, remote % "test->test", testkit % "test->test"),
dependencies = Seq(remote, remoteTests % "compile;test->test;multi-jvm->multi-jvm", testkit % "test->test"),
settings = defaultSettings ++ multiJvmSettings ++ Seq(
libraryDependencies ++= Dependencies.cluster,
// disable parallel tests