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
27
28
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
268
269
270
271
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 }