From eeb392a0b33f94b8cab127b9f01a6c0a0e4b43d6 Mon Sep 17 00:00:00 2001 From: Josef Cacek Date: Tue, 2 Aug 2022 11:03:54 +0200 Subject: [PATCH] [HZ-1202] Make TcpIpConnection.equals more robust (3.12.z) (#21885) --- .../hazelcast/nio/tcp/TcpIpConnection.java | 35 +++++++++++++------ .../TcpIpConnection_AbstractBasicTest.java | 20 +++++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/hazelcast/src/main/java/com/hazelcast/nio/tcp/TcpIpConnection.java b/hazelcast/src/main/java/com/hazelcast/nio/tcp/TcpIpConnection.java index 18a4a4a79cd7..8c61f5a972e0 100644 --- a/hazelcast/src/main/java/com/hazelcast/nio/tcp/TcpIpConnection.java +++ b/hazelcast/src/main/java/com/hazelcast/nio/tcp/TcpIpConnection.java @@ -31,6 +31,8 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.channels.CancelledKeyException; +import java.util.Arrays; +import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; @@ -187,20 +189,24 @@ public boolean write(OutboundFrame frame) { } @Override - public boolean equals(Object o) { - if (this == o) { + public int hashCode() { + return hash(channel.isClientMode(), connectionId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { return true; } - if (!(o instanceof TcpIpConnection)) { + if (obj == null) { return false; } - TcpIpConnection that = (TcpIpConnection) o; - return connectionId == that.getConnectionId(); - } - - @Override - public int hashCode() { - return connectionId; + if (getClass() != obj.getClass()) { + return false; + } + TcpIpConnection other = (TcpIpConnection) obj; + return channel.isClientMode() == other.channel.isClientMode() && connectionId == other.connectionId + && equals(endPoint, other.endPoint); } @Override @@ -297,4 +303,13 @@ public String toString() { + ", type=" + type + "]"; } + + private static int hash(Object... values) { + return Arrays.hashCode(values); + } + + private static boolean equals(Object a, Object b) { + return (a == b) || (a != null && a.equals(b)); + } + } diff --git a/hazelcast/src/test/java/com/hazelcast/nio/tcp/TcpIpConnection_AbstractBasicTest.java b/hazelcast/src/test/java/com/hazelcast/nio/tcp/TcpIpConnection_AbstractBasicTest.java index cf9e586f7efb..1008e9f1acd6 100644 --- a/hazelcast/src/test/java/com/hazelcast/nio/tcp/TcpIpConnection_AbstractBasicTest.java +++ b/hazelcast/src/test/java/com/hazelcast/nio/tcp/TcpIpConnection_AbstractBasicTest.java @@ -16,11 +16,14 @@ package com.hazelcast.nio.tcp; +import com.hazelcast.internal.networking.Channel; +import com.hazelcast.nio.ConnectionLifecycleListener; import com.hazelcast.nio.Packet; import com.hazelcast.test.AssertTask; import com.hazelcast.util.function.Consumer; import org.junit.Before; import org.junit.Test; +import org.mockito.Mock; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -44,6 +47,9 @@ public abstract class TcpIpConnection_AbstractBasicTest extends TcpIpConnection_ private List packetsB; + @Mock + private ConnectionLifecycleListener mockedListener; + @Before public void setup() throws Exception { super.setup(); @@ -235,5 +241,19 @@ public void test_equals() { assertNotEquals(connAB, connAC); assertNotEquals(connAC, connAB); assertNotEquals(connAB, "foo"); + + // don't mock if you don't need to + TcpIpEndpointManager em = connAB.getEndpointManager(); + Channel channel = connAB.getChannel(); + TcpIpConnection conn1 = new TcpIpConnection(em, mockedListener, 0, channel); + TcpIpConnection conn2 = new TcpIpConnection(em, mockedListener, 0, channel); + assertEquals(conn1, conn2); + conn1.setEndPoint(addressA); + assertNotEquals(conn1, conn2); + conn2.setEndPoint(addressB); + assertNotEquals(conn1, conn2); + conn2.setEndPoint(addressA); + assertEquals(conn1, conn2); } + }