package org.junit.tests.running.core; import java.io.ByteArrayOutputStream; import java.io.FileDescriptor; import java.io.PrintStream; import java.net.InetAddress; import java.security.Permission; public class MainRunner { private static class ExitException extends SecurityException { private static final long serialVersionUID = -9104651568237766642L; private final int status; public ExitException(int status) { super(""); this.status = status; } public int getStatus() { return status; } } /** * A {@code NoExitSecurityManager} throws a {@link ExitException} exception * whenever {@link #checkExit(int)} is called. All other method calls are * delegated to the original security manager. */ public class NoExitSecurityManager extends SecurityManager { private final SecurityManager originalSecurityManager; public NoExitSecurityManager(SecurityManager originalSecurityManager) { this.originalSecurityManager = originalSecurityManager; } @Override public void checkExit(int status) { throw new ExitException(status); } @Override public boolean getInCheck() { return (originalSecurityManager != null) && originalSecurityManager.getInCheck(); } @Override public Object getSecurityContext() { return (originalSecurityManager == null) ? super.getSecurityContext() : originalSecurityManager.getSecurityContext(); } @Override public void checkPermission(Permission perm) { if (originalSecurityManager != null) { originalSecurityManager.checkPermission(perm); } } @Override public void checkPermission(Permission perm, Object context) { if (originalSecurityManager != null) { originalSecurityManager.checkPermission(perm, context); } } @Override public void checkCreateClassLoader() { if (originalSecurityManager != null) { originalSecurityManager.checkCreateClassLoader(); } } @Override public void checkAccess(Thread t) { if (originalSecurityManager != null) { originalSecurityManager.checkAccess(t); } } @Override public void checkAccess(ThreadGroup g) { if (originalSecurityManager != null) { originalSecurityManager.checkAccess(g); } } @Override public void checkExec(String cmd) { if (originalSecurityManager != null) { originalSecurityManager.checkExec(cmd); } } @Override public void checkLink(String lib) { if (originalSecurityManager != null) { originalSecurityManager.checkLink(lib); } } @Override public void checkRead(FileDescriptor fd) { if (originalSecurityManager != null) { originalSecurityManager.checkRead(fd); } } @Override public void checkRead(String file) { if (originalSecurityManager != null) { originalSecurityManager.checkRead(file); } } @Override public void checkRead(String file, Object context) { if (originalSecurityManager != null) { originalSecurityManager.checkRead(file, context); } } @Override public void checkWrite(FileDescriptor fd) { if (originalSecurityManager != null) { originalSecurityManager.checkWrite(fd); } } @Override public void checkWrite(String file) { if (originalSecurityManager != null) { originalSecurityManager.checkWrite(file); } } @Override public void checkDelete(String file) { if (originalSecurityManager != null) { originalSecurityManager.checkDelete(file); } } @Override public void checkConnect(String host, int port) { if (originalSecurityManager != null) { originalSecurityManager.checkConnect(host, port); } } @Override public void checkConnect(String host, int port, Object context) { if (originalSecurityManager != null) { originalSecurityManager.checkConnect(host, port, context); } } @Override public void checkListen(int port) { if (originalSecurityManager != null) { originalSecurityManager.checkListen(port); } } @Override public void checkAccept(String host, int port) { if (originalSecurityManager != null) { originalSecurityManager.checkAccept(host, port); } } @Override public void checkMulticast(InetAddress maddr) { if (originalSecurityManager != null) { originalSecurityManager.checkMulticast(maddr); } } @Override public void checkMulticast(InetAddress maddr, byte ttl) { if (originalSecurityManager != null) { originalSecurityManager.checkMulticast(maddr, ttl); } } @Override public void checkPropertiesAccess() { if (originalSecurityManager != null) { originalSecurityManager.checkPropertiesAccess(); } } @Override public void checkPropertyAccess(String key) { if (originalSecurityManager != null) { originalSecurityManager.checkPropertyAccess(key); } } @Override public boolean checkTopLevelWindow(Object window) { return (originalSecurityManager == null) ? super.checkTopLevelWindow(window) : originalSecurityManager.checkTopLevelWindow(window); } @Override public void checkPrintJobAccess() { if (originalSecurityManager != null) { originalSecurityManager.checkPrintJobAccess(); } } @Override public void checkSystemClipboardAccess() { if (originalSecurityManager != null) { originalSecurityManager.checkSystemClipboardAccess(); } } @Override public void checkAwtEventQueueAccess() { if (originalSecurityManager != null) { originalSecurityManager.checkAwtEventQueueAccess(); } } @Override public void checkPackageAccess(String pkg) { if (originalSecurityManager != null) { originalSecurityManager.checkPackageAccess(pkg); } } @Override public void checkPackageDefinition(String pkg) { if (originalSecurityManager != null) { originalSecurityManager.checkPackageDefinition(pkg); } } @Override public void checkSetFactory() { if (originalSecurityManager != null) { originalSecurityManager.checkSetFactory(); } } @Override public void checkMemberAccess(Class<?> clazz, int which) { if (originalSecurityManager != null) { originalSecurityManager.checkMemberAccess(clazz, which); } } @Override public void checkSecurityAccess(String target) { if (originalSecurityManager != null) { originalSecurityManager.checkSecurityAccess(target); } } @Override public ThreadGroup getThreadGroup() { return (originalSecurityManager == null) ? super.getThreadGroup() : originalSecurityManager.getThreadGroup(); } } /** * Execute runnable.run(), preventing System.exit(). If System.exit() is called * in runnable.run(), the value is returned. If System.exit() * is not called, null is returned. * * @return null if System.exit() is not called, Integer.valueof(status) if not */ public Integer runWithCheckForSystemExit(Runnable runnable) { SecurityManager oldSecurityManager = System.getSecurityManager(); System.setSecurityManager(new NoExitSecurityManager(oldSecurityManager)); PrintStream oldOut = System.out; System.setOut(new PrintStream(new ByteArrayOutputStream())); try { runnable.run(); System.out.println("System.exit() not called, return null"); return null; } catch (ExitException e) { System.out.println("System.exit() called, value=" + e.getStatus()); return e.getStatus(); } finally { System.setSecurityManager(oldSecurityManager); System.setOut(oldOut); } } }