1   package ch.qos.logback.classic.pattern;
2   
3   import static org.junit.Assert.assertEquals;
4   import static org.junit.Assert.assertTrue;
5   
6   import java.io.PrintWriter;
7   import java.io.StringWriter;
8   import java.util.regex.Matcher;
9   import java.util.regex.Pattern;
10  
11  import org.junit.After;
12  import org.junit.Before;
13  import org.junit.Test;
14  
15  import ch.qos.logback.classic.Level;
16  import ch.qos.logback.classic.LoggerContext;
17  import ch.qos.logback.classic.PatternLayout;
18  import ch.qos.logback.classic.spi.LoggingEvent;
19  
20  public class ExtendedThrowableProxyConverterTest {
21  
22    LoggerContext lc = new LoggerContext();
23    ExtendedThrowableProxyConverter etpc = new ExtendedThrowableProxyConverter();
24    StringWriter sw = new StringWriter();
25    PrintWriter pw = new PrintWriter(sw);
26  
27    @Before
28    public void setUp() throws Exception {
29      etpc.setContext(lc);
30      etpc.start();
31    }
32  
33    @After
34    public void tearDown() throws Exception {
35    }
36  
37    private LoggingEvent createLoggingEvent(Throwable t) {
38      LoggingEvent le = new LoggingEvent(this.getClass().getName(), lc
39          .getLogger(LoggerContext.ROOT_NAME), Level.DEBUG, "test message", t,
40          null);
41      return le;
42    }
43  
44    @Test
45    public void integration() {
46      PatternLayout pl = new PatternLayout();
47      pl.setContext(lc);
48      pl.setPattern("%m%n");
49      pl.start();
50      LoggingEvent e = createLoggingEvent(new Exception("x"));
51      String res = pl.doLayout(e);
52  
53      // make sure that at least some package data was output
54      Pattern p = Pattern.compile(" \\[junit.*\\]");
55      Matcher m = p.matcher(res);
56      int i = 0;
57      while(m.find()) {
58        i++;
59      }
60      assertTrue(i+ " should be larger than 5", i > 5);
61    }
62  
63    @Test
64    public void smoke() {
65      Exception t = new Exception("smoke");
66      verify(t);
67    }
68  
69    @Test
70    public void nested() {
71      Throwable t = makeNestedException(1);
72      verify(t);
73    }
74  
75    void verify(Throwable t) {
76      t.printStackTrace(pw);
77  
78      LoggingEvent le = createLoggingEvent(t);
79      String result = etpc.convert(le);
80      result = result.replace("common frames omitted", "more");
81      result = result.replaceAll(" \\[.*\\]", "");
82      assertEquals(sw.toString(), result);
83    }
84  
85    Throwable makeNestedException(int level) {
86      if (level == 0) {
87        return new Exception("nesting level=" + level);
88      }
89      Throwable cause = makeNestedException(level - 1);
90      return new Exception("nesting level =" + level, cause);
91    }
92  }