diff --git a/bom/pom.xml b/bom/pom.xml index f1cfff2bb2..3aa7f546ea 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -63,7 +63,7 @@ THE SOFTWARE. org.springframework spring-framework-bom - 6.2.4 + 6.2.5 pom import @@ -89,7 +89,7 @@ THE SOFTWARE. com.google.guava guava - 33.4.0-jre + 33.4.5-jre com.sun.xml.txw2 diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index b0c6426954..8c192927c1 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -2633,11 +2633,13 @@ public class Functions { StaplerRequest2 currentRequest = Stapler.getCurrentRequest2(); currentRequest.getWebApp().getDispatchValidator().allowDispatch(currentRequest, Stapler.getCurrentResponse2()); String userAgent = currentRequest.getHeader("User-Agent"); - - List platformsThatUseCommand = List.of("MAC", "IPHONE", "IPAD"); - boolean useCmdKey = platformsThatUseCommand.stream().anyMatch(e -> userAgent.toUpperCase().contains(e)); - - return keyboardShortcut.replace("CMD", useCmdKey ? "⌘" : "CTRL"); + if (userAgent != null) { + List platformsThatUseCommand = List.of("MAC", "IPHONE", "IPAD"); + boolean useCmdKey = platformsThatUseCommand.stream().anyMatch(e -> userAgent.toUpperCase().contains(e)); + return keyboardShortcut.replace("CMD", useCmdKey ? "⌘" : "CTRL"); + } else { + return keyboardShortcut; + } } @Restricted(NoExternalUse.class) diff --git a/test/pom.xml b/test/pom.xml index 7edf741652..60b02ec557 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -350,7 +350,7 @@ THE SOFTWARE. io.jenkins.plugins design-library - 358.vcc903045e088 + 371.v171782a_56701 hpi ${project.build.outputDirectory}/plugins design-library.jpi diff --git a/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java b/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java index c3be6e4f7a..db88fa871f 100644 --- a/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java @@ -85,75 +85,55 @@ public class DisconnectNodeCommandTest { @Test public void disconnectNodeShouldSucceed() throws Exception { DumbSlave slave = j.createSlave("aNode", "", null); - slave.toComputer().waitUntilOnline(); - assertThat(slave.toComputer().isOnline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + assertOnline(slave); CLICommandInvoker.Result result = command .authorizedTo(Computer.DISCONNECT, Jenkins.READ) .invokeWithArgs("aNode"); assertThat(result, succeededSilently()); - assertThat(slave.toComputer().isOffline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo(null)); + assertOffline(slave, null); slave.toComputer().connect(true); - slave.toComputer().waitUntilOnline(); - assertThat(slave.toComputer().isOnline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + assertOnline(slave); result = command .authorizedTo(Computer.DISCONNECT, Jenkins.READ) .invokeWithArgs("aNode"); assertThat(result, succeededSilently()); - assertThat(slave.toComputer().isOffline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo(null)); + assertOffline(slave, null); result = command .authorizedTo(Computer.DISCONNECT, Jenkins.READ) .invokeWithArgs("aNode"); assertThat(result, succeededSilently()); - assertThat(slave.toComputer().isOffline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo(null)); + assertOffline(slave, null); } @Test public void disconnectNodeShouldSucceedWithCause() throws Exception { DumbSlave slave = j.createSlave("aNode", "", null); - slave.toComputer().waitUntilOnline(); - assertThat(slave.toComputer().isOnline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + assertOnline(slave); CLICommandInvoker.Result result = command .authorizedTo(Computer.DISCONNECT, Jenkins.READ) .invokeWithArgs("aNode", "-m", "aCause"); assertThat(result, succeededSilently()); - assertThat(slave.toComputer().isOffline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo("aCause")); + assertOffline(slave, "aCause"); slave.toComputer().connect(true); - slave.toComputer().waitUntilOnline(); - assertThat(slave.toComputer().isOnline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), equalTo(null)); + assertOnline(slave); result = command .authorizedTo(Computer.DISCONNECT, Jenkins.READ) .invokeWithArgs("aNode", "-m", "anotherCause"); assertThat(result, succeededSilently()); - assertThat(slave.toComputer().isOffline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo("anotherCause")); + assertOffline(slave, "anotherCause"); result = command .authorizedTo(Computer.DISCONNECT, Jenkins.READ) .invokeWithArgs("aNode", "-m", "yetAnotherCause"); assertThat(result, succeededSilently()); - assertThat(slave.toComputer().isOffline(), equalTo(true)); - assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo("yetAnotherCause")); + assertOffline(slave, "yetAnotherCause"); } @Test @@ -161,29 +141,17 @@ public class DisconnectNodeCommandTest { DumbSlave slave1 = j.createSlave("aNode1", "", null); DumbSlave slave2 = j.createSlave("aNode2", "", null); DumbSlave slave3 = j.createSlave("aNode3", "", null); - slave1.toComputer().waitUntilOnline(); - assertThat(slave1.toComputer().isOnline(), equalTo(true)); - assertThat(slave1.toComputer().getOfflineCause(), equalTo(null)); - slave2.toComputer().waitUntilOnline(); - assertThat(slave2.toComputer().isOnline(), equalTo(true)); - assertThat(slave2.toComputer().getOfflineCause(), equalTo(null)); - slave3.toComputer().waitUntilOnline(); - assertThat(slave3.toComputer().isOnline(), equalTo(true)); - assertThat(slave3.toComputer().getOfflineCause(), equalTo(null)); + assertOnline(slave1); + assertOnline(slave2); + assertOnline(slave3); final CLICommandInvoker.Result result = command .authorizedTo(Computer.DISCONNECT, Jenkins.READ) .invokeWithArgs("aNode1", "aNode2", "aNode3"); assertThat(result, succeededSilently()); - assertThat(slave1.toComputer().isOffline(), equalTo(true)); - assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo(null)); - assertThat(slave2.toComputer().isOffline(), equalTo(true)); - assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo(null)); - assertThat(slave3.toComputer().isOffline(), equalTo(true)); - assertThat(slave3.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave3.toComputer().getOfflineCause()).message, equalTo(null)); + assertOffline(slave1, null); + assertOffline(slave2, null); + assertOffline(slave3, null); } @Test @@ -194,10 +162,7 @@ public class DisconnectNodeCommandTest { agents.add(j.createSlave("aNode" + i, "", null)); } for (var agent : agents) { - var computer = agent.toComputer(); - computer.waitUntilOnline(); - assertThat(computer.isOnline(), equalTo(true)); - assertThat(computer.getOfflineCause(), equalTo(null)); + assertOnline(agent); } var args = new ArrayList(); @@ -211,14 +176,7 @@ public class DisconnectNodeCommandTest { .invokeWithArgs(args.toArray(String[]::new)); assertThat(result, succeededSilently()); for (var agent : agents) { - var computer = agent.toComputer(); - assertThat(computer.isOffline(), equalTo(true)); - var cause = computer.getOfflineCause(); - if (cause instanceof OfflineCause.ByCLI cliCause) { - assertThat(cliCause.message, equalTo("aCause")); - } else { - assertThat("seen occasionally in CI", cause, instanceOf(OfflineCause.ChannelTermination.class)); - } + assertOffline(agent, "aCause"); } } @@ -226,12 +184,8 @@ public class DisconnectNodeCommandTest { public void disconnectNodeManyShouldFailIfANodeDoesNotExist() throws Exception { DumbSlave slave1 = j.createSlave("aNode1", "", null); DumbSlave slave2 = j.createSlave("aNode2", "", null); - slave1.toComputer().waitUntilOnline(); - assertThat(slave1.toComputer().isOnline(), equalTo(true)); - assertThat(slave1.toComputer().getOfflineCause(), equalTo(null)); - slave2.toComputer().waitUntilOnline(); - assertThat(slave2.toComputer().isOnline(), equalTo(true)); - assertThat(slave2.toComputer().getOfflineCause(), equalTo(null)); + assertOnline(slave1); + assertOnline(slave2); final CLICommandInvoker.Result result = command .authorizedTo(Computer.DISCONNECT, Jenkins.READ) @@ -240,34 +194,40 @@ public class DisconnectNodeCommandTest { assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); - assertThat(slave1.toComputer().isOffline(), equalTo(true)); - assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo("aCause")); - assertThat(slave2.toComputer().isOffline(), equalTo(true)); - assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo("aCause")); + assertOffline(slave1, "aCause"); + assertOffline(slave2, "aCause"); } @Test public void disconnectNodeManyShouldSucceedEvenANodeIsSpecifiedTwice() throws Exception { DumbSlave slave1 = j.createSlave("aNode1", "", null); DumbSlave slave2 = j.createSlave("aNode2", "", null); - slave1.toComputer().waitUntilOnline(); - assertThat(slave1.toComputer().isOnline(), equalTo(true)); - assertThat(slave1.toComputer().getOfflineCause(), equalTo(null)); - slave2.toComputer().waitUntilOnline(); - assertThat(slave2.toComputer().isOnline(), equalTo(true)); - assertThat(slave2.toComputer().getOfflineCause(), equalTo(null)); + assertOnline(slave1); + assertOnline(slave2); final CLICommandInvoker.Result result = command .authorizedTo(Computer.DISCONNECT, Jenkins.READ) .invokeWithArgs("aNode1", "aNode2", "aNode1", "-m", "aCause"); assertThat(result, succeededSilently()); - assertThat(slave1.toComputer().isOffline(), equalTo(true)); - assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo("aCause")); - assertThat(slave2.toComputer().isOffline(), equalTo(true)); - assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); - assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo("aCause")); + assertOffline(slave1, "aCause"); + assertOffline(slave2, "aCause"); + } + + private static void assertOnline(DumbSlave slave) throws InterruptedException { + var computer = slave.toComputer(); + computer.waitUntilOnline(); + assertThat(computer.isOnline(), equalTo(true)); + assertThat(computer.getOfflineCause(), equalTo(null)); + } + + private static void assertOffline(DumbSlave slave, String message) { + var computer = slave.toComputer(); + assertThat(computer.isOffline(), equalTo(true)); + var offlineCause = computer.getOfflineCause(); + if (offlineCause instanceof OfflineCause.ByCLI cliCause) { + assertThat(cliCause.message, equalTo(message)); + } else { + assertThat("sometimes overrides ByCLI", offlineCause, instanceOf(OfflineCause.ChannelTermination.class)); + } } } diff --git a/war/pom.xml b/war/pom.xml index 37b586da5e..8e54e07075 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -375,7 +375,7 @@ THE SOFTWARE. io.jenkins.plugins eddsa-api - 0.3.0-13.v7cb_69ed68f00 + 0.3.0.1-16.vcb_4a_98a_3531c hpi