From 2cdb10c712e167f53be9a251333bb0c6514bdb1d Mon Sep 17 00:00:00 2001 From: Mark Waite Date: Mon, 17 Feb 2025 12:26:48 -0700 Subject: [PATCH 1/5] Sleep longer in the test --- .../steps/durable_task/ShellStepTest.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java b/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java index 0d431369..e8cf19a2 100644 --- a/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java +++ b/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java @@ -662,12 +662,25 @@ private static final class HelloNote extends ConsoleNote> { @Test public void deadStep() throws Exception { logging.record(DurableTaskStep.class, Level.INFO).record(CpsStepContext.class, Level.INFO).capture(100); WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "p"); - p.setDefinition(new CpsFlowDefinition("try {node {isUnix() ? sh('sleep 1000000') : bat('ping -t 127.0.0.1 > nul')}} catch (e) {sleep 1; throw e}", true)); + int sleepTime = Functions.isWindows() ? 13 : 1; + p.setDefinition(new CpsFlowDefinition(""" + try { + node { + isUnix() ? sh('sleep 1000000') : bat('ping -t 127.0.0.1 > nul') + } + } catch (e) { + sleep %d; + throw e + } + """.formatted(sleepTime), true)); WorkflowRun b = p.scheduleBuild2(0).waitForStart(); j.waitForMessage(Functions.isWindows() ? ">ping" : "+ sleep", b); b.doTerm(); j.waitForCompletion(b); j.assertBuildStatus(Result.ABORTED, b); + if (Functions.isWindows()) { + Thread.sleep(sleepTime * 1000L); + } for (LogRecord record : logging.getRecords()) { assertNull(record.getThrown()); } From c681238319f190446f16c948a1d6737b51f8d4e6 Mon Sep 17 00:00:00 2001 From: Mark Waite Date: Mon, 17 Feb 2025 18:02:37 -0700 Subject: [PATCH 2/5] Reduce diffs, only sleep extra in failure case --- .../steps/durable_task/ShellStepTest.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java b/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java index e8cf19a2..4ba2f970 100644 --- a/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java +++ b/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java @@ -662,23 +662,16 @@ private static final class HelloNote extends ConsoleNote> { @Test public void deadStep() throws Exception { logging.record(DurableTaskStep.class, Level.INFO).record(CpsStepContext.class, Level.INFO).capture(100); WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "p"); - int sleepTime = Functions.isWindows() ? 13 : 1; - p.setDefinition(new CpsFlowDefinition(""" - try { - node { - isUnix() ? sh('sleep 1000000') : bat('ping -t 127.0.0.1 > nul') - } - } catch (e) { - sleep %d; - throw e - } - """.formatted(sleepTime), true)); + // Test fails on ci.jenkins.io with timeout == 1 on Windows when watching + int sleepTime = Functions.isWindows() && useWatching ? 13 : 1; + p.setDefinition(new CpsFlowDefinition("try {node {isUnix() ? sh('sleep 1000000') : bat('ping -t 127.0.0.1 > nul')}} catch (e) {sleep " + sleepTime + "; throw e}", true)); WorkflowRun b = p.scheduleBuild2(0).waitForStart(); j.waitForMessage(Functions.isWindows() ? ">ping" : "+ sleep", b); b.doTerm(); j.waitForCompletion(b); j.assertBuildStatus(Result.ABORTED, b); - if (Functions.isWindows()) { + // Test fails on ci.jenkins.io with timeout == 1 on Windows when watching + if (Functions.isWindows() && useWatching) { Thread.sleep(sleepTime * 1000L); } for (LogRecord record : logging.getRecords()) { From 9ea7b736592afc813d6f499a9d9aaded6a8249a1 Mon Sep 17 00:00:00 2001 From: Mark Waite Date: Mon, 17 Feb 2025 18:10:31 -0700 Subject: [PATCH 3/5] Extend interruptingAbortsBuild timeout on Windows Job is interruopted but then reports the job succeeded. --- .../plugins/workflow/steps/durable_task/ShellStepTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java b/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java index 4ba2f970..28d59043 100644 --- a/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java +++ b/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java @@ -707,10 +707,13 @@ private static final class HelloNote extends ConsoleNote> { @Issue("JENKINS-28822") @Test public void interruptingAbortsBuild() throws Exception { WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "p"); + // Test fails unexpectedly on ci.jenkins.io Windows agents when watching + // Use a longer timeout when watching and running on Windows + int sleepTime = Functions.isWindows() && useWatching ? 19 : 6; p.setDefinition(new CpsFlowDefinition("node {\n" + " timeout(time: 1, unit: 'SECONDS') {" + (Functions.isWindows() - ? "bat 'ping -n 6 127.0.0.1 >nul'\n" + ? "bat 'ping -n " + sleepTime + " 127.0.0.1 >nul'\n" : "sh 'sleep 5'\n") + " }" + "}", true)); From f208ebc383515cef9bf8be9ea5f69515ed3d55b5 Mon Sep 17 00:00:00 2001 From: Mark Waite Date: Mon, 17 Feb 2025 19:15:08 -0700 Subject: [PATCH 4/5] deadStep fails even when not watching --- .../workflow/steps/durable_task/ShellStepTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java b/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java index 28d59043..62f7762a 100644 --- a/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java +++ b/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java @@ -662,16 +662,16 @@ private static final class HelloNote extends ConsoleNote> { @Test public void deadStep() throws Exception { logging.record(DurableTaskStep.class, Level.INFO).record(CpsStepContext.class, Level.INFO).capture(100); WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "p"); - // Test fails on ci.jenkins.io with timeout == 1 on Windows when watching - int sleepTime = Functions.isWindows() && useWatching ? 13 : 1; + // Test fails on ci.jenkins.io with timeout == 1 on Windows + int sleepTime = Functions.isWindows() ? 13 : 1; p.setDefinition(new CpsFlowDefinition("try {node {isUnix() ? sh('sleep 1000000') : bat('ping -t 127.0.0.1 > nul')}} catch (e) {sleep " + sleepTime + "; throw e}", true)); WorkflowRun b = p.scheduleBuild2(0).waitForStart(); j.waitForMessage(Functions.isWindows() ? ">ping" : "+ sleep", b); b.doTerm(); j.waitForCompletion(b); j.assertBuildStatus(Result.ABORTED, b); - // Test fails on ci.jenkins.io with timeout == 1 on Windows when watching - if (Functions.isWindows() && useWatching) { + // Test fails on ci.jenkins.io with timeout == 1 on Windows + if (Functions.isWindows()) { Thread.sleep(sleepTime * 1000L); } for (LogRecord record : logging.getRecords()) { @@ -709,7 +709,7 @@ private static final class HelloNote extends ConsoleNote> { WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "p"); // Test fails unexpectedly on ci.jenkins.io Windows agents when watching // Use a longer timeout when watching and running on Windows - int sleepTime = Functions.isWindows() && useWatching ? 19 : 6; + int sleepTime = Functions.isWindows() ? 19 : 6; p.setDefinition(new CpsFlowDefinition("node {\n" + " timeout(time: 1, unit: 'SECONDS') {" + (Functions.isWindows() From b96b276b01086d3ed533b29065a636a11ab198e5 Mon Sep 17 00:00:00 2001 From: Mark Waite Date: Mon, 17 Feb 2025 20:26:21 -0700 Subject: [PATCH 5/5] Use more pings in interruptingAbortsBuildEvenWithReturnStatus --- .../workflow/steps/durable_task/ShellStepTest.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java b/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java index 62f7762a..bf79f8cc 100644 --- a/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java +++ b/src/test/java/org/jenkinsci/plugins/workflow/steps/durable_task/ShellStepTest.java @@ -707,13 +707,11 @@ private static final class HelloNote extends ConsoleNote> { @Issue("JENKINS-28822") @Test public void interruptingAbortsBuild() throws Exception { WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "p"); - // Test fails unexpectedly on ci.jenkins.io Windows agents when watching - // Use a longer timeout when watching and running on Windows - int sleepTime = Functions.isWindows() ? 19 : 6; + // Test fails unexpectedly on ci.jenkins.io Windows agents with fewer pings p.setDefinition(new CpsFlowDefinition("node {\n" + " timeout(time: 1, unit: 'SECONDS') {" + (Functions.isWindows() - ? "bat 'ping -n " + sleepTime + " 127.0.0.1 >nul'\n" + ? "bat 'ping -n 19 127.0.0.1 >nul'\n" : "sh 'sleep 5'\n") + " }" + "}", true)); @@ -727,10 +725,11 @@ private static final class HelloNote extends ConsoleNote> { @Issue("JENKINS-28822") @Test public void interruptingAbortsBuildEvenWithReturnStatus() throws Exception { WorkflowJob p = j.jenkins.createProject(WorkflowJob.class, "p"); + // Test fails unexpectedly on ci.jenkins.io Windows agents with fewer pings p.setDefinition(new CpsFlowDefinition("node() {\n" + " timeout(time: 1, unit: 'SECONDS') {\n" + (Functions.isWindows() - ? "bat(returnStatus: true, script: 'ping -n 6 127.0.0.1 >nul')\n" + ? "bat(returnStatus: true, script: 'ping -n 19 127.0.0.1 >nul')\n" : "sh(returnStatus: true, script: 'sleep 5')\n") + " }\n" + "}", true));