Improve MultiNodeSpec ifNode syntax. #2126

This commit is contained in:
Björn Antonsson 2012-10-31 16:37:03 +01:00
parent b862ec97f5
commit 977194ff8e
4 changed files with 13 additions and 16 deletions

View file

@ -148,7 +148,7 @@ abstract class LargeClusterSpec
runOn(runOnRoles: _*) { runOn(runOnRoles: _*) {
systems.size must be(nodesPerDatacenter) // make sure it is initialized systems.size must be(nodesPerDatacenter) // make sure it is initialized
val clusterNodes = ifNode(from)(joiningClusterNodes)(systems.map(Cluster(_)).toSet) val clusterNodes = if(isNode(from)) joiningClusterNodes else systems.map(Cluster(_)).toSet
val startGossipCounts = Map.empty[Cluster, Long] ++ val startGossipCounts = Map.empty[Cluster, Long] ++
clusterNodes.map(c (c -> c.readView.latestStats.receivedGossipCount)) clusterNodes.map(c (c -> c.readView.latestStats.receivedGossipCount))
def gossipCount(c: Cluster): Long = { def gossipCount(c: Cluster): Long = {
@ -260,7 +260,7 @@ abstract class LargeClusterSpec
if (bulk.nonEmpty) { if (bulk.nonEmpty) {
val totalNodes = nodesPerDatacenter * 4 + bulk.size val totalNodes = nodesPerDatacenter * 4 + bulk.size
within(expectedMaxDuration(totalNodes)) { within(expectedMaxDuration(totalNodes)) {
val joiningClusters = ifNode(fifthDatacenter)(bulk.map(Cluster(_)).toSet)(Set.empty) val joiningClusters = if(isNode(fifthDatacenter)) bulk.map(Cluster(_)).toSet else Set.empty[Cluster]
join(joiningClusters, from = fifthDatacenter, to = firstDatacenter, totalNodes, join(joiningClusters, from = fifthDatacenter, to = firstDatacenter, totalNodes,
runOnRoles = firstDatacenter, secondDatacenter, thirdDatacenter, fourthDatacenter, fifthDatacenter) runOnRoles = firstDatacenter, secondDatacenter, thirdDatacenter, fourthDatacenter, fifthDatacenter)
enterBarrier("fifth-datacenter-joined-" + bulk.size) enterBarrier("fifth-datacenter-joined-" + bulk.size)
@ -270,7 +270,7 @@ abstract class LargeClusterSpec
for (i 0 until oneByOne.size) { for (i 0 until oneByOne.size) {
val totalNodes = nodesPerDatacenter * 4 + bulk.size + i + 1 val totalNodes = nodesPerDatacenter * 4 + bulk.size + i + 1
within(expectedMaxDuration(totalNodes)) { within(expectedMaxDuration(totalNodes)) {
val joiningClusters = ifNode(fifthDatacenter)(Set(Cluster(oneByOne(i))))(Set.empty) val joiningClusters = if(isNode(fifthDatacenter)) Set(Cluster(oneByOne(i))) else Set.empty[Cluster]
join(joiningClusters, from = fifthDatacenter, to = firstDatacenter, totalNodes, join(joiningClusters, from = fifthDatacenter, to = firstDatacenter, totalNodes,
runOnRoles = firstDatacenter, secondDatacenter, thirdDatacenter, fourthDatacenter, fifthDatacenter) runOnRoles = firstDatacenter, secondDatacenter, thirdDatacenter, fourthDatacenter, fifthDatacenter)
enterBarrier("fifth-datacenter-joined-" + (bulk.size + i)) enterBarrier("fifth-datacenter-joined-" + (bulk.size + i))

View file

@ -210,7 +210,7 @@ trait MultiNodeClusterSpec extends Suite with STMultiNodeSpec { self: MultiNodeS
val expectedLeader = roleOfLeader(nodesInCluster) val expectedLeader = roleOfLeader(nodesInCluster)
val leader = clusterView.leader val leader = clusterView.leader
val isLeader = leader == Some(clusterView.selfAddress) val isLeader = leader == Some(clusterView.selfAddress)
assert(isLeader == ifNode(expectedLeader)(true)(false), assert(isLeader == isNode(expectedLeader),
"expectedLeader [%s], got leader [%s], members [%s]".format(expectedLeader, leader, clusterView.members)) "expectedLeader [%s], got leader [%s], members [%s]".format(expectedLeader, leader, clusterView.members))
clusterView.status must (be(MemberStatus.Up) or be(MemberStatus.Leaving)) clusterView.status must (be(MemberStatus.Up) or be(MemberStatus.Leaving))
} }

View file

@ -42,7 +42,10 @@ abstract class MultiNodeConfig {
/** /**
* Register a config override for a specific participant. * Register a config override for a specific participant.
*/ */
def nodeConfig(role: RoleName, config: Config): Unit = _nodeConf += role -> config def nodeConfig(roles: RoleName*)(configs: Config*): Unit = {
val c = configs.reduceLeft(_ withFallback _)
_nodeConf ++= roles map { _ -> c }
}
/** /**
* Include for verbose debug logging * Include for verbose debug logging
@ -318,18 +321,15 @@ abstract class MultiNodeSpec(val myself: RoleName, _system: ActorSystem, _roles:
* to the `roleMap`). * to the `roleMap`).
*/ */
def runOn(nodes: RoleName*)(thunk: Unit): Unit = { def runOn(nodes: RoleName*)(thunk: Unit): Unit = {
if (nodes exists (_ == myself)) { if (isNode(nodes: _*)) {
thunk thunk
} }
} }
/** /**
* Execute the `yes` block of code only on the given nodes (names according * Verify that the running node matches one of the given nodes
* to the `roleMap`) else execute the `no` block of code.
*/ */
def ifNode[T](nodes: RoleName*)(yes: T)(no: T): T = { def isNode(nodes: RoleName*): Boolean = nodes contains myself
if (nodes exists (_ == myself)) yes else no
}
/** /**
* Enter the named barriers in the order given. Use the remaining duration from * Enter the named barriers in the order given. Use the remaining duration from

View file

@ -89,11 +89,8 @@ class TestConductorSpec extends MultiNodeSpec(TestConductorMultiJvmSpec) with ST
} }
val (min, max) = val (min, max) =
ifNode(master) { if(isNode(master))(0 seconds, 500 millis)
(0 seconds, 500 millis) else (0.6 seconds, 2 seconds)
} {
(0.6 seconds, 2 seconds)
}
within(min, max) { within(min, max) {
expectMsg(500 millis, 10) expectMsg(500 millis, 10)