1   package org.microemu.app.util;
2   
3   import org.microemu.Injected;
4   import org.microemu.log.Logger;
5   import org.microemu.log.LoggingEvent;
6   
7   import junit.framework.TestCase;
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  	private class LogginThread extends Thread {
50  
51  		private boolean success = false;
52  
53  		public void run() {
54  			try {
55  				final String message = "Test text from LogginThread";
56  				capture.clearLastEvent();
57  
58  				StackTraceElement b4call = new Throwable().getStackTrace()[0];
59  				Injected.out.println(message);
60  
61  				verify(capture.getLastEvent(), b4call, message);
62  
63  				b4call = new Throwable().getStackTrace()[0];
64  				Injected.out.print(message + "\n");
65  
66  				verify(capture.getLastEvent(), b4call, message);
67  				
68  				success = true;
69  				
70  			} finally {
71  				synchronized (this) {
72  					notifyAll();
73  				}
74  			}
75  		}
76  
77  	}
78  	
79  	public void testRedirectStackFromThread() throws Exception {
80  		LogginThread thread = new LogginThread();
81  		synchronized (thread) {
82  			thread.start();
83  			thread.wait();
84  		}
85  		assertTrue("Log from Thread", thread.success);
86  	}
87  	
88  	private class MIDletInternlaLogger {
89  		
90  		public void debug(String message) {
91  			Injected.out.println(message);
92  		}
93  		
94  		public void error(String message) {
95  			Injected.out.println(message);
96  		}
97  		
98  		public void log(String message) {
99  			Injected.out.println(message);	
100 		}
101 	}
102 	
103 	public void testMIDletInternalLogger() throws Exception {
104 		final String message = "Test text";
105 		capture.clearLastEvent();
106 		MIDletInternlaLogger log = new MIDletInternlaLogger();
107 		
108 		StackTraceElement b4call = new Throwable().getStackTrace()[0];
109 		log.debug(message);
110 		
111 		verify(capture.getLastEvent(), b4call, message);
112 		
113 		b4call = new Throwable().getStackTrace()[0];
114 		log.error(message);
115 		
116 		verify(capture.getLastEvent(), b4call, message);
117 		
118 		b4call = new Throwable().getStackTrace()[0];
119 		log.log(message);
120 		
121 		verify(capture.getLastEvent(), b4call, message);
122 		
123 	}
124 	
125 	private class SubClass {
126 		
127 		void runTests(MIDletInternlaLogger log) {
128 			final String message = "Sub class Test text";
129 			StackTraceElement b4call = new Throwable().getStackTrace()[0];
130 			log.debug(message);
131 			
132 			verify(capture.getLastEvent(), b4call, message);
133 			
134 			b4call = new Throwable().getStackTrace()[0];
135 			log.error(message);
136 			
137 			verify(capture.getLastEvent(), b4call, message);
138 			
139 			b4call = new Throwable().getStackTrace()[0];
140 			log.log(message);
141 			
142 			verify(capture.getLastEvent(), b4call, message);
143 		}
144 	}
145 
146 	public void testMIDletInternalLoggerSubClass() throws Exception {
147 		capture.clearLastEvent();
148 		MIDletInternlaLogger log = new MIDletInternlaLogger();
149 		SubClass subtest = new SubClass();
150 		subtest.runTests(log);
151 	}
152 	
153 	private static class StaticLogger {
154 		
155 		public static void debug(String message) {
156 			Injected.out.println(message);
157 		}
158 		
159 		public static void error(String message) {
160 			Injected.out.println(message);
161 		}
162 		
163 		public static void log(String message) {
164 			Injected.out.println(message);	
165 		}
166 	}
167 	
168 	public void testMIDletInternalStaticLogger() throws Exception {
169 		final String message = "Test text Static logger";
170 		capture.clearLastEvent();
171 		
172 		StackTraceElement b4call = new Throwable().getStackTrace()[0];
173 		StaticLogger.debug(message);
174 		
175 		verify(capture.getLastEvent(), b4call, message);
176 		
177 		b4call = new Throwable().getStackTrace()[0];
178 		StaticLogger.error(message);
179 		
180 		verify(capture.getLastEvent(), b4call, message);
181 		
182 		b4call = new Throwable().getStackTrace()[0];
183 		StaticLogger.log(message);
184 		
185 		verify(capture.getLastEvent(), b4call, message);
186 		
187 	}
188 	
189 	private class LogginThreadStaticLogger extends Thread {
190 
191 		private boolean success = false;
192 
193 		public void run() {
194 			try {
195 				final String message = "Test text from LogginThread";
196 				capture.clearLastEvent();
197 
198 				StackTraceElement b4call = new Throwable().getStackTrace()[0];
199 				StaticLogger.debug(message);
200 
201 				verify(capture.getLastEvent(), b4call, message);
202 
203 				b4call = new Throwable().getStackTrace()[0];
204 				StaticLogger.log(message + "\n");
205 
206 				verify(capture.getLastEvent(), b4call, message);
207 				
208 				success = true;
209 				
210 			} finally {
211 				synchronized (this) {
212 					notifyAll();
213 				}
214 			}
215 		}
216 
217 	}
218 	
219 	public void testMIDletInternalStaticLoggerFromThread() throws Exception {
220 		LogginThreadStaticLogger thread = new LogginThreadStaticLogger();
221 		synchronized (thread) {
222 			thread.start();
223 			thread.wait();
224 		}
225 		assertTrue("Log from Thread", thread.success);
226 	}
227 
228 }
229