diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinTwoClustersSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinTwoClustersSpec.scala index 87129a7a7c..4bbe703405 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinTwoClustersSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinTwoClustersSpec.scala @@ -1,90 +1,90 @@ -///** -// * Copyright (C) 2009-2012 Typesafe Inc. -// */ -// -//package akka.cluster -// -//import org.scalatest.BeforeAndAfter -//import com.typesafe.config.ConfigFactory -//import akka.remote.testkit.MultiNodeConfig -//import akka.remote.testkit.MultiNodeSpec -//import akka.testkit._ -// -//object JoinTwoClustersMultiJvmSpec extends MultiNodeConfig { -// val a1 = role("a1") -// val a2 = role("a2") -// val b1 = role("b1") -// val b2 = role("b2") -// val c1 = role("c1") -// val c2 = role("c2") -// -// commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig)) -// -//} -// -//class JoinTwoClustersMultiJvmNode1 extends JoinTwoClustersSpec -//class JoinTwoClustersMultiJvmNode2 extends JoinTwoClustersSpec -//class JoinTwoClustersMultiJvmNode3 extends JoinTwoClustersSpec -//class JoinTwoClustersMultiJvmNode4 extends JoinTwoClustersSpec -//class JoinTwoClustersMultiJvmNode5 extends JoinTwoClustersSpec -//class JoinTwoClustersMultiJvmNode6 extends JoinTwoClustersSpec -// -//abstract class JoinTwoClustersSpec extends MultiNodeSpec(JoinTwoClustersMultiJvmSpec) with MultiNodeClusterSpec with ImplicitSender with BeforeAndAfter { -// import JoinTwoClustersMultiJvmSpec._ -// -// override def initialParticipants = 6 -// -// after { -// testConductor.enter("after") -// } -// -// val a1Address = node(a1).address -// val b1Address = node(b1).address -// val c1Address = node(c1).address -// -// "Three different clusters (A, B and C)" must { -// -// "be able to 'elect' a single leader after joining (A -> B)" taggedAs LongRunningTest in { -// -// runOn(a1, a2) { -// cluster.join(a1Address) -// } -// runOn(b1, b2) { -// cluster.join(b1Address) -// } -// runOn(c1, c2) { -// cluster.join(c1Address) -// } -// -// awaitUpConvergence(numberOfMembers = 2) -// -// assertLeader(a1, a2) -// assertLeader(b1, b2) -// assertLeader(c1, c2) -// -// runOn(b2) { -// cluster.join(a1Address) -// } -// -// runOn(a1, a2, b1, b2) { -// awaitUpConvergence(numberOfMembers = 4) -// } -// -// assertLeader(a1, a2, b1, b2) -// assertLeader(c1, c2) -// -// } -// -// "be able to 'elect' a single leader after joining (C -> A + B)" taggedAs LongRunningTest in { -// -// runOn(b2) { -// cluster.join(c1Address) -// } -// -// awaitUpConvergence(numberOfMembers = 6) -// -// assertLeader(a1, a2, b1, b2, c1, c2) -// } -// } -// -//} +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + +package akka.cluster + +import org.scalatest.BeforeAndAfter +import com.typesafe.config.ConfigFactory +import akka.remote.testkit.MultiNodeConfig +import akka.remote.testkit.MultiNodeSpec +import akka.testkit._ + +object JoinTwoClustersMultiJvmSpec extends MultiNodeConfig { + val a1 = role("a1") + val a2 = role("a2") + val b1 = role("b1") + val b2 = role("b2") + val c1 = role("c1") + val c2 = role("c2") + + commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig)) + +} + +class JoinTwoClustersMultiJvmNode1 extends JoinTwoClustersSpec +class JoinTwoClustersMultiJvmNode2 extends JoinTwoClustersSpec +class JoinTwoClustersMultiJvmNode3 extends JoinTwoClustersSpec +class JoinTwoClustersMultiJvmNode4 extends JoinTwoClustersSpec +class JoinTwoClustersMultiJvmNode5 extends JoinTwoClustersSpec +class JoinTwoClustersMultiJvmNode6 extends JoinTwoClustersSpec + +abstract class JoinTwoClustersSpec extends MultiNodeSpec(JoinTwoClustersMultiJvmSpec) with MultiNodeClusterSpec with ImplicitSender with BeforeAndAfter { + import JoinTwoClustersMultiJvmSpec._ + + override def initialParticipants = 6 + + after { + testConductor.enter("after") + } + + val a1Address = node(a1).address + val b1Address = node(b1).address + val c1Address = node(c1).address + + "Three different clusters (A, B and C)" must { + + "be able to 'elect' a single leader after joining (A -> B)" taggedAs LongRunningTest in { + + runOn(a1, a2) { + cluster.join(a1Address) + } + runOn(b1, b2) { + cluster.join(b1Address) + } + runOn(c1, c2) { + cluster.join(c1Address) + } + + awaitUpConvergence(numberOfMembers = 2) + + assertLeader(a1, a2) + assertLeader(b1, b2) + assertLeader(c1, c2) + + runOn(b2) { + cluster.join(a1Address) + } + + runOn(a1, a2, b1, b2) { + awaitUpConvergence(numberOfMembers = 4) + } + + assertLeader(a1, a2, b1, b2) + assertLeader(c1, c2) + + } + + "be able to 'elect' a single leader after joining (C -> A + B)" taggedAs LongRunningTest in { + + runOn(b2) { + cluster.join(c1Address) + } + + awaitUpConvergence(numberOfMembers = 6) + + assertLeader(a1, a2, b1, b2, c1, c2) + } + } + +} diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerSpec.scala index 6bb0f556d5..64019c102c 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/MembershipChangeListenerSpec.scala @@ -1,77 +1,77 @@ -///** -// * Copyright (C) 2009-2012 Typesafe Inc. -// */ -//package akka.cluster -// -//import scala.collection.immutable.SortedSet -//import org.scalatest.BeforeAndAfter -//import com.typesafe.config.ConfigFactory -//import akka.remote.testkit.MultiNodeConfig -//import akka.remote.testkit.MultiNodeSpec -//import akka.testkit._ -// -//object MembershipChangeListenerMultiJvmSpec extends MultiNodeConfig { -// val first = role("first") -// val second = role("second") -// val third = role("third") -// -// commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig)) -// -//} -// -//class MembershipChangeListenerMultiJvmNode1 extends MembershipChangeListenerSpec -//class MembershipChangeListenerMultiJvmNode2 extends MembershipChangeListenerSpec -//class MembershipChangeListenerMultiJvmNode3 extends MembershipChangeListenerSpec -// -//abstract class MembershipChangeListenerSpec extends MultiNodeSpec(MembershipChangeListenerMultiJvmSpec) -// with MultiNodeClusterSpec with ImplicitSender with BeforeAndAfter { -// import MembershipChangeListenerMultiJvmSpec._ -// -// override def initialParticipants = 3 -// -// after { -// testConductor.enter("after") -// } -// -// "A set of connected cluster systems" must { -// -// val firstAddress = node(first).address -// val secondAddress = node(second).address -// -// "(when two systems) after cluster convergence updates the membership table then all MembershipChangeListeners should be triggered" taggedAs LongRunningTest in { -// -// runOn(first, second) { -// cluster.join(firstAddress) -// val latch = TestLatch() -// cluster.registerListener(new MembershipChangeListener { -// def notify(members: SortedSet[Member]) { -// if (members.size == 2 && members.forall(_.status == MemberStatus.Up)) -// latch.countDown() -// } -// }) -// latch.await -// cluster.convergence.isDefined must be(true) -// } -// -// } -// -// "(when three systems) after cluster convergence updates the membership table then all MembershipChangeListeners should be triggered" taggedAs LongRunningTest in { -// -// runOn(third) { -// cluster.join(firstAddress) -// } -// -// val latch = TestLatch() -// cluster.registerListener(new MembershipChangeListener { -// def notify(members: SortedSet[Member]) { -// if (members.size == 3 && members.forall(_.status == MemberStatus.Up)) -// latch.countDown() -// } -// }) -// latch.await -// cluster.convergence.isDefined must be(true) -// -// } -// } -// -//} +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ +package akka.cluster + +import scala.collection.immutable.SortedSet +import org.scalatest.BeforeAndAfter +import com.typesafe.config.ConfigFactory +import akka.remote.testkit.MultiNodeConfig +import akka.remote.testkit.MultiNodeSpec +import akka.testkit._ + +object MembershipChangeListenerMultiJvmSpec extends MultiNodeConfig { + val first = role("first") + val second = role("second") + val third = role("third") + + commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig)) + +} + +class MembershipChangeListenerMultiJvmNode1 extends MembershipChangeListenerSpec +class MembershipChangeListenerMultiJvmNode2 extends MembershipChangeListenerSpec +class MembershipChangeListenerMultiJvmNode3 extends MembershipChangeListenerSpec + +abstract class MembershipChangeListenerSpec extends MultiNodeSpec(MembershipChangeListenerMultiJvmSpec) + with MultiNodeClusterSpec with ImplicitSender with BeforeAndAfter { + import MembershipChangeListenerMultiJvmSpec._ + + override def initialParticipants = 3 + + after { + testConductor.enter("after") + } + + "A set of connected cluster systems" must { + + val firstAddress = node(first).address + val secondAddress = node(second).address + + "(when two systems) after cluster convergence updates the membership table then all MembershipChangeListeners should be triggered" taggedAs LongRunningTest in { + + runOn(first, second) { + cluster.join(firstAddress) + val latch = TestLatch() + cluster.registerListener(new MembershipChangeListener { + def notify(members: SortedSet[Member]) { + if (members.size == 2 && members.forall(_.status == MemberStatus.Up)) + latch.countDown() + } + }) + latch.await + cluster.convergence.isDefined must be(true) + } + + } + + "(when three systems) after cluster convergence updates the membership table then all MembershipChangeListeners should be triggered" taggedAs LongRunningTest in { + + runOn(third) { + cluster.join(firstAddress) + } + + val latch = TestLatch() + cluster.registerListener(new MembershipChangeListener { + def notify(members: SortedSet[Member]) { + if (members.size == 3 && members.forall(_.status == MemberStatus.Up)) + latch.countDown() + } + }) + latch.await + cluster.convergence.isDefined must be(true) + + } + } + +} diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeMembershipSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeMembershipSpec.scala index 21defd1d97..f96265ac5a 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeMembershipSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeMembershipSpec.scala @@ -1,70 +1,70 @@ -///** -// * Copyright (C) 2009-2012 Typesafe Inc. -// */ -//package akka.cluster -// -//import com.typesafe.config.ConfigFactory -//import org.scalatest.BeforeAndAfter -//import akka.remote.testkit.MultiNodeConfig -//import akka.remote.testkit.MultiNodeSpec -//import akka.testkit._ -// -//object NodeMembershipMultiJvmSpec extends MultiNodeConfig { -// val first = role("first") -// val second = role("second") -// val third = role("third") -// -// commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig)) -// -//} -// -//class NodeMembershipMultiJvmNode1 extends NodeMembershipSpec -//class NodeMembershipMultiJvmNode2 extends NodeMembershipSpec -//class NodeMembershipMultiJvmNode3 extends NodeMembershipSpec -// -//abstract class NodeMembershipSpec extends MultiNodeSpec(NodeMembershipMultiJvmSpec) with MultiNodeClusterSpec with ImplicitSender with BeforeAndAfter { -// import NodeMembershipMultiJvmSpec._ -// -// override def initialParticipants = 3 -// -// after { -// testConductor.enter("after") -// } -// -// val firstAddress = node(first).address -// val secondAddress = node(second).address -// val thirdAddress = node(third).address -// -// "A set of connected cluster systems" must { -// -// "(when two systems) start gossiping to each other so that both systems gets the same gossip info" taggedAs LongRunningTest in { -// -// runOn(first, second) { -// cluster.join(firstAddress) -// awaitCond(cluster.latestGossip.members.size == 2) -// assertMembers(cluster.latestGossip.members, firstAddress, secondAddress) -// awaitCond { -// cluster.latestGossip.members.forall(_.status == MemberStatus.Up) -// } -// awaitCond(cluster.convergence.isDefined) -// } -// -// } -// -// "(when three systems) start gossiping to each other so that both systems gets the same gossip info" taggedAs LongRunningTest in { -// -// runOn(third) { -// cluster.join(firstAddress) -// } -// -// awaitCond(cluster.latestGossip.members.size == 3) -// assertMembers(cluster.latestGossip.members, firstAddress, secondAddress, thirdAddress) -// awaitCond { -// cluster.latestGossip.members.forall(_.status == MemberStatus.Up) -// } -// awaitCond(cluster.convergence.isDefined) -// -// } -// } -// -//} +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ +package akka.cluster + +import com.typesafe.config.ConfigFactory +import org.scalatest.BeforeAndAfter +import akka.remote.testkit.MultiNodeConfig +import akka.remote.testkit.MultiNodeSpec +import akka.testkit._ + +object NodeMembershipMultiJvmSpec extends MultiNodeConfig { + val first = role("first") + val second = role("second") + val third = role("third") + + commonConfig(debugConfig(on = false).withFallback(MultiNodeClusterSpec.clusterConfig)) + +} + +class NodeMembershipMultiJvmNode1 extends NodeMembershipSpec +class NodeMembershipMultiJvmNode2 extends NodeMembershipSpec +class NodeMembershipMultiJvmNode3 extends NodeMembershipSpec + +abstract class NodeMembershipSpec extends MultiNodeSpec(NodeMembershipMultiJvmSpec) with MultiNodeClusterSpec with ImplicitSender with BeforeAndAfter { + import NodeMembershipMultiJvmSpec._ + + override def initialParticipants = 3 + + after { + testConductor.enter("after") + } + + val firstAddress = node(first).address + val secondAddress = node(second).address + val thirdAddress = node(third).address + + "A set of connected cluster systems" must { + + "(when two systems) start gossiping to each other so that both systems gets the same gossip info" taggedAs LongRunningTest in { + + runOn(first, second) { + cluster.join(firstAddress) + awaitCond(cluster.latestGossip.members.size == 2) + assertMembers(cluster.latestGossip.members, firstAddress, secondAddress) + awaitCond { + cluster.latestGossip.members.forall(_.status == MemberStatus.Up) + } + awaitCond(cluster.convergence.isDefined) + } + + } + + "(when three systems) start gossiping to each other so that both systems gets the same gossip info" taggedAs LongRunningTest in { + + runOn(third) { + cluster.join(firstAddress) + } + + awaitCond(cluster.latestGossip.members.size == 3) + assertMembers(cluster.latestGossip.members, firstAddress, secondAddress, thirdAddress) + awaitCond { + cluster.latestGossip.members.forall(_.status == MemberStatus.Up) + } + awaitCond(cluster.convergence.isDefined) + + } + } + +} diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeStartupSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeStartupSpec.scala index ff4c06215d..65cd7891a9 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeStartupSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/NodeStartupSpec.scala @@ -1,74 +1,74 @@ -///** -// * Copyright (C) 2009-2012 Typesafe Inc. -// */ -//package akka.cluster -// -//import com.typesafe.config.ConfigFactory -//import org.scalatest.BeforeAndAfter -//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(MultiNodeClusterSpec.clusterConfig)) -// -//} -// -//class NodeStartupMultiJvmNode1 extends NodeStartupSpec -//class NodeStartupMultiJvmNode2 extends NodeStartupSpec -// -//abstract class NodeStartupSpec extends MultiNodeSpec(NodeStartupMultiJvmSpec) with MultiNodeClusterSpec with ImplicitSender with BeforeAndAfter { -// import NodeStartupMultiJvmSpec._ -// -// override def initialParticipants = 2 -// -// after { -// testConductor.enter("after") -// } -// -// val firstAddress = node(first).address -// val secondAddress = node(second).address -// -// "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(cluster.isSingletonCluster) -// // FIXME #2117 singletonCluster should reach convergence -// //awaitCond(cluster.convergence.isDefined) -// } -// } -// -// "be in 'Joining' phase when started up" taggedAs LongRunningTest in { -// runOn(first) { -// val members = cluster.latestGossip.members -// members.size must be(1) -// -// val joiningMember = members find (_.address == firstAddress) -// joiningMember must not be (None) -// joiningMember.get.status must be(MemberStatus.Joining) -// } -// } -// } -// -// "A second cluster node" must { -// "join the other node cluster when sending a Join command" taggedAs LongRunningTest in { -// -// runOn(second) { -// cluster.join(firstAddress) -// } -// -// awaitCond { -// cluster.latestGossip.members.exists { member ⇒ -// member.address == secondAddress && member.status == MemberStatus.Up -// } -// } -// cluster.latestGossip.members.size must be(2) -// awaitCond(cluster.convergence.isDefined) -// } -// } -// -//} +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ +package akka.cluster + +import com.typesafe.config.ConfigFactory +import org.scalatest.BeforeAndAfter +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(MultiNodeClusterSpec.clusterConfig)) + +} + +class NodeStartupMultiJvmNode1 extends NodeStartupSpec +class NodeStartupMultiJvmNode2 extends NodeStartupSpec + +abstract class NodeStartupSpec extends MultiNodeSpec(NodeStartupMultiJvmSpec) with MultiNodeClusterSpec with ImplicitSender with BeforeAndAfter { + import NodeStartupMultiJvmSpec._ + + override def initialParticipants = 2 + + after { + testConductor.enter("after") + } + + val firstAddress = node(first).address + val secondAddress = node(second).address + + "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(cluster.isSingletonCluster) + // FIXME #2117 singletonCluster should reach convergence + //awaitCond(cluster.convergence.isDefined) + } + } + + "be in 'Joining' phase when started up" taggedAs LongRunningTest in { + runOn(first) { + val members = cluster.latestGossip.members + members.size must be(1) + + val joiningMember = members find (_.address == firstAddress) + joiningMember must not be (None) + joiningMember.get.status must be(MemberStatus.Joining) + } + } + } + + "A second cluster node" must { + "join the other node cluster when sending a Join command" taggedAs LongRunningTest in { + + runOn(second) { + cluster.join(firstAddress) + } + + awaitCond { + cluster.latestGossip.members.exists { member ⇒ + member.address == secondAddress && member.status == MemberStatus.Up + } + } + cluster.latestGossip.members.size must be(2) + awaitCond(cluster.convergence.isDefined) + } + } + +}