org.elasticsearch.testframework.AbstractWireTestCase Maven / Gradle / Ivy
package org.elasticsearch.testframework;
import org.elasticsearch.Version;
import org.elasticsearch.common.io.stream.NamedWriteable;
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
import org.elasticsearch.common.io.stream.Writeable;
import java.io.IOException;
import java.util.Collections;
public abstract class AbstractWireTestCase extends ESTestCase {
protected static final int NUMBER_OF_TEST_RUNS = 20;
/**
* Creates a random test instance to use in the tests. This method will be
* called multiple times during test execution and should return a different
* random instance each time it is called.
*/
protected abstract T createTestInstance();
/**
* Returns a {@link Writeable.Reader} that can be used to de-serialize the instance
*/
protected abstract Writeable.Reader instanceReader();
/**
* Returns an instance which is mutated slightly so it should not be equal
* to the given instance.
*/
// TODO: Make this abstract when all sub-classes implement this (https://github.com/elastic/elasticsearch/issues/25929)
protected T mutateInstance(T instance) throws IOException {
return null;
}
/**
* Tests that the equals and hashcode methods are consistent and copied
* versions of the instance have are equal.
*/
public final void testEqualsAndHashcode() {
for (int runs = 0; runs < NUMBER_OF_TEST_RUNS; runs++) {
EqualsHashCodeTestUtils.checkEqualsAndHashCode(createTestInstance(), this::copyInstance, this::mutateInstance);
}
}
/**
* Test serialization and deserialization of the test instance.
*/
public final void testSerialization() throws IOException {
for (int runs = 0; runs < NUMBER_OF_TEST_RUNS; runs++) {
T testInstance = createTestInstance();
assertSerialization(testInstance);
}
}
/**
* Serialize the given instance and asserts that both are equal
*/
protected final T assertSerialization(T testInstance) throws IOException {
return assertSerialization(testInstance, Version.CURRENT);
}
protected final T assertSerialization(T testInstance, Version version) throws IOException {
T deserializedInstance = copyInstance(testInstance, version);
assertEqualInstances(testInstance, deserializedInstance);
return deserializedInstance;
}
protected void assertEqualInstances(T expectedInstance, T newInstance) {
assertNotSame(newInstance, expectedInstance);
assertEquals(expectedInstance, newInstance);
assertEquals(expectedInstance.hashCode(), newInstance.hashCode());
}
protected final T copyInstance(T instance) throws IOException {
return copyInstance(instance, Version.CURRENT);
}
protected abstract T copyInstance(T instance, Version version) throws IOException;
/**
* Get the {@link NamedWriteableRegistry} to use when de-serializing the object.
*
* Override this method if you need to register {@link NamedWriteable}s for the test object to de-serialize.
*
* By default this will return a {@link NamedWriteableRegistry} with no registered {@link NamedWriteable}s
*/
protected NamedWriteableRegistry getNamedWriteableRegistry() {
return new NamedWriteableRegistry(Collections.emptyList());
}
}