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 }