1 package ch.qos.logback.core.spi;
2
3 import static org.easymock.EasyMock.createStrictMock;
4 import static org.easymock.EasyMock.expect;
5 import static org.easymock.EasyMock.makeThreadSafe;
6 import static org.easymock.EasyMock.replay;
7 import static org.easymock.EasyMock.verify;
8
9 import org.junit.Test;
10
11 import ch.qos.logback.core.Appender;
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 public class AppenderAttachableImplLockTest {
41 private AppenderAttachableImpl<Integer> aai = new AppenderAttachableImpl<Integer>();
42
43 @SuppressWarnings("unchecked")
44 @Test(timeout = 1000)
45 public void getAppenderBoom() {
46
47 Appender<Integer> mockAppender1 = createStrictMock(Appender.class);
48 expect(mockAppender1.getName()).andThrow(new OutOfMemoryError("oops"));
49 replay(mockAppender1);
50
51 aai.addAppender(mockAppender1);
52 try {
53
54 aai.getAppender("foo");
55 } catch (OutOfMemoryError e) {
56
57 }
58
59 Appender<Integer> mockAppender2=createStrictMock(Appender.class);
60
61 aai.addAppender(mockAppender2);
62 verify(mockAppender1);
63 }
64
65 @SuppressWarnings("unchecked")
66 @Test(timeout = 1000)
67 public void detachAppenderBoom() throws InterruptedException {
68 Appender<Integer> mockAppender = createStrictMock(Appender.class);
69 makeThreadSafe(mockAppender, true);
70 expect(mockAppender.getName()).andThrow(new OutOfMemoryError("oops"));
71 mockAppender.doAppend(17);
72 replay(mockAppender);
73
74 aai.addAppender(mockAppender);
75 Thread t = new Thread(new Runnable() {
76
77 public void run() {
78 try {
79
80 aai.detachAppender("foo");
81 } catch (OutOfMemoryError e) {
82
83 }
84 }
85 });
86 t.start();
87 t.join();
88
89
90 aai.appendLoopOnAppenders(17);
91 verify(mockAppender);
92 }
93
94 }