1 package org.microemu.app.util;
2
3 import junit.framework.TestCase;
4
5 import org.microemu.Injected;
6 import org.microemu.log.Logger;
7 import org.microemu.log.LoggingEvent;
8
9 public class MIDletOutputStreamRedirectorTest extends TestCase {
10
11 EventCatureLoggerAppender capture;
12
13 protected void setUp() throws Exception {
14 super.setUp();
15 capture = new EventCatureLoggerAppender();
16 Logger.addAppender(capture);
17 }
18
19 protected void tearDown() throws Exception {
20 super.tearDown();
21 Logger.removeAppender(capture);
22 }
23
24 private void verify(LoggingEvent event, StackTraceElement b4call, final String message) {
25 assertNotNull("got event", event);
26 assertEquals(message, event.getMessage());
27 StackTraceElement ste = event.getLocation();
28 assertNotNull("Has location info", ste);
29 assertEquals("MethodName", b4call.getMethodName(), ste.getMethodName());
30 assertEquals("ClassName", b4call.getClassName(), ste.getClassName());
31 assertEquals("LineNumber", b4call.getLineNumber() + 1, ste.getLineNumber());
32 }
33
34 public void testRedirectStack() throws Exception {
35 final String message = "Test text";
36 capture.clearLastEvent();
37
38 StackTraceElement b4call = new Throwable().getStackTrace()[0];
39 Injected.out.println(message);
40
41 verify(capture.getLastEvent(), b4call, message);
42
43 b4call = new Throwable().getStackTrace()[0];
44 Injected.out.print(message + "\n");
45
46 verify(capture.getLastEvent(), b4call, message);
47 }
48
49 public void testRedirectMultiLine() throws Exception {
50 final String message = "Test Line1\nTest Line2\nTest Line3";
51 capture.clearLastEvent();
52
53 StackTraceElement b4call = new Throwable().getStackTrace()[0];
54 Injected.out.println(message);
55 verify(capture.getLastEvent(), b4call, message);
56 }
57
58 private class LogginThread extends Thread {
59
60 private boolean success = false;
61
62 public void run() {
63 try {
64 final String message = "Test text from LogginThread";
65 capture.clearLastEvent();
66
67 StackTraceElement b4call = new Throwable().getStackTrace()[0];
68 Injected.out.println(message);
69
70 verify(capture.getLastEvent(), b4call, message);
71
72 b4call = new Throwable().getStackTrace()[0];
73 Injected.out.print(message + "\n");
74
75 verify(capture.getLastEvent(), b4call, message);
76
77 success = true;
78
79 } finally {
80 synchronized (this) {
81 notifyAll();
82 }
83 }
84 }
85
86 }
87
88 public void testRedirectStackFromThread() throws Exception {
89 LogginThread thread = new LogginThread();
90 synchronized (thread) {
91 thread.start();
92 thread.wait();
93 }
94 assertTrue("Log from Thread", thread.success);
95 }
96
97 private class MIDletInternlaLogger {
98
99 public void debug(String message) {
100 Injected.out.println(message);
101 }
102
103 public void error(String message) {
104 Injected.out.println(message);
105 }
106
107 public void log(String message) {
108 Injected.out.println(message);
109 }
110 }
111
112 public void testMIDletInternalLogger() throws Exception {
113 final String message = "Test text";
114 capture.clearLastEvent();
115 MIDletInternlaLogger log = new MIDletInternlaLogger();
116
117 StackTraceElement b4call = new Throwable().getStackTrace()[0];
118 log.debug(message);
119
120 verify(capture.getLastEvent(), b4call, message);
121
122 b4call = new Throwable().getStackTrace()[0];
123 log.error(message);
124
125 verify(capture.getLastEvent(), b4call, message);
126
127 b4call = new Throwable().getStackTrace()[0];
128 log.log(message);
129
130 verify(capture.getLastEvent(), b4call, message);
131
132 }
133
134 private class SubClass {
135
136 void runTests(MIDletInternlaLogger log) {
137 final String message = "Sub class Test text";
138 StackTraceElement b4call = new Throwable().getStackTrace()[0];
139 log.debug(message);
140
141 verify(capture.getLastEvent(), b4call, message);
142
143 b4call = new Throwable().getStackTrace()[0];
144 log.error(message);
145
146 verify(capture.getLastEvent(), b4call, message);
147
148 b4call = new Throwable().getStackTrace()[0];
149 log.log(message);
150
151 verify(capture.getLastEvent(), b4call, message);
152 }
153 }
154
155 public void testMIDletInternalLoggerSubClass() throws Exception {
156 capture.clearLastEvent();
157 MIDletInternlaLogger log = new MIDletInternlaLogger();
158 SubClass subtest = new SubClass();
159 subtest.runTests(log);
160 }
161
162 private static class StaticLogger {
163
164 public static void debug(String message) {
165 Injected.out.println(message);
166 }
167
168 public static void error(String message) {
169 Injected.out.println(message);
170 }
171
172 public static void log(String message) {
173 Injected.out.println(message);
174 }
175 }
176
177 public void testMIDletInternalStaticLogger() throws Exception {
178 final String message = "Test text Static logger";
179 capture.clearLastEvent();
180
181 StackTraceElement b4call = new Throwable().getStackTrace()[0];
182 StaticLogger.debug(message);
183
184 verify(capture.getLastEvent(), b4call, message);
185
186 b4call = new Throwable().getStackTrace()[0];
187 StaticLogger.error(message);
188
189 verify(capture.getLastEvent(), b4call, message);
190
191 b4call = new Throwable().getStackTrace()[0];
192 StaticLogger.log(message);
193
194 verify(capture.getLastEvent(), b4call, message);
195
196 }
197
198 private class LogginThreadStaticLogger extends Thread {
199
200 private Throwable throwable = null;
201
202 public void run() {
203 try {
204 final String message = "Test text from LogginThread";
205 capture.clearLastEvent();
206
207 StackTraceElement b4call = new Throwable().getStackTrace()[0];
208 StaticLogger.debug(message);
209
210 verify(capture.getLastEvent(), b4call, message);
211
212 b4call = new Throwable().getStackTrace()[0];
213 StaticLogger.log(message + "\n");
214
215 verify(capture.getLastEvent(), b4call, message);
216
217 } catch (Throwable t) {
218 throwable = t;
219 } finally {
220 synchronized (this) {
221 notifyAll();
222 }
223 }
224 }
225
226 }
227
228 public void testMIDletInternalStaticLoggerFromThread() throws Throwable {
229 LogginThreadStaticLogger thread = new LogginThreadStaticLogger();
230 synchronized (thread) {
231 thread.start();
232 thread.wait();
233 }
234 if (thread.throwable != null) {
235 throw thread.throwable;
236 }
237 }
238
239 }