|
Akka/Scala example source code file (MemberOrderingSpec.scala)
The MemberOrderingSpec.scala Akka example source code
/**
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.cluster
import akka.actor.{ Address, AddressFromURIString }
import java.net.InetSocketAddress
import org.scalatest.Matchers
import org.scalatest.WordSpec
import scala.collection.immutable.SortedSet
import scala.util.Random
@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner])
class MemberOrderingSpec extends WordSpec with Matchers {
import Member.ordering
import Member.addressOrdering
import MemberStatus._
def m(address: Address, status: MemberStatus): Member = TestMember(address, status)
"An Ordering[Member]" must {
"order members by host:port" in {
val members = SortedSet.empty[Member] +
m(AddressFromURIString("akka://sys@darkstar:1112"), Up) +
m(AddressFromURIString("akka://sys@darkstar:1113"), Joining) +
m(AddressFromURIString("akka://sys@darkstar:1111"), Up)
val seq = members.toSeq
seq.size should be(3)
seq(0) should be(m(AddressFromURIString("akka://sys@darkstar:1111"), Up))
seq(1) should be(m(AddressFromURIString("akka://sys@darkstar:1112"), Up))
seq(2) should be(m(AddressFromURIString("akka://sys@darkstar:1113"), Joining))
}
"be sorted by address correctly" in {
import Member.ordering
// sorting should be done on host and port, only
val m1 = m(Address("akka.tcp", "sys1", "host1", 9000), Up)
val m2 = m(Address("akka.tcp", "sys1", "host1", 10000), Up)
val m3 = m(Address("cluster", "sys2", "host2", 8000), Up)
val m4 = m(Address("cluster", "sys2", "host2", 9000), Up)
val m5 = m(Address("cluster", "sys1", "host2", 10000), Up)
val expected = IndexedSeq(m1, m2, m3, m4, m5)
val shuffled = Random.shuffle(expected)
shuffled.sorted should be(expected)
(SortedSet.empty[Member] ++ shuffled).toIndexedSeq should be(expected)
}
"have stable equals and hashCode" in {
val address = Address("akka.tcp", "sys1", "host1", 9000)
val m1 = m(address, Joining)
val m11 = Member(UniqueAddress(address, -3), Set.empty)
val m2 = m1.copy(status = Up)
val m22 = m11.copy(status = Up)
val m3 = m(address.copy(port = Some(10000)), Up)
m1 should be(m2)
m1.hashCode should be(m2.hashCode)
m3 should not be (m2)
m3 should not be (m1)
m11 should be(m22)
m11.hashCode should be(m22.hashCode)
// different uid
m1 should not be (m11)
m2 should not be (m22)
}
"have consistent ordering and equals" in {
val address1 = Address("akka.tcp", "sys1", "host1", 9001)
val address2 = address1.copy(port = Some(9002))
val x = m(address1, Exiting)
val y = m(address1, Removed)
val z = m(address2, Up)
Member.ordering.compare(x, y) should be(0)
Member.ordering.compare(x, z) should be(Member.ordering.compare(y, z))
// different uid
val a = m(address1, Joining)
val b = Member(UniqueAddress(address1, -3), Set.empty)
Member.ordering.compare(a, b) should be(1)
Member.ordering.compare(b, a) should be(-1)
}
"work with SortedSet" in {
val address1 = Address("akka.tcp", "sys1", "host1", 9001)
val address2 = address1.copy(port = Some(9002))
val address3 = address1.copy(port = Some(9003))
(SortedSet(m(address1, Joining)) - m(address1, Up)) should be(SortedSet.empty[Member])
(SortedSet(m(address1, Exiting)) - m(address1, Removed)) should be(SortedSet.empty[Member])
(SortedSet(m(address1, Up)) - m(address1, Exiting)) should be(SortedSet.empty[Member])
(SortedSet(m(address2, Up), m(address3, Joining), m(address1, Exiting)) - m(address1, Removed)) should be(
SortedSet(m(address2, Up), m(address3, Joining)))
}
}
"An Ordering[Address]" must {
"order addresses by port" in {
val addresses = SortedSet.empty[Address] +
AddressFromURIString("akka://sys@darkstar:1112") +
AddressFromURIString("akka://sys@darkstar:1113") +
AddressFromURIString("akka://sys@darkstar:1110") +
AddressFromURIString("akka://sys@darkstar:1111")
val seq = addresses.toSeq
seq.size should be(4)
seq(0) should be(AddressFromURIString("akka://sys@darkstar:1110"))
seq(1) should be(AddressFromURIString("akka://sys@darkstar:1111"))
seq(2) should be(AddressFromURIString("akka://sys@darkstar:1112"))
seq(3) should be(AddressFromURIString("akka://sys@darkstar:1113"))
}
"order addresses by hostname" in {
val addresses = SortedSet.empty[Address] +
AddressFromURIString("akka://sys@darkstar2:1110") +
AddressFromURIString("akka://sys@darkstar1:1110") +
AddressFromURIString("akka://sys@darkstar3:1110") +
AddressFromURIString("akka://sys@darkstar0:1110")
val seq = addresses.toSeq
seq.size should be(4)
seq(0) should be(AddressFromURIString("akka://sys@darkstar0:1110"))
seq(1) should be(AddressFromURIString("akka://sys@darkstar1:1110"))
seq(2) should be(AddressFromURIString("akka://sys@darkstar2:1110"))
seq(3) should be(AddressFromURIString("akka://sys@darkstar3:1110"))
}
"order addresses by hostname and port" in {
val addresses = SortedSet.empty[Address] +
AddressFromURIString("akka://sys@darkstar2:1110") +
AddressFromURIString("akka://sys@darkstar0:1111") +
AddressFromURIString("akka://sys@darkstar2:1111") +
AddressFromURIString("akka://sys@darkstar0:1110")
val seq = addresses.toSeq
seq.size should be(4)
seq(0) should be(AddressFromURIString("akka://sys@darkstar0:1110"))
seq(1) should be(AddressFromURIString("akka://sys@darkstar0:1111"))
seq(2) should be(AddressFromURIString("akka://sys@darkstar2:1110"))
seq(3) should be(AddressFromURIString("akka://sys@darkstar2:1111"))
}
}
"Leader status ordering" must {
"order members with status Joining, Exiting and Down last" in {
val address = Address("akka.tcp", "sys1", "host1", 5000)
val m1 = m(address, Joining)
val m2 = m(address.copy(port = Some(7000)), Joining)
val m3 = m(address.copy(port = Some(3000)), Exiting)
val m4 = m(address.copy(port = Some(6000)), Exiting)
val m5 = m(address.copy(port = Some(2000)), Down)
val m6 = m(address.copy(port = Some(4000)), Down)
val m7 = m(address.copy(port = Some(8000)), Up)
val m8 = m(address.copy(port = Some(9000)), Up)
val expected = IndexedSeq(m7, m8, m1, m2, m3, m4, m5, m6)
val shuffled = Random.shuffle(expected)
shuffled.sorted(Member.leaderStatusOrdering) should be(expected)
}
}
}
Other Akka source code examplesHere is a short list of links related to this Akka MemberOrderingSpec.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.