diff --git a/common/scala/src/main/scala/org/apache/openwhisk/core/connector/Message.scala b/common/scala/src/main/scala/org/apache/openwhisk/core/connector/Message.scala index 9636769b28d..11749bed07a 100644 --- a/common/scala/src/main/scala/org/apache/openwhisk/core/connector/Message.scala +++ b/common/scala/src/main/scala/org/apache/openwhisk/core/connector/Message.scala @@ -470,6 +470,31 @@ case class InvokerResourceMessage(status: String, * Serializes message to string. Must be idempotent. */ override def serialize: String = InvokerResourceMessage.serdes.write(this).compactPrint + + override def equals(that: Any): Boolean = + that match { + case that: InvokerResourceMessage => + this.status == that.status && + this.freeMemory == that.freeMemory && + this.busyMemory == that.busyMemory && + this.inProgressMemory == that.inProgressMemory && + this.tags.toSet == that.tags.toSet && + this.dedicatedNamespaces.toSet == that.dedicatedNamespaces.toSet + + case _ => false + } + + override def hashCode: Int = { + var result = 1 + val prime = 31 + result = prime * result + status.hashCode() + result = prime * result + freeMemory.hashCode() + result = prime * result + busyMemory.hashCode() + result = prime * result + inProgressMemory.hashCode() + result = prime * result + tags.hashCode() + result = prime * result + dedicatedNamespaces.hashCode() + result + } } object InvokerResourceMessage extends DefaultJsonProtocol { diff --git a/core/scheduler/src/main/scala/org/apache/openwhisk/core/scheduler/Scheduler.scala b/core/scheduler/src/main/scala/org/apache/openwhisk/core/scheduler/Scheduler.scala index 6591d2e479f..128c004ef53 100644 --- a/core/scheduler/src/main/scala/org/apache/openwhisk/core/scheduler/Scheduler.scala +++ b/core/scheduler/src/main/scala/org/apache/openwhisk/core/scheduler/Scheduler.scala @@ -389,6 +389,21 @@ case class SchedulerStates(sid: SchedulerInstanceId, queueSize: Int, endpoints: def getSchedulerId(): SchedulerInstanceId = sid def serialize = SchedulerStates.serdes.write(this).compactPrint + + override def equals(that: Any): Boolean = + that match { + case that: SchedulerStates => { + this.queueSize == that.queueSize + } + case _ => false + } + + override def hashCode: Int = { + var result = 1 + val prime = 31 + result = prime * result + queueSize.hashCode() + result + } } object SchedulerStates extends DefaultJsonProtocol { diff --git a/tests/src/test/scala/org/apache/openwhisk/core/connector/test/MessageTests.scala b/tests/src/test/scala/org/apache/openwhisk/core/connector/test/MessageTests.scala new file mode 100644 index 00000000000..97d4d198441 --- /dev/null +++ b/tests/src/test/scala/org/apache/openwhisk/core/connector/test/MessageTests.scala @@ -0,0 +1,87 @@ +package org.apache.openwhisk.core.connector.test + +import akka.actor.ActorSystem +import akka.testkit.TestKit +import org.apache.openwhisk.common.InvokerState.{Healthy, Unhealthy} +import org.apache.openwhisk.core.connector.InvokerResourceMessage +import org.apache.openwhisk.core.entity.SchedulerInstanceId +import org.apache.openwhisk.core.scheduler.{SchedulerEndpoints, SchedulerStates} +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.{FlatSpecLike, Matchers} + +@RunWith(classOf[JUnitRunner]) +class MessageTests extends TestKit(ActorSystem("Message")) with FlatSpecLike with Matchers { + behavior of "Message" + + it should "be able to compare the InvokerResourceMessage" in { + val msg1 = InvokerResourceMessage(Unhealthy.asString, 1024L, 0, 0, Seq.empty, Seq.empty) + val msg2 = InvokerResourceMessage(Unhealthy.asString, 1024L, 0, 0, Seq.empty, Seq.empty) + + msg1 == msg2 shouldBe true + } + + it should "be different when the state of InvokerResourceMessage is different" in { + val msg1 = InvokerResourceMessage(Unhealthy.asString, 1024L, 0, 0, Seq.empty, Seq.empty) + val msg2 = InvokerResourceMessage(Healthy.asString, 1024L, 0, 0, Seq.empty, Seq.empty) + + msg1 != msg2 shouldBe true + } + + it should "be different when the free memory of InvokerResourceMessage is different" in { + val msg1 = InvokerResourceMessage(Healthy.asString, 1024L, 0, 0, Seq.empty, Seq.empty) + val msg2 = InvokerResourceMessage(Healthy.asString, 2048L, 0, 0, Seq.empty, Seq.empty) + + msg1 != msg2 shouldBe true + } + + it should "be different when the busy memory of InvokerResourceMessage is different" in { + val msg1 = InvokerResourceMessage(Healthy.asString, 1024L, 0, 0, Seq.empty, Seq.empty) + val msg2 = InvokerResourceMessage(Healthy.asString, 1024L, 1024L, 0, Seq.empty, Seq.empty) + + msg1 != msg2 shouldBe true + } + + it should "be different when the in-progress memory of InvokerResourceMessage is different" in { + val msg1 = InvokerResourceMessage(Healthy.asString, 1024L, 0, 0, Seq.empty, Seq.empty) + val msg2 = InvokerResourceMessage(Healthy.asString, 1024L, 0, 1024L, Seq.empty, Seq.empty) + + msg1 != msg2 shouldBe true + } + + it should "be different when the tags of InvokerResourceMessage is different" in { + val msg1 = InvokerResourceMessage(Healthy.asString, 1024L, 0, 0, Seq("tag1"), Seq.empty) + val msg2 = InvokerResourceMessage(Healthy.asString, 1024L, 0, 0, Seq("tag1", "tag2"), Seq.empty) + + msg1 != msg2 shouldBe true + } + + it should "be different when the dedicated namespaces of InvokerResourceMessage is different" in { + val msg1 = InvokerResourceMessage(Healthy.asString, 1024L, 0, 0, Seq.empty, Seq("ns1")) + val msg2 = InvokerResourceMessage(Healthy.asString, 1024L, 0, 0, Seq.empty, Seq("ns2")) + + msg1 != msg2 shouldBe true + } + + it should "be able to compare the SchedulerStates" in { + val msg1 = SchedulerStates(SchedulerInstanceId("0"), queueSize = 0, SchedulerEndpoints("10.10.10.10", 1234, 1234)) + val msg2 = SchedulerStates(SchedulerInstanceId("0"), queueSize = 0, SchedulerEndpoints("10.10.10.10", 1234, 1234)) + + msg1 == msg2 shouldBe true + } + + it should "be different when the queue size of SchedulerStates is different" in { + val msg1 = SchedulerStates(SchedulerInstanceId("0"), queueSize = 20, SchedulerEndpoints("10.10.10.10", 1234, 1234)) + val msg2 = SchedulerStates(SchedulerInstanceId("0"), queueSize = 10, SchedulerEndpoints("10.10.10.10", 1234, 1234)) + + msg1 != msg2 shouldBe true + } + + it should "be not different when other than the queue size of SchedulerStates is different" in { + // only the queue size matter + val msg1 = SchedulerStates(SchedulerInstanceId("0"), queueSize = 20, SchedulerEndpoints("10.10.10.10", 1234, 1234)) + val msg2 = SchedulerStates(SchedulerInstanceId("1"), queueSize = 20, SchedulerEndpoints("10.10.10.20", 5678, 5678)) + + msg1 == msg2 shouldBe true + } +}