package org.infinispan.test; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; /** * Utility methods for testing expected exceptions. * * @author Dan Berindei * @since 8.2 */ public class Exceptions { public interface ExceptionRunnable { void run() throws Exception; } public static void assertException(Class<? extends Throwable> exceptionClass, Throwable t) { if (t == null) { throw new AssertionError("Should have thrown an " + exceptionClass, null); } if (t.getClass() != exceptionClass) { throw new AssertionError( "Wrong exception thrown: expected:<" + exceptionClass + ">, actual:<" + t.getClass() + ">", t); } } public static void assertException(Class<? extends Throwable> exceptionClass, String messageRegex, Throwable t) { assertException(exceptionClass, t); Pattern pattern = Pattern.compile(messageRegex); if (!pattern.matcher(t.getMessage()).matches()) { throw new AssertionError( "Wrong exception message: expected:<" + messageRegex + ">, actual:<" + t.getMessage() + ">", t); } } public static void assertExceptionNonStrict(Class<? extends Throwable> exceptionClass, Throwable t) { if (t == null) { throw new AssertionError("Should have thrown an " + exceptionClass, null); } if (!exceptionClass.isInstance(t)) { throw new AssertionError( "Wrong exception thrown: expected:<" + exceptionClass + ">, actual:<" + t.getClass() + ">", t); } } public static void assertException(Class<? extends Throwable> wrapperExceptionClass, Class<? extends Throwable> exceptionClass, Throwable t) { assertException(wrapperExceptionClass, t); assertException(exceptionClass, t.getCause()); } public static void assertException(Class<? extends Throwable> wrapperExceptionClass, Class<? extends Throwable> exceptionClass, String messageRegex, Throwable t) { assertException(wrapperExceptionClass, t); assertException(exceptionClass, messageRegex, t.getCause()); } public static void assertException(Class<? extends Throwable> wrapperExceptionClass2, Class<? extends Throwable> wrapperExceptionClass, Class<? extends Throwable> exceptionClass, Throwable t) { assertException(wrapperExceptionClass2, t); assertException(wrapperExceptionClass, t.getCause()); assertException(exceptionClass, t.getCause().getCause()); } public static void expectException(Class<? extends Throwable> exceptionClass, String messageRegex, ExceptionRunnable runnable) { Throwable t = extractException(runnable); assertException(exceptionClass, messageRegex, t); } public static void expectException(Class<? extends Throwable> wrapperExceptionClass, Class<? extends Throwable> exceptionClass, String messageRegex, ExceptionRunnable runnable) { Throwable t = extractException(runnable); assertException(wrapperExceptionClass, exceptionClass, messageRegex, t); } public static void expectException(Class<? extends Throwable> wrapperExceptionClass2, Class<? extends Throwable> wrapperExceptionClass1, Class<? extends Throwable> exceptionClass, ExceptionRunnable runnable) { Throwable t = extractException(runnable); assertException(wrapperExceptionClass2, wrapperExceptionClass1, exceptionClass, t); } public static void expectException(Class<? extends Throwable> exceptionClass, ExceptionRunnable runnable) { Throwable t = extractException(runnable); assertException(exceptionClass, t); } public static void expectException(Class<? extends Throwable> wrapperExceptionClass, Class<? extends Throwable> exceptionClass, ExceptionRunnable runnable) { Throwable t = extractException(runnable); assertException(wrapperExceptionClass, t); assertException(exceptionClass, t.getCause()); } public static void expectExceptionNonStrict(Class<? extends Throwable> we2, Class<? extends Throwable> we1, Class<? extends Throwable> e, ExceptionRunnable runnable) { Throwable t = extractException(runnable); assertExceptionNonStrict(we2, t); assertExceptionNonStrict(we1, t.getCause()); assertExceptionNonStrict(e, t.getCause().getCause()); } public static void expectExecutionException(Class<? extends Throwable> exceptionClass, String messageRegex, Future<?> future) { Throwable t = extractException(() -> future.get(10, TimeUnit.SECONDS)); assertException(ExecutionException.class, t); assertException(exceptionClass, messageRegex, t.getCause()); } public static void expectExecutionException(Class<? extends Throwable> wrapperExceptionClass, Class<? extends Throwable> exceptionClass, String messageRegex, Future<?> future) { Throwable t = extractException(() -> future.get(10, TimeUnit.SECONDS)); assertException(ExecutionException.class, t); assertException(wrapperExceptionClass, t.getCause()); assertException(exceptionClass, messageRegex, t.getCause().getCause()); } public static void expectExecutionException(Class<? extends Throwable> wrapperExceptionClass2, Class<? extends Throwable> wrapperExceptionClass, Class<? extends Throwable> exceptionClass, String messageRegex, Future<?> future) { Throwable t = extractException(() -> future.get(10, TimeUnit.SECONDS)); assertException(ExecutionException.class, t); assertException(wrapperExceptionClass2, t.getCause()); assertException(wrapperExceptionClass, exceptionClass, messageRegex, t.getCause().getCause()); } public static void expectExecutionException(Class<? extends Throwable> exceptionClass, Future<?> future) { Throwable t = extractException(() -> future.get(10, TimeUnit.SECONDS)); assertException(ExecutionException.class, t); assertException(exceptionClass, t.getCause()); } public static void expectExecutionException(Class<? extends Throwable> wrapperExceptionClass, Class<? extends Throwable> exceptionClass, Future<?> future) { Throwable t = extractException(() -> future.get(10, TimeUnit.SECONDS)); assertException(ExecutionException.class, t); assertException(wrapperExceptionClass, t.getCause()); assertException(exceptionClass, t.getCause().getCause()); } public static void expectExecutionException(Class<? extends Throwable> wrapperExceptionClass2, Class<? extends Throwable> wrapperExceptionClass, Class<? extends Throwable> exceptionClass, Future<?> future) { Throwable t = extractException(() -> future.get(10, TimeUnit.SECONDS)); assertException(ExecutionException.class, t); assertException(wrapperExceptionClass2, t.getCause()); assertException(wrapperExceptionClass, exceptionClass, t.getCause().getCause()); } private static Throwable extractException(ExceptionRunnable runnable) { Throwable exception = null; try { runnable.run(); } catch (Throwable t) { exception = t; } return exception; } }