diff options
author | Damien Martin-Guillerez <dmarting@google.com> | 2016-01-13 09:08:48 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2016-01-13 13:16:32 +0000 |
commit | eea8efaf39da92e4811ed7b551b2a978e34ff92e (patch) | |
tree | 14cc3b3baf5730a3b804b626be9f6102d31c2d21 /src/java_tools/junitrunner/java/com/google/testing/junit/runner/internal/SignalHandlers.java | |
parent | 2665d68341e1e82daec9143ae2822a6e00980890 (diff) |
Open-source the JUnit test runner.
--
MOS_MIGRATED_REVID=112027454
Diffstat (limited to 'src/java_tools/junitrunner/java/com/google/testing/junit/runner/internal/SignalHandlers.java')
-rw-r--r-- | src/java_tools/junitrunner/java/com/google/testing/junit/runner/internal/SignalHandlers.java | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/java_tools/junitrunner/java/com/google/testing/junit/runner/internal/SignalHandlers.java b/src/java_tools/junitrunner/java/com/google/testing/junit/runner/internal/SignalHandlers.java new file mode 100644 index 0000000000..c1573d5a78 --- /dev/null +++ b/src/java_tools/junitrunner/java/com/google/testing/junit/runner/internal/SignalHandlers.java @@ -0,0 +1,81 @@ +// Copyright 2010 The Bazel Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.testing.junit.runner.internal; + +import com.google.inject.Inject; + +import sun.misc.Signal; +import sun.misc.SignalHandler; + +import java.util.concurrent.atomic.AtomicReference; + +/** + * Helper class to install signal handlers. + */ +public class SignalHandlers { + private final HandlerInstaller handlerInstaller; + + /** + * Creates a handler installer that installs signal handlers. + */ + public static HandlerInstaller createRealHandlerInstaller() { + return new HandlerInstaller() { + @Override + public SignalHandler install(Signal signal, SignalHandler handler) { + return Signal.handle(signal, handler); + } + }; + } + + @Inject + public SignalHandlers(HandlerInstaller installer) { + this.handlerInstaller = installer; + } + + /** + * Adds the given signal handler to the existing ones. + * + * <p>Signal handlers are responsible to catch any exception if the following + * handlers need to be executed when a handler throws an exception. + * + * @param signal The signal to handle. + * @param signalHandler The handler to install. + */ + public void installHandler(Signal signal, final SignalHandler signalHandler) { + final AtomicReference<SignalHandler> previousHandlerReference = + new AtomicReference<>(); + previousHandlerReference.set(handlerInstaller.install(signal, new SignalHandler() { + @Override + public void handle(Signal signal) { + signalHandler.handle(signal); + SignalHandler previousHandler = previousHandlerReference.get(); + if (previousHandler != null) { + previousHandler.handle(signal); + } + } + })); + } + + /** + * Wraps sun.misc.Signal#handle(sun.misc.Signal, sun.misc.SignalHandler) + * to help with testing. + */ + public interface HandlerInstaller { + /** + * @see sun.misc.Signal#handle(sun.misc.Signal, sun.misc.SignalHandler) + */ + SignalHandler install(Signal signal, SignalHandler handler); + } +} |