View Javadoc
1   package org.junit.tests.running.core;
2   
3   import java.io.ByteArrayOutputStream;
4   import java.io.FileDescriptor;
5   import java.io.PrintStream;
6   import java.net.InetAddress;
7   import java.security.Permission;
8   
9   public class MainRunner {
10      private static class ExitException extends SecurityException {
11          private static final long serialVersionUID = -9104651568237766642L;
12  
13          private final int status;
14  
15          public ExitException(int status) {
16              super("");
17              this.status = status;
18          }
19  
20          public int getStatus() {
21              return status;
22          }
23      }
24  
25      /**
26       * A {@code NoExitSecurityManager} throws a {@link ExitException} exception
27       * whenever {@link #checkExit(int)} is called. All other method calls are
28       * delegated to the original security manager.
29       */
30      public class NoExitSecurityManager extends SecurityManager {
31          private final SecurityManager originalSecurityManager;
32  
33          public NoExitSecurityManager(SecurityManager originalSecurityManager) {
34              this.originalSecurityManager = originalSecurityManager;
35          }
36  
37          @Override
38          public void checkExit(int status) {
39              throw new ExitException(status);
40          }
41  
42          @Override
43          public boolean getInCheck() {
44              return (originalSecurityManager != null) && originalSecurityManager.getInCheck();
45          }
46  
47          @Override
48          public Object getSecurityContext() {
49              return (originalSecurityManager == null) ? super.getSecurityContext() : originalSecurityManager.getSecurityContext();
50          }
51  
52          @Override
53          public void checkPermission(Permission perm) {
54              if (originalSecurityManager != null) {
55                  originalSecurityManager.checkPermission(perm);
56              }
57          }
58  
59          @Override
60          public void checkPermission(Permission perm, Object context) {
61              if (originalSecurityManager != null) {
62                  originalSecurityManager.checkPermission(perm, context);
63              }
64          }
65  
66          @Override
67          public void checkCreateClassLoader() {
68              if (originalSecurityManager != null) {
69                  originalSecurityManager.checkCreateClassLoader();
70              }
71          }
72  
73          @Override
74          public void checkAccess(Thread t) {
75              if (originalSecurityManager != null) {
76                  originalSecurityManager.checkAccess(t);
77              }
78          }
79  
80          @Override
81          public void checkAccess(ThreadGroup g) {
82              if (originalSecurityManager != null) {
83                  originalSecurityManager.checkAccess(g);
84              }
85          }
86  
87          @Override
88          public void checkExec(String cmd) {
89              if (originalSecurityManager != null) {
90                  originalSecurityManager.checkExec(cmd);
91              }
92          }
93  
94          @Override
95          public void checkLink(String lib) {
96              if (originalSecurityManager != null) {
97                  originalSecurityManager.checkLink(lib);
98              }
99          }
100 
101         @Override
102         public void checkRead(FileDescriptor fd) {
103             if (originalSecurityManager != null) {
104                 originalSecurityManager.checkRead(fd);
105             }
106         }
107 
108         @Override
109         public void checkRead(String file) {
110             if (originalSecurityManager != null) {
111                 originalSecurityManager.checkRead(file);
112             }
113         }
114 
115         @Override
116         public void checkRead(String file, Object context) {
117             if (originalSecurityManager != null) {
118                 originalSecurityManager.checkRead(file, context);
119             }
120         }
121 
122         @Override
123         public void checkWrite(FileDescriptor fd) {
124             if (originalSecurityManager != null) {
125                 originalSecurityManager.checkWrite(fd);
126             }
127         }
128 
129         @Override
130         public void checkWrite(String file) {
131             if (originalSecurityManager != null) {
132                 originalSecurityManager.checkWrite(file);
133             }
134         }
135 
136         @Override
137         public void checkDelete(String file) {
138             if (originalSecurityManager != null) {
139                 originalSecurityManager.checkDelete(file);
140             }
141         }
142 
143         @Override
144         public void checkConnect(String host, int port) {
145             if (originalSecurityManager != null) {
146                 originalSecurityManager.checkConnect(host, port);
147             }
148         }
149 
150         @Override
151         public void checkConnect(String host, int port, Object context) {
152             if (originalSecurityManager != null) {
153                 originalSecurityManager.checkConnect(host, port, context);
154             }
155         }
156 
157         @Override
158         public void checkListen(int port) {
159             if (originalSecurityManager != null) {
160                 originalSecurityManager.checkListen(port);
161             }
162         }
163 
164         @Override
165         public void checkAccept(String host, int port) {
166             if (originalSecurityManager != null) {
167                 originalSecurityManager.checkAccept(host, port);
168             }
169         }
170 
171         @Override
172         public void checkMulticast(InetAddress maddr) {
173             if (originalSecurityManager != null) {
174                 originalSecurityManager.checkMulticast(maddr);
175             }
176         }
177 
178         @Override
179         public void checkMulticast(InetAddress maddr, byte ttl) {
180             if (originalSecurityManager != null) {
181                 originalSecurityManager.checkMulticast(maddr, ttl);
182             }
183         }
184 
185         @Override
186         public void checkPropertiesAccess() {
187             if (originalSecurityManager != null) {
188                 originalSecurityManager.checkPropertiesAccess();
189             }
190         }
191 
192         @Override
193         public void checkPropertyAccess(String key) {
194             if (originalSecurityManager != null) {
195                 originalSecurityManager.checkPropertyAccess(key);
196             }
197         }
198 
199         @Override
200         public boolean checkTopLevelWindow(Object window) {
201             return (originalSecurityManager == null) ? super.checkTopLevelWindow(window) : originalSecurityManager.checkTopLevelWindow(window);
202         }
203 
204         @Override
205         public void checkPrintJobAccess() {
206             if (originalSecurityManager != null) {
207                 originalSecurityManager.checkPrintJobAccess();
208             }
209         }
210 
211         @Override
212         public void checkSystemClipboardAccess() {
213             if (originalSecurityManager != null) {
214                 originalSecurityManager.checkSystemClipboardAccess();
215             }
216         }
217 
218         @Override
219         public void checkAwtEventQueueAccess() {
220             if (originalSecurityManager != null) {
221                 originalSecurityManager.checkAwtEventQueueAccess();
222             }
223         }
224 
225         @Override
226         public void checkPackageAccess(String pkg) {
227             if (originalSecurityManager != null) {
228                 originalSecurityManager.checkPackageAccess(pkg);
229             }
230         }
231 
232         @Override
233         public void checkPackageDefinition(String pkg) {
234             if (originalSecurityManager != null) {
235                 originalSecurityManager.checkPackageDefinition(pkg);
236             }
237         }
238 
239         @Override
240         public void checkSetFactory() {
241             if (originalSecurityManager != null) {
242                 originalSecurityManager.checkSetFactory();
243             }
244         }
245 
246         @Override
247         public void checkMemberAccess(Class<?> clazz, int which) {
248             if (originalSecurityManager != null) {
249                 originalSecurityManager.checkMemberAccess(clazz, which);
250             }
251         }
252 
253         @Override
254         public void checkSecurityAccess(String target) {
255             if (originalSecurityManager != null) {
256                 originalSecurityManager.checkSecurityAccess(target);
257             }
258         }
259 
260         @Override
261         public ThreadGroup getThreadGroup() {
262             return (originalSecurityManager == null) ? super.getThreadGroup() : originalSecurityManager.getThreadGroup();
263         }
264     }
265 
266     /**
267      * Execute runnable.run(), preventing System.exit(). If System.exit() is called
268      * in runnable.run(), the value is returned. If System.exit()
269      * is not called, null is returned.
270      *
271      * @return null if System.exit() is not called, Integer.valueof(status) if not
272      */
273     public Integer runWithCheckForSystemExit(Runnable runnable) {
274         SecurityManager oldSecurityManager = System.getSecurityManager();
275         System.setSecurityManager(new NoExitSecurityManager(oldSecurityManager));
276         PrintStream oldOut = System.out;
277 
278         System.setOut(new PrintStream(new ByteArrayOutputStream()));
279         try {
280             runnable.run();
281             System.out.println("System.exit() not called, return null");
282             return null;
283         } catch (ExitException e) {
284             System.out.println("System.exit() called, value=" + e.getStatus());
285             return e.getStatus();
286         } finally {
287             System.setSecurityManager(oldSecurityManager);
288             System.setOut(oldOut);
289         }
290     }
291 }