/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio;
import alluxio.underfs.UnderFileSystem.SpaceType;
import junit.framework.AssertionFailedError;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.Objects;
/**
* Unit tests for {@link CommonTestUtils}.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(CommonTestUtilsTest.HardToInstantiateClass.class)
public final class CommonTestUtilsTest {
public static final class HardToInstantiateClass {
private HardToInstantiateClass(Object o) {}
}
/**
* A simple class that has a correct hashcode method.
*/
private static class Basic {
private String mField;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Basic)) {
return false;
}
Basic that = (Basic) o;
return Objects.equals(mField, that.mField);
}
@Override
public int hashCode() {
return Objects.hash(mField);
}
}
/**
* A simple class that has a bad hashcode method.
*/
private static class BadHashCode {
private String mField;
@Override
public boolean equals(Object o) {
if (!(o instanceof Basic)) {
return false;
}
Basic that = (Basic) o;
return Objects.equals(mField, that.mField);
}
@Override
public int hashCode() {
return Objects.hash(10); // Should be mField.
}
}
/**
* A simple class that has a correct equals method.
*/
private static class ManyFields {
private String mField1;
private boolean mField2;
// Use HardToInstantiateClass as an example of a final class without a no-arg constructor.
private HardToInstantiateClass mField3;
// Example of an enum.
private SpaceType mField4;
@Override
public boolean equals(Object o) {
if (!(o instanceof ManyFields)) {
return false;
}
ManyFields that = (ManyFields) o;
return Objects.equals(mField1, that.mField1)
&& Objects.equals(mField2, that.mField2)
&& Objects.equals(mField3, that.mField3)
&& Objects.equals(mField4, that.mField4);
}
@Override
public int hashCode() {
return Objects.hash(mField1, mField2, mField3, mField4);
}
}
/**
* A simple class that has a bad equals method due to missing field.
*/
private static class MissingField {
private String mField1;
private boolean mField2;
private CommonTestUtils mField3;
@Override
public boolean equals(Object o) {
if (!(o instanceof MissingField)) {
return false;
}
MissingField that = (MissingField) o;
// Missing test for mField3.
return Objects.equals(mField1, that.mField1)
&& Objects.equals(mField2, that.mField2);
}
@Override
public int hashCode() {
// Missing mField3.
return Objects.hash(mField1, mField2);
}
}
/**
* A simple class that has a bad equals method due to missing instance check.
*/
private static class EqualsMissingInstanceCheck {
private String mField1;
private boolean mField2;
private CommonTestUtils mField3;
@Override
public boolean equals(Object o) {
// Missing test for o instanceof EqualsMissingField.
MissingField that = (MissingField) o;
return Objects.equals(mField1, that.mField1)
&& Objects.equals(mField2, that.mField2)
&& Objects.equals(mField3, that.mField3);
}
@Override
public int hashCode() {
return Objects.hash(mField1, mField2, mField3);
}
}
@Test
public void testEqualsBasic() throws Exception {
CommonTestUtils.testEquals(Basic.class);
}
@Test
public void testEqualsManyFields() {
CommonTestUtils.testEquals(ManyFields.class);
}
@Test
public void testEqualsBadHashCodeCheck() {
testFail(BadHashCode.class);
}
@Test
public void testEqualsMissingFieldCheck() {
testFail(MissingField.class);
}
@Test
public void testEqualsMissingInstanceCheck() {
testFail(EqualsMissingInstanceCheck.class);
}
private void testFail(Class<?> clazz) {
try {
CommonTestUtils.testEquals(clazz);
Assert.fail("testEquals didn't throw an error for class " + clazz.getName());
} catch (AssertionFailedError | NullPointerException e) {
// expected
}
}
}