001 package org.springframework.richclient.exceptionhandling.delegation; 002 003 import junit.framework.TestCase; 004 005 import java.util.ArrayList; 006 import java.util.List; 007 import java.util.LinkedList; 008 009 import org.springframework.richclient.exceptionhandling.delegation.ChainInspectingExceptionHandlerDelegate.ChainPart; 010 011 /** 012 * @author Geoffrey De Smet 013 */ 014 public class DelegatingExceptionHandlerTests extends TestCase { 015 016 public void testSimpleDelegation() { 017 DelegatingExceptionHandler delegatingExceptionHandler = new DelegatingExceptionHandler(); 018 List<ExceptionHandlerDelegate> delegateList = new LinkedList<ExceptionHandlerDelegate>(); 019 ExceptionHandlerCounter illegalArgumentCounter = new ExceptionHandlerCounter(); 020 delegateList.add(new SimpleExceptionHandlerDelegate(IllegalArgumentException.class, illegalArgumentCounter)); 021 ExceptionHandlerCounter nullPointerCounter = new ExceptionHandlerCounter(); 022 delegateList.add(new SimpleExceptionHandlerDelegate(NullPointerException.class, nullPointerCounter)); 023 ExceptionHandlerCounter runtimeCounter = new ExceptionHandlerCounter(); 024 delegateList.add(new SimpleExceptionHandlerDelegate(RuntimeException.class, runtimeCounter)); 025 delegatingExceptionHandler.setDelegateList(delegateList); 026 027 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), new NullPointerException()); 028 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), new RuntimeException()); 029 // NumberFormatException extends IllegalArgumentException 030 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), new NumberFormatException()); 031 // IllegalStateException extends RuntimeException 032 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), new IllegalStateException()); 033 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), new IllegalArgumentException()); 034 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), new NullPointerException()); 035 036 assertEquals(2, illegalArgumentCounter.getCounter()); 037 assertEquals(2, nullPointerCounter.getCounter()); 038 assertEquals(2, runtimeCounter.getCounter()); 039 } 040 041 public void testSimplePurgedDelegation() { 042 DelegatingExceptionHandler delegatingExceptionHandler = new DelegatingExceptionHandler(); 043 List<ExceptionHandlerDelegate> delegateList = new LinkedList<ExceptionHandlerDelegate>(); 044 ExceptionHandlerCounter nullPointerCounter = new ExceptionHandlerCounter(NullPointerException.class); 045 SimpleExceptionHandlerDelegate delegate = new SimpleExceptionHandlerDelegate(NullPointerException.class, nullPointerCounter); 046 delegate.setExceptionPurger(new DefaultExceptionPurger(null, IllegalArgumentException.class)); 047 delegateList.add(delegate); 048 ExceptionHandlerCounter runtimeCounter = new ExceptionHandlerCounter(); 049 delegateList.add(new SimpleExceptionHandlerDelegate(RuntimeException.class, runtimeCounter)); 050 delegatingExceptionHandler.setDelegateList(delegateList); 051 052 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 053 new NullPointerException()); // ok 054 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 055 new IllegalArgumentException(new NullPointerException())); // ok 056 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 057 new IllegalArgumentException(new IllegalStateException(new NullPointerException()))); // not ok 058 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 059 new IllegalArgumentException(new IllegalArgumentException(new NullPointerException()))); // ok 060 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 061 new IllegalArgumentException()); // not ok 062 063 assertEquals(3, nullPointerCounter.getCounter()); 064 assertEquals(2, runtimeCounter.getCounter()); 065 } 066 067 public void testChainInpstectingDelegation() { 068 DelegatingExceptionHandler delegatingExceptionHandler = new DelegatingExceptionHandler(); 069 List<ExceptionHandlerDelegate> delegateList = new LinkedList<ExceptionHandlerDelegate>(); 070 List<ChainPart> chainPartList = new ArrayList<ChainPart>(); 071 chainPartList.add(new ChainPart(IllegalArgumentException.class, 0, 2)); 072 chainPartList.add(new ChainPart(IllegalStateException.class, 1)); 073 ExceptionHandlerCounter chainCounter = new ExceptionHandlerCounter(); 074 delegateList.add(new ChainInspectingExceptionHandlerDelegate(chainPartList, chainCounter)); 075 List<ChainPart> cornerChainPartList = new ArrayList<ChainPart>(); 076 cornerChainPartList.add(new ChainPart(NumberFormatException.class)); 077 ExceptionHandlerCounter cornerCounter = new ExceptionHandlerCounter(); 078 delegateList.add(new ChainInspectingExceptionHandlerDelegate(cornerChainPartList, cornerCounter)); 079 ExceptionHandlerCounter runtimeCounter = new ExceptionHandlerCounter(); 080 delegateList.add(new SimpleExceptionHandlerDelegate(RuntimeException.class, runtimeCounter)); 081 delegatingExceptionHandler.setDelegateList(delegateList); 082 083 084 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 085 new IllegalArgumentException( 086 new RuntimeException(new IllegalStateException()))); // chainCounter 087 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 088 new RuntimeException(new IllegalArgumentException( 089 new RuntimeException(new IllegalStateException())))); // chainCounter 090 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 091 new RuntimeException(new RuntimeException(new IllegalArgumentException( 092 new RuntimeException(new IllegalStateException()))))); // chainCounter 093 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 094 new RuntimeException(new RuntimeException(new RuntimeException(new IllegalArgumentException( 095 new RuntimeException(new IllegalStateException())))))); // runtimeCounter 096 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 097 new IllegalArgumentException( 098 new IllegalStateException())); // runtimeCounter 099 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 100 new IllegalArgumentException( 101 new RuntimeException(new RuntimeException(new IllegalStateException())))); // runtimeCounter 102 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 103 new IllegalStateException( 104 new RuntimeException(new IllegalArgumentException()))); // runtimeCounter 105 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 106 new NumberFormatException()); // cornerCounter 107 delegatingExceptionHandler.uncaughtException(Thread.currentThread(), 108 new RuntimeException(new NumberFormatException())); // cornerCounter 109 110 assertEquals(3, chainCounter.getCounter()); 111 assertEquals(2, cornerCounter.getCounter()); 112 assertEquals(4, runtimeCounter.getCounter()); 113 } 114 115 public static class ExceptionHandlerCounter implements Thread.UncaughtExceptionHandler { 116 117 private int counter = 0; 118 private Class filterClass; 119 120 private ExceptionHandlerCounter() {} 121 122 private ExceptionHandlerCounter(Class filterClass) { 123 this.filterClass = filterClass; 124 } 125 126 public int getCounter() { 127 return counter; 128 } 129 130 public void uncaughtException(Thread t, Throwable e) { 131 if (filterClass == null || filterClass.isInstance(e)) { 132 counter++; 133 } 134 } 135 } 136 137 138 139 }