Make DiscoveryNodeRole into a value object (#43257)

Adds `equals()` and `hashcode()` methods to `DiscoveryNodeRole` to compare
these objects' values for equality, and adds a field to allow us to distinguish
unknown roles from known ones with the same name and abbreviation, for clearer
test failures.

Relates #43175
This commit is contained in:
David Turner 2019-06-17 10:22:11 +01:00
parent 3effe264da
commit 4b58827beb
2 changed files with 54 additions and 2 deletions

View File

@ -56,7 +56,21 @@ public abstract class DiscoveryNodeRole {
return roleNameAbbreviation;
}
private final boolean isKnownRole;
/**
* Whether this role is known by this node, or is an {@link DiscoveryNodeRole.UnknownRole}.
*/
public final boolean isKnownRole() {
return isKnownRole;
}
protected DiscoveryNodeRole(final String roleName, final String roleNameAbbreviation) {
this(true, roleName, roleNameAbbreviation);
}
private DiscoveryNodeRole(final boolean isKnownRole, final String roleName, final String roleNameAbbreviation) {
this.isKnownRole = isKnownRole;
this.roleName = Objects.requireNonNull(roleName);
this.roleNameAbbreviation = Objects.requireNonNull(roleNameAbbreviation);
}
@ -64,10 +78,26 @@ public abstract class DiscoveryNodeRole {
protected abstract Setting<Boolean> roleSetting();
@Override
public String toString() {
public final boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DiscoveryNodeRole that = (DiscoveryNodeRole) o;
return roleName.equals(that.roleName) &&
roleNameAbbreviation.equals(that.roleNameAbbreviation) &&
isKnownRole == that.isKnownRole;
}
@Override
public final int hashCode() {
return Objects.hash(isKnownRole, roleName(), roleNameAbbreviation());
}
@Override
public final String toString() {
return "DiscoveryNodeRole{" +
"roleName='" + roleName + '\'' +
", roleNameAbbreviation='" + roleNameAbbreviation + '\'' +
(isKnownRole ? "" : ", isKnownRole=false") +
'}';
}
@ -126,7 +156,7 @@ public abstract class DiscoveryNodeRole {
* @param roleNameAbbreviation the role name abbreviation
*/
UnknownRole(final String roleName, final String roleNameAbbreviation) {
super(roleName, roleNameAbbreviation);
super(false, roleName, roleNameAbbreviation);
}
@Override

View File

@ -21,6 +21,7 @@ package org.elasticsearch.cluster.node;
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.test.EqualsHashCodeTestUtils;
import java.util.Arrays;
import java.util.HashSet;
@ -76,4 +77,25 @@ public class DiscoveryNodeRoleTests extends ESTestCase {
assertThat(e, hasToString(containsString("Duplicate key")));
}
public void testDiscoveryNodeRoleEqualsHashCode() {
EqualsHashCodeTestUtils.checkEqualsAndHashCode(new DiscoveryNodeRole.UnknownRole(randomAlphaOfLength(10), randomAlphaOfLength(1)),
r -> new DiscoveryNodeRole.UnknownRole(r.roleName(), r.roleNameAbbreviation()),
r -> {
if (randomBoolean()) {
return new DiscoveryNodeRole.UnknownRole(randomAlphaOfLength(21 - r.roleName().length()), r.roleNameAbbreviation());
} else {
return new DiscoveryNodeRole.UnknownRole(r.roleName(), randomAlphaOfLength(3 - r.roleNameAbbreviation().length()));
}
});
}
public void testUnknownRoleIsDistinctFromKnownRoles() {
for (DiscoveryNodeRole buildInRole : DiscoveryNodeRole.BUILT_IN_ROLES) {
final DiscoveryNodeRole.UnknownRole unknownDataRole
= new DiscoveryNodeRole.UnknownRole(buildInRole.roleName(), buildInRole.roleNameAbbreviation());
assertNotEquals(buildInRole, unknownDataRole);
assertNotEquals(buildInRole.toString(), unknownDataRole.toString());
}
}
}