package org.netbeans.gradle.model.util; import java.io.IOException; import java.lang.reflect.Method; import org.gradle.api.JavaVersion; import org.junit.After; import org.junit.AfterClass; import org.junit.Assume; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; /** * * @author Kelemen Attila */ public class TransferableExceptionWrapperTest { @BeforeClass public static void setUpClass() { } @AfterClass public static void tearDownClass() { } @Before public void setUp() { } @After public void tearDown() { } private static void checkSerializable(TransferableExceptionWrapper obj) throws ClassNotFoundException { byte[] serialized = SerializationUtils.serializeObject(obj); TransferableExceptionWrapper deserialized = (TransferableExceptionWrapper)SerializationUtils.deserializeObject(serialized, SerializationCache.NO_CACHE); assertEquals(obj.getMessage(), deserialized.getMessage()); assertEquals(obj.getOriginalClassName(), deserialized.getOriginalClassName()); assertEquals(obj.getOriginalMessage(), deserialized.getOriginalMessage()); assertArrayEquals(obj.getStackTrace(), deserialized.getStackTrace()); } private void checkWrapperOrSame(Throwable original, Throwable wrapper) { assertArrayEquals(original.getStackTrace(), wrapper.getStackTrace()); String message = wrapper.getMessage(); assertTrue(message.equals(original.getMessage()) || (message.contains(original.getMessage()) && message.contains(original.getClass().getName()))); } private void checkWrapper(Throwable original, TransferableExceptionWrapper wrapper) throws ClassNotFoundException { assertEquals(original.getMessage(), wrapper.getOriginalMessage()); assertEquals(original.getClass().getName(), wrapper.getOriginalClassName()); checkWrapperOrSame(original, wrapper); String message = wrapper.getMessage(); assertTrue(message.contains(original.getMessage()) && message.contains(original.getClass().getName())); checkSerializable(wrapper); } @Test public void testWrapSingle() throws ClassNotFoundException { IOException wrapped = new IOException("testWrapSimple-Message"); TransferableExceptionWrapper wrapper = TransferableExceptionWrapper.wrap(wrapped); checkWrapper(wrapped, wrapper); } @Test public void testWrapWithCauses() throws ClassNotFoundException { IllegalArgumentException wrappedCause = new IllegalArgumentException("testWrapWithCauses-cause"); String message = "testWrapWithCauses-Message"; IOException wrapped = new IOException(message); wrapped.initCause(wrappedCause); TransferableExceptionWrapper wrapper = TransferableExceptionWrapper.wrap(wrapped); checkWrapper(wrapped, wrapper); checkWrapperOrSame(wrapped.getCause(), wrapper.getCause()); } @Test public void testWrapNotSerializable() throws ClassNotFoundException { Exception wrapped = new NotSerializableTestException("testWrapNotSerializable-Message"); TransferableExceptionWrapper wrapper = TransferableExceptionWrapper.wrap(wrapped); checkWrapper(wrapped, wrapper); } @Test public void testWithSuppressed() throws Exception { // Java 7 only test. Assume.assumeTrue("This test is for Java7 only", JavaVersion.current().isJava7Compatible()); IOException wrapped = new IOException("testWithSuppressed-Message"); Method addSuppressed = ReflectionUtils.tryGetPublicMethod( wrapped.getClass(), "addSuppressed", Void.TYPE, Throwable.class); assertNotNull("Expected to have addSuppressed in Java 7", addSuppressed); Exception suppressed1 = new NotSerializableTestException("testWithSuppressed-suppressed1"); Exception suppressed2 = new IOException("testWithSuppressed-suppressed2"); addSuppressed.invoke(wrapped, suppressed1); addSuppressed.invoke(wrapped, suppressed2); TransferableExceptionWrapper wrapper = TransferableExceptionWrapper.wrap(wrapped); checkWrapper(wrapped, wrapper); Method getSuppressed = ReflectionUtils.tryGetPublicMethod( wrapper.getClass(), "getSuppressed", Throwable[].class); assertNotNull("Expected to have getSuppressed in Java 7", getSuppressed); Throwable[] wrappedSuppressed = (Throwable[])getSuppressed.invoke(wrapper); assertEquals("Must wrapp suppressed exceptions as well.", 2, wrappedSuppressed.length); checkWrapperOrSame(suppressed1, wrappedSuppressed[0]); checkWrapperOrSame(suppressed2, wrappedSuppressed[1]); } @SuppressWarnings("serial") private static final class NotSerializableTestException extends Exception { public final Object object; // Assign an unserializable object. public NotSerializableTestException(String message) { super(message); this.object = new Object(); } } }