package org.junit.internal;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
public class ArrayComparisonFailureTest {
private static final String ARRAY_COMPARISON_FAILURE_411 = "arrayComparisonFailure_411";
private static final String ARRAY_COMPARISON_FAILURE_412 = "arrayComparisonFailure_412";
/*
Test compatibility of older versions of ArrayComparisonFailure
Setup:
- checkout prior versions of the codebase (r4.11, r4.12 in this case)
- catch the exception resulting from:
assertArrayEquals(new int[]{0, 1}, new int[]{0, 5});
- serialize the resulting exception to a file, moving into the test/resources path
Ex., for v4.11's resulting exception {@link org/junit/internal/arrayComparisonFailure_411}
Current unit test:
- deserialize the above files casting it to the current version of the class
(catches any forward incompatibility with missing fields)
- assert the results from existing methods: getCause(), toString() -> getMessage()
(catches incompatible usages of fields)
This does not test if an instance of the current version of the class is able to deserialize to a previous ver.
*/
@Test
public void classShouldAccept411Version() throws Exception {
assertFailureSerializableFromOthers(ARRAY_COMPARISON_FAILURE_411);
}
@Test
public void classShouldAccept412Version() throws Exception {
assertFailureSerializableFromOthers(ARRAY_COMPARISON_FAILURE_412);
}
private void assertFailureSerializableFromOthers(String failureFileName) throws IOException,
ClassNotFoundException {
try {
assertArrayEquals(new int[]{0, 1}, new int[]{0, 5});
fail();
} catch (ArrayComparisonFailure e) {
ArrayComparisonFailure arrayComparisonFailureFromFile = deserializeFailureFromFile(failureFileName);
assertNotNull("ArrayComparisonFailure.getCause() should fallback to the deprecated fCause field"
+ " for compatibility with older versions of junit4 that didn't use Throwable.initCause().",
arrayComparisonFailureFromFile.getCause());
assertEquals(e.getCause().toString(), arrayComparisonFailureFromFile.getCause().toString());
assertEquals(e.toString(), arrayComparisonFailureFromFile.toString());
}
}
private ArrayComparisonFailure deserializeFailureFromFile(String fileName) throws IOException,
ClassNotFoundException {
InputStream resource = getClass().getResourceAsStream(fileName);
ObjectInputStream objectInputStream = new ObjectInputStream(resource);
return (ArrayComparisonFailure) objectInputStream.readObject();
}
}