From 1a1ccd9618ac2c2c2e61bd425357b21108c50583 Mon Sep 17 00:00:00 2001 From: Min Jin Date: Wed, 21 Oct 2026 20:55:45 -0700 Subject: [PATCH] [extended] Fix LeaderElectionRecord.equals null renewTime comparison When this.renewTime is null, equals() returned (that.holderIdentity == null) instead of (that.renewTime == null), a field typo in the final branch of the equals chain. This made two otherwise-equal records with a null renewTime compare as unequal, and could report unequal records as equal. Compare renewTime in that branch. Adds focused unit tests. --- .../leaderelection/LeaderElectionRecord.java | 2 +- .../LeaderElectionRecordTest.java | 48 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 extended/src/test/java/io/kubernetes/client/extended/leaderelection/LeaderElectionRecordTest.java diff --git a/extended/src/main/java/io/kubernetes/client/extended/leaderelection/LeaderElectionRecord.java b/extended/src/main/java/io/kubernetes/client/extended/leaderelection/LeaderElectionRecord.java index 4ca0aeddfc..b00a2e3172 100644 --- a/extended/src/main/java/io/kubernetes/client/extended/leaderelection/LeaderElectionRecord.java +++ b/extended/src/main/java/io/kubernetes/client/extended/leaderelection/LeaderElectionRecord.java @@ -139,7 +139,7 @@ public boolean equals(Object o) { if (!acquireTime.equals(that.acquireTime)) return false; } if (renewTime == null) { - return that.holderIdentity == null; + return that.renewTime == null; } return renewTime.equals(that.renewTime); } diff --git a/extended/src/test/java/io/kubernetes/client/extended/leaderelection/LeaderElectionRecordTest.java b/extended/src/test/java/io/kubernetes/client/extended/leaderelection/LeaderElectionRecordTest.java new file mode 100644 index 0000000000..8a387c2e22 --- /dev/null +++ b/extended/src/test/java/io/kubernetes/client/extended/leaderelection/LeaderElectionRecordTest.java @@ -0,0 +1,48 @@ +/* +Copyright 2020 The Kubernetes Authors. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package io.kubernetes.client.extended.leaderelection; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Date; +import org.junit.jupiter.api.Test; + +class LeaderElectionRecordTest { + + // Two records that differ only by having a null renewTime must still be equal to each + // other when every other field (including renewTime, which is null on both) matches. + @Test + void equalWhenRenewTimeIsNullOnBoth() { + Date acquireTime = new Date(1000L); + LeaderElectionRecord a = new LeaderElectionRecord("holder", 15, acquireTime, null, 3); + LeaderElectionRecord b = new LeaderElectionRecord("holder", 15, acquireTime, null, 3); + + assertThat(a).isEqualTo(b); + assertThat(b).isEqualTo(a); + assertThat(a.hashCode()).isEqualTo(b.hashCode()); + } + + // When one record has a null renewTime and the other does not, they must be unequal, + // regardless of the holderIdentity value. + @Test + void notEqualWhenOnlyOneRenewTimeIsNull() { + Date acquireTime = new Date(1000L); + Date renewTime = new Date(2000L); + LeaderElectionRecord nullRenew = new LeaderElectionRecord("holder", 15, acquireTime, null, 3); + LeaderElectionRecord withRenew = + new LeaderElectionRecord("holder", 15, acquireTime, renewTime, 3); + + assertThat(nullRenew).isNotEqualTo(withRenew); + assertThat(withRenew).isNotEqualTo(nullRenew); + } +}