// Provider of invalid signal names
@DataProvider(name = "invalidSunMiscSignalNames")
Object[][] invalidSunMiscSignalNames() { returnnew Object[][]{
{""},
{"I"},
{"SIG"},
{"SIGabc"},
{"SIGINT"}, // prefix not allowed
{"abc"},
};
}
static Object[][] concatArrays(Object[][]... arrays) { int l = 0; for (Object[][] a : arrays) {
l += a.length;
}
Object[][] newArray = new Object[l][];
l = 0; for (int i = 0; i < arrays.length; i++) {
System.arraycopy(arrays[i], 0, newArray, l, arrays[i].length);
l += arrays[i].length;
}
return newArray;
}
// Return true if the signal is one of the shutdown signals known to the VM privatestaticboolean isShutdownSignal(Signal signal) {
String name = signal.getName(); return name.equals("INT") || name.equals("HUP") || name.equals("TERM");
}
/** *Quickverificationofsupportedsignalsusingsun.misc.Signal. * *@paramnamethesignalname *@throwsInterruptedExceptionwouldbeanerrorifthrown
*/
@Test(dataProvider = "supportedSignals") staticvoid testSunMisc(String name, IsSupported supported, CanRegister register,
CanRaise raise, Invoked invoked) throws InterruptedException {
Handler h = new Handler();
SignalHandler orig = null;
Signal signal = null; try {
signal = new Signal(name); Assert.assertEquals(supported, IsSupported.YES, "Unexpected support for " + name);
// Note: JDK 8 did not check/throw NPE, passing null resulted in a segv
@Test(expectedExceptions = NullPointerException.class) staticvoid nullSignal() { new Signal(null);
}
// Test expected exception when raising a signal when no handler defined
@Test staticvoid testRaiseNoConsumer() {
Signal signal = new Signal("INT");
SignalHandler orig = null; try {
orig = Signal.handle(signal, SignalHandler.SIG_DFL);
printf("oldHandler: %s%n", orig); if (orig == SignalHandler.SIG_IGN) { // SIG_IGN for TERM means it cannot be handled return;
}
Signal.raise(signal); Assert.fail("Should have thrown IllegalArgumentException");
} catch (IllegalArgumentException iae) {
printf("IAE message: %s%n", iae.getMessage());
} finally { // Restore original signal handler if (orig != null && signal != null) {
Signal.handle(signal, orig);
}
}
}
/** *Thethreadthatrunsthehandlerforsun.misc.Signalshouldbea *Daemonthread.
*/
@Test staticvoid isDaemonThread() throws InterruptedException { if (RUNNING_WITH_Xrs) { return;
}
Handler handler = new Handler();
Signal signal = new Signal("INT");
SignalHandler orig = Signal.handle(signal, handler);
printf("oldHandler: %s%n", orig); if (orig == SignalHandler.SIG_IGN) { // SIG_IGN for INT means it cannot be handled return;
}
Signal.raise(signal); boolean handled = handler.semaphore()
.tryAcquire(Utils.adjustTimeout(100L), TimeUnit.MILLISECONDS); if (!handled) { // For debug try again
printf("Second try to see signal");
handled = handler.semaphore()
.tryAcquire(Utils.adjustTimeout(2L), TimeUnit.SECONDS);
} Assert.assertEquals(handled, !RUNNING_WITH_Xrs, "raising s.m.Signal did not get a callback;");
Assert.assertTrue(handler.wasDaemon(), "Thread.isDaemon running the handler; ");
}
// Check that trying to invoke SIG_DFL.handle throws UnsupportedOperationException.
@Test(expectedExceptions = UnsupportedOperationException.class) staticvoid cannotHandleSIGDFL() {
Signal signal = new Signal("INT"); Assert.assertNotNull(SignalHandler.SIG_DFL, "SIG_DFL null; ");
SignalHandler.SIG_DFL.handle(signal);
}
// Check that trying to invoke SIG_IGN.handle throws UnsupportedOperationException.
@Test(expectedExceptions = UnsupportedOperationException.class) staticvoid cannotHandleSIGIGN() {
Signal signal = new Signal("INT"); Assert.assertNotNull(SignalHandler.SIG_IGN, "SIG_IGN null; ");
SignalHandler.SIG_IGN.handle(signal);
}
// Check that setting a Signal handler returns the previous handler.
@Test() staticvoid checkLastHandler() { if (RUNNING_WITH_Xrs) { return;
}
Signal signal = new Signal("TERM");
Handler h1 = new Handler();
Handler h2 = new Handler();
SignalHandler orig = Signal.handle(signal, h1); if (orig == SignalHandler.SIG_IGN) { // SIG_IGN for TERM means it cannot be handled return;
}
/** *TestHandler,aSignalHandlerforSignalnotifications. *Signalsasemaphorewheninvokedandrecordswhether *thethreadcallingtheHandlerwasadaemon.
*/ staticclass Handler implements SignalHandler { // A semaphore to check for accept being called
Semaphore sema = new Semaphore(0);
// Main can be used to run the tests from the command line with only testng.jar.
@SuppressWarnings("raw_types")
@Test(enabled = false) publicstaticvoid main(String[] args) { Class<?>[] testclass = {SunMiscSignalTest.class};
TestNG testng = new TestNG();
testng.setTestClasses(testclass);
testng.run();
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-06-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.