package com.github.stefanbirkner.systemlambda; import java.io.*; import java.lang.reflect.Field; import java.net.InetAddress; import java.nio.charset.Charset; import java.security.Permission; import java.util.HashMap; import java.util.Map; import java.util.Properties; import static java.lang.Class.forName; import static java.lang.System.*; import static java.nio.charset.Charset.defaultCharset; import static java.util.Arrays.stream; import static java.util.Collections.singletonMap; import static java.util.stream.Collectors.joining; /** * {@code SystemLambda} is a collection of functions for testing code * that uses {@code java.lang.System}. * *
The function * {@link #withSecurityManager(SecurityManager, Statement) withSecurityManager} * lets you specify which {@code SecurityManager} is returned by * {@code System.getSecurityManger()} while your code under test is executed. *
* @Test * void execute_code_with_specific_SecurityManager() { * SecurityManager securityManager = new ASecurityManager(); * withSecurityManager( * securityManager, * () -> { * //code under test * //e.g. the following assertion is met * assertSame( * securityManager, * System.getSecurityManager() * ); * } * ); * } **
After the statement {@code withSecurityManager(...)} is executed * {@code System.getSecurityManager()} will return the original security manager * again. * *
The method * {@link #withEnvironmentVariable(String, String) withEnvironmentVariable} * allows you to set environment variables within your test code that are * removed after you code under test is executed. *
* @Test * void set_environment_variables() throws Exception { * withEnvironmentVariable("first", "first value") * .and("second", "second value") * .execute(() -> { * assertEquals("first value", System.getenv("first")); * assertEquals("second value", System.getenv("second")); * }); * }* *
The function * {@link #restoreSystemProperties(Statement) restoreSystemProperties} * guarantees that after executing the test code each System property has the * same value like before. Therefore you can modify System properties inside of * the test code without having an impact on other tests. *
* @Test * void execute_code_that_manipulates_system_properties() { * restoreSystemProperties( * () -> { * System.setProperty("some.property", "some value"); * //code under test that reads properties (e.g. "some.property") or * //modifies them. * } * ); * } ** *
Command-line applications terminate by calling {@code System.exit} with * some status code. If you test such an application then the JVM that runs the * test would exit when the application under test calls {@code System.exit}. * You can avoid this with the method * {@link #catchSystemExit(Statement) catchSystemExit} which also provides the * status code of the {@code System.exit} call. * *
* @Test * public void catch_status_code_of_System_exit() { * int statusCode = catchSystemExit(() -> { * System.exit(42); * }); * assertEquals(42, statusCode); * } ** * The method `{@code catchSystemExit} throws an {@code AssertionError} if the * code under test does not call {@code System.exit}. Therefore your test fails * with a failure message "System.exit has not been called." * *
Command-line applications usually write to the console. If you write such * applications you need to test the output of these applications. The methods * {@link #tapSystemErr(Statement) tapSystemErr}, * {@link #tapSystemErrNormalized(Statement) tapSystemErrNormalized}, * {@link #tapSystemOut(Statement) tapSystemOut} and * {@link #tapSystemOutNormalized(Statement) tapSystemOutNormalized} allow you * to tap the text that is written to {@code System.err}/{@code System.out}. The * methods with the suffix {@code Normalized} normalize line breaks to * {@code \n} so that you can run tests with the same assertions on Linux, * macOS and Windows. * *
* @Test * void check_text_written_to_System_err() throws Exception { * String text = tapSystemErr( * () -> System.err.println("some text") * ); * assertEquals(text, "some text"); * } * * @Test * void check_multiple_lines_written_to_System_err() throws Exception { * String text = tapSystemErrNormalized( * () -> { * System.err.println("first line"); * System.err.println("second line"); * } * ); * assertEquals(text, "first line\nsecond line"); * } * * @Test * void check_text_written_to_System_out() throws Exception { * String text = tapSystemOut( * () -> System.out.println("some text") * ); * assertEquals(text, "some text"); * } * * @Test * void check_multiple_lines_written_to_System_out() throws Exception { * String text = tapSystemOutNormalized( * () -> { * System.out.println("first line"); * System.out.println("second line"); * } * ); * assertEquals(text, "first line\nsecond line"); * }* *
You can assert that nothing is written to * {@code System.err}/{@code System.out} by wrapping code with the function * {@link #assertNothingWrittenToSystemErr(Statement) * assertNothingWrittenToSystemErr}/{@link #assertNothingWrittenToSystemOut(Statement) * assertNothingWrittenToSystemOut}. E.g. the following tests fail: *
* @Test * void fails_because_something_is_written_to_System_err() { * assertNothingWrittenToSystemErr( * () -> { * System.err.println("some text"); * } * ); * } * * @Test * void fails_because_something_is_written_to_System_out() { * assertNothingWrittenToSystemOut( * () -> { * System.out.println("some text"); * } * ); * } ** *
If the code under test writes text to * {@code System.err}/{@code System.out} then it is intermixed with the output * of your build tool. Therefore you may want to avoid that the code under test * writes to {@code System.err}/{@code System.out}. You can achieve this with * the function {@link #muteSystemErr(Statement) * muteSystemErr}/{@link #muteSystemOut(Statement) muteSystemOut}. E.g. the * following tests don't write anything to * {@code System.err}/{@code System.out}: *
* @Test * void nothing_is_written_to_System_err() { * muteSystemErr( * () -> { * System.err.println("some text"); * } * ); * } * * @Test * void nothing_is_written_to_System_out() { * muteSystemOut( * () -> { * System.out.println("some text"); * } * ); * } ** *
Interactive command-line applications read from {@code System.in}. If you * write such applications you need to provide input to these applications. You * can specify the lines that are available from `{@code System.in} with the * method {@link #withTextFromSystemIn(String...) withTextFromSystemIn} *
* @Test * void readTextFromSystemIn() { * withTextFromSystemIn("first line", "second line") * .execute(() -> { * Scanner scanner = new Scanner(System.in); * scanner.nextLine(); * assertEquals("first line", scanner.nextLine()); * }); * } ** * For a complete test coverage you may also want to simulate `System.in` throwing * exceptions when the application reads from it. You can specify such an * exception (either `RuntimeException` or `IOException` after specifying the text. * The exception will be thrown by the next `read` after the text has been * consumed. *
* @Test * void readTextFromSystemInWithIOException() { * withTextFromSystemIn("first line", "second line") * .andExceptionThrownOnInputEnd(new IOException()) * .execute(() -> { * Scanner scanner = new Scanner(System.in); * scanner.nextLine(); * scanner.nextLine(); * assertThrownBy( * IOException.class, * () -> scanner.readLine() * ); * }); * } * * @Test * void readTextFromSystemInFailsWithRuntimeException() { * withTextFromSystemIn("first line", "second line") * .andExceptionThrownOnInputEnd(new RuntimeException()) * .execute(() -> { * Scanner scanner = new Scanner(System.in); * scanner.nextLine(); * scanner.nextLine(); * assertThrownBy( * RuntimeException.class, * () -> scanner.readLine() * ); * }); * } ** * You can write a test that throws an exception immediately by not providing any * text. *
* withTextFromSystemIn() * .andExceptionThrownOnInputEnd(...) * .execute(() -> { * Scanner scanner = new Scanner(System.in); * assertThrownBy( * ..., * () -> scanner.readLine() * ); * }); ** *
It provides support for *
The following test fails *
* @Test * public void fails_because_something_is_written_to_System_err() { * assertNothingWrittenToSystemErr( * () -> { * System.err.println("some text"); * } * ); * } ** The test fails with the failure "Tried to write 's' to System.err * although this is not allowed." * * @param statement an arbitrary piece of code. * @throws Exception any exception thrown by the statement or an * {@code AssertionError} if the statement tries to write * to {@code System.err}. * @see #assertNothingWrittenToSystemOut(Statement) * @since 1.0.0 */ public static void assertNothingWrittenToSystemErr( Statement statement ) throws Exception { executeWithSystemErrReplacement( new DisallowWriteStream(), statement ); } /** * Executes the statement and fails (throws an {@code AssertionError}) if * the statement tries to write to {@code System.out}. *
The following test fails *
* @Test * public void fails_because_something_is_written_to_System_out() { * assertNothingWrittenToSystemOut( * () -> { * System.out.println("some text"); * } * ); * } ** The test fails with the failure "Tried to write 's' to System.out * although this is not allowed." * * @param statement an arbitrary piece of code. * @throws Exception any exception thrown by the statement or an * {@code AssertionError} if the statement tries to write * to {@code System.out}. * @see #assertNothingWrittenToSystemErr(Statement) * @since 1.0.0 */ public static void assertNothingWrittenToSystemOut( Statement statement ) throws Exception { executeWithSystemOutReplacement( new DisallowWriteStream(), statement ); } /** * Usually the output of a test to {@code System.err} does not have to be * visible. It may even slowdown the test. {@code muteSystemErr} can be * used to suppress this output. *
* @Test * public void nothing_is_written_to_System_err() { * muteSystemErr( * () -> { * System.err.println("some text"); * } * ); * } ** * @param statement an arbitrary piece of code. * @throws Exception any exception thrown by the statement. * @see #muteSystemOut(Statement) * @since 1.0.0 */ public static void muteSystemErr( Statement statement ) throws Exception { executeWithSystemErrReplacement( new NoopStream(), statement ); } /** * Usually the output of a test to {@code System.out} does not have to be * visible. It may even slowdown the test. {@code muteSystemOut} can be * used to suppress this output. *
* @Test * public void nothing_is_written_to_System_out() { * muteSystemOut( * () -> { * System.out.println("some text"); * } * ); * } ** * @param statement an arbitrary piece of code. * @throws Exception any exception thrown by the statement. * @see #muteSystemErr(Statement) * @since 1.0.0 */ public static void muteSystemOut( Statement statement ) throws Exception { executeWithSystemOutReplacement( new NoopStream(), statement ); } /** * {@code tapSystemErr} returns a String with the text that is written to * {@code System.err} by the provided piece of code. *
* @Test * public void check_the_text_that_is_written_to_System_err() { * String textWrittenToSystemErr = tapSystemErr( * () -> { * System.err.print("some text"); * } * ); * assertEquals("some text", textWrittenToSystemErr); * } ** * @param statement an arbitrary piece of code. * @return text that is written to {@code System.err} by the statement. * @throws Exception any exception thrown by the statement. * @see #tapSystemOut(Statement) * @since 1.0.0 */ public static String tapSystemErr( Statement statement ) throws Exception { TapStream tapStream = new TapStream(); executeWithSystemErrReplacement( tapStream, statement ); return tapStream.textThatWasWritten(); } /** * {@code tapSystemOut} returns a String with the text that is written to * {@code System.out} by the provided piece of code. *
* @Test * public void check_the_text_that_is_written_to_System_out() { * String textWrittenToSystemOut = tapSystemOut( * () -> { * System.out.print("some text"); * } * ); * assertEquals("some text", textWrittenToSystemOut); * } ** * @param statement an arbitrary piece of code. * @return text that is written to {@code System.out} by the statement. * @throws Exception any exception thrown by the statement. * @see #tapSystemErr(Statement) * @since 1.0.0 */ public static String tapSystemOut( Statement statement ) throws Exception { TapStream tapStream = new TapStream(); executeWithSystemOutReplacement( tapStream, statement ); return tapStream.textThatWasWritten(); } /** * {@code tapSystemErrNormalized} returns a String with the text that is * written to {@code System.err} by the provided piece of code. New line * characters are replaced with a single {@code \n}. *
* @Test * public void check_the_text_that_is_written_to_System_err() { * String textWrittenToSystemErr = tapSystemErrNormalized( * () -> { * System.err.println("some text"); * } * ); * assertEquals("some text\n", textWrittenToSystemErr); * } ** * @param statement an arbitrary piece of code. * @return text that is written to {@code System.err} by the statement. * @throws Exception any exception thrown by the statement. * @see #tapSystemOut(Statement) * @since 1.0.0 */ public static String tapSystemErrNormalized( Statement statement ) throws Exception { return tapSystemErr(statement) .replace(lineSeparator(), "\n"); } /** * {@code tapSystemOutNormalized} returns a String with the text that is * written to {@code System.out} by the provided piece of code. New line * characters are replaced with a single {@code \n}. *
* @Test * public void check_the_text_that_is_written_to_System_out() { * String textWrittenToSystemOut = tapSystemOutNormalized( * () -> { * System.out.println("some text"); * } * ); * assertEquals("some text\n", textWrittenToSystemOut); * } ** * @param statement an arbitrary piece of code. * @return text that is written to {@code System.out} by the statement. * @throws Exception any exception thrown by the statement. * @see #tapSystemErr(Statement) * @since 1.0.0 */ public static String tapSystemOutNormalized( Statement statement ) throws Exception { return tapSystemOut(statement) .replace(lineSeparator(), "\n"); } /** * Executes the statement and restores the system properties after the * statement has been executed. This allows you to set or clear system * properties within the statement without affecting other tests. *
* @Test * public void execute_code_that_manipulates_system_properties( * ) throws Exception { * System.clearProperty("some property"); * System.setProperty("another property", "value before test"); * * restoreSystemProperties( * () -> { * System.setProperty("some property", "some value"); * assertEquals( * "some value", * System.getProperty("some property") * ); * * System.clearProperty("another property"); * assertNull( * System.getProperty("another property") * ); * } * ); * * //values are restored after test * assertNull( * System.getProperty("some property") * ); * assertEquals( * "value before test", * System.getProperty("another property") * ); * } ** @param statement an arbitrary piece of code. * @throws Exception any exception thrown by the statement. * @since 1.0.0 */ public static void restoreSystemProperties( Statement statement ) throws Exception { Properties originalProperties = getProperties(); setProperties(copyOf(originalProperties)); try { statement.execute(); } finally { setProperties(originalProperties); } } private static Properties copyOf(Properties source) { Properties copy = new Properties(); copy.putAll(source); return copy; } /** * Executes a statement with the specified environment variables. All * changes to environment variables are reverted after the statement has * been executed. *
* @Test * public void execute_code_with_environment_variables( * ) throws Exception { * withEnvironmentVariable("first", "first value") * .and("second", "second value") * .and("third", null) * .execute( * () -> { * assertEquals( * "first value", * System.getenv("first") * ); * assertEquals( * "second value", * System.getenv("second") * ); * assertNull( * System.getenv("third") * ); * } * ); * } **
You cannot specify the value of an an environment variable twice. An * {@code IllegalArgumentException} when you try. *
Warning: This method uses reflection for modifying internals of the * environment variables map. It fails if your {@code SecurityManager} forbids * such modifications. * @param name the name of the environment variable. * @param value the value of the environment variable. * @return an {@link WithEnvironmentVariables} instance that can be used to * set more variables and run a statement with the specified environment * variables. * @since 1.0.0 * @see WithEnvironmentVariables#and(String, String) * @see WithEnvironmentVariables#execute(Statement) */ public static WithEnvironmentVariables withEnvironmentVariable( String name, String value ) { return new WithEnvironmentVariables( singletonMap(name, value)); } /** * Executes the statement with the provided security manager. *
* @Test * public void execute_code_with_specific_SecurityManager() { * SecurityManager securityManager = new ASecurityManager(); * withSecurityManager( * securityManager, * () -> { * assertSame(securityManager, System.getSecurityManager()); * } * ); * } ** The specified security manager is only present during the test. * @param securityManager the security manager that is used while the * statement is executed. * @param statement an arbitrary piece of code. * @throws Exception any exception thrown by the statement. * @since 1.0.0 */ public static void withSecurityManager( SecurityManager securityManager, Statement statement ) throws Exception { SecurityManager originalSecurityManager = getSecurityManager(); setSecurityManager(securityManager); try { statement.execute(); } finally { setSecurityManager(originalSecurityManager); } } /** * Executes the statement and lets {@code System.in} provide the specified * text during the execution. In addition several Exceptions can be * specified that are thrown when {@code System.in#read} is called. * *
* public void MyTest { * * @Test * public void readTextFromStandardInputStream() { * withTextFromSystemIn("first line", "second line") * .execute(() -> { * Scanner scanner = new Scanner(System.in); * scanner.nextLine(); * assertEquals("first line", scanner.nextLine()); * }); * } * } ** *
You can also simulate a {@code System.in} that throws an * {@code IOException} or {@code RuntimeException}. Use * *
* public void MyTest { * * @Test * public void readTextFromStandardInputStreamFailsWithIOException() { * withTextFromSystemIn() * .andExceptionThrownOnInputEnd(new IOException()) * .execute(() -> { * assertThrownBy( * IOException.class, * () -> new Scanner(System.in).readLine()) * ); * )}; * } * * @Test * public void readTextFromStandardInputStreamFailsWithRuntimeException() { * withTextFromSystemIn() * .andExceptionThrownOnInputEnd(new RuntimeException()) * .execute(() -> { * assertThrownBy( * RuntimeException.class, * () -> new Scanner(System.in).readLine()) * ); * )}; * } * } **
If you provide text as parameters of {@code withTextFromSystemIn(...)}
* in addition then the exception is thrown after the text has been read
* from {@code System.in}.
* @param lines the lines that are available from {@code System.in}.
* @return an {@link SystemInStub} instance that is used to execute a
* statement with its {@link SystemInStub#execute(Statement) execute}
* method. In addition it can be used to specify an exception that is thrown
* after the text is read.
* @since 1.0.0
* @see SystemInStub#execute(Statement)
* @see SystemInStub#andExceptionThrownOnInputEnd(IOException)
* @see SystemInStub#andExceptionThrownOnInputEnd(RuntimeException)
*/
public static SystemInStub withTextFromSystemIn(
String... lines
) {
String text = stream(lines)
.map(line -> line + getProperty("line.separator"))
.collect(joining());
return new SystemInStub(text);
}
private static void executeWithSystemErrReplacement(
OutputStream replacementForErr,
Statement statement
) throws Exception {
PrintStream originalStream = err;
try {
setErr(wrap(replacementForErr));
statement.execute();
} finally {
setErr(originalStream);
}
}
private static void executeWithSystemOutReplacement(
OutputStream replacementForOut,
Statement statement
) throws Exception {
PrintStream originalStream = out;
try {
setOut(wrap(replacementForOut));
statement.execute();
} finally {
setOut(originalStream);
}
}
private static PrintStream wrap(
OutputStream outputStream
) throws UnsupportedEncodingException {
return new PrintStream(
outputStream,
AUTO_FLUSH,
DEFAULT_ENCODING
);
}
private static class DisallowWriteStream extends OutputStream {
@Override
public void write(int b) {
throw new AssertionError(
"Tried to write '"
+ (char) b
+ "' although this is not allowed."
);
}
}
private static class NoopStream extends OutputStream {
@Override
public void write(
int b
) {
}
}
private static class TapStream extends OutputStream {
final ByteArrayOutputStream text = new ByteArrayOutputStream();
@Override
public void write(
int b
) {
text.write(b);
}
String textThatWasWritten() {
return text.toString();
}
}
/**
* A collection of values for environment variables. New values can be
* added by {@link #and(String, String)}. The {@code EnvironmentVariables}
* object is then used to execute an arbitrary piece of code with these
* environment variables being present.
*/
public static final class WithEnvironmentVariables {
private final Map You cannot specify the value of an environment variable twice. An
* {@code IllegalArgumentException} when you try.
* @param name the name of the environment variable.
* @param value the value of the environment variable.
* @return a new {@code WithEnvironmentVariables} object.
* @throws IllegalArgumentException when a value for the environment
* variable {@code name} is already specified.
* @see #withEnvironmentVariable(String, String)
* @see #execute(Statement)
*/
public WithEnvironmentVariables and(
String name,
String value
) {
validateNotSet(name, value);
HashMap Warning: This method uses reflection for modifying internals of the
* environment variables map. It fails if your {@code SecurityManager} forbids
* such modifications.
* @throws Exception any exception thrown by the statement.
* @since 1.0.0
* @see #withEnvironmentVariable(String, String)
* @see WithEnvironmentVariables#and(String, String)
*/
public void execute(
Statement statement
) throws Exception {
Map
* @Test
* public void execute_code_with_environment_variables(
* ) throws Exception {
* withEnvironmentVariable("first", "first value")
* .and("second", "second value")
* .and("third", null)
* .execute(
* () -> {
* assertEquals(
* "first value",
* System.getenv("first")
* );
* assertEquals(
* "second value",
* System.getenv("second")
* );
* assertNull(
* System.getenv("third")
* );
* }
* );
* }
*
*
*{@literal @Test}
* public void catch_status_code_of_System_exit() {
* int statusCode = catchSystemExit((){@literal ->} {
* System.exit(42);
* });
* assertEquals(42, statusCode);
* }
*
* @param statement an arbitrary piece of code.
* @return the status code provided to {@code System.exit(int)}.
* @throws Exception any exception thrown by the statement.
* @throws AssertionError if the statement does not call
* {@code System.exit(int)}.
* @since 1.0.0
*/
public static int catchSystemExit(
Statement statement
) throws Exception {
NoExitSecurityManager noExitSecurityManager
= new NoExitSecurityManager(getSecurityManager());
try {
withSecurityManager(noExitSecurityManager, statement);
} catch (CheckExitCalled ignored) {
}
return checkSystemExit(noExitSecurityManager);
}
private static int checkSystemExit(
NoExitSecurityManager securityManager
) {
if (securityManager.isCheckExitCalled())
return securityManager.getStatusOfFirstCheckExitCall();
else
throw new AssertionError("System.exit has not been called.");
}
private static class CheckExitCalled extends SecurityException {
private static final long serialVersionUID = 159678654L;
}
/**
* A {@code NoExitSecurityManager} throws a {@link CheckExitCalled} exception
* whenever {@link #checkExit(int)} is called. All other method calls are
* delegated to the original security manager.
*/
private static class NoExitSecurityManager extends SecurityManager {
private final SecurityManager originalSecurityManager;
private Integer statusOfFirstExitCall = null;
NoExitSecurityManager(
SecurityManager originalSecurityManager
) {
this.originalSecurityManager = originalSecurityManager;
}
@Override
public void checkExit(
int status
) {
if (statusOfFirstExitCall == null)
statusOfFirstExitCall = status;
throw new CheckExitCalled();
}
boolean isCheckExitCalled() {
return statusOfFirstExitCall != null;
}
int getStatusOfFirstCheckExitCall() {
if (isCheckExitCalled())
return statusOfFirstExitCall;
else
throw new IllegalStateException(
"checkExit(int) has not been called.");
}
@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 void checkPrintJobAccess() {
if (originalSecurityManager != null)
originalSecurityManager.checkPrintJobAccess();
}
@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 checkSecurityAccess(String target) {
if (originalSecurityManager != null)
originalSecurityManager.checkSecurityAccess(target);
}
@Override
public ThreadGroup getThreadGroup() {
return (originalSecurityManager == null) ? super.getThreadGroup()
: originalSecurityManager.getThreadGroup();
}
}
}