From a67c4ba70d28214d03251fb961fb3c9ac060a889 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 10 Mar 2017 13:30:49 +0100 Subject: [PATCH] Ensured that exception is thrown when process returns with invalid code --- .../release/internal/project/Project.java | 9 +++- .../internal/project/ProjectTests.java | 44 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java index aec1d16e..f980205c 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java @@ -109,19 +109,26 @@ class ProcessExecutor { String workingDir = this.properties.getWorkingDir(); log.info("Will run the build via {} and wait for result for [{}] minutes", commands, waitTimeInMinutes); ProcessBuilder builder = builder(commands, workingDir); - Process process = builder.start(); + Process process = startProcess(builder); boolean finished = process.waitFor(waitTimeInMinutes, TimeUnit.MINUTES); if (!finished) { log.error("The build hasn't managed to finish in [{}] minutes", waitTimeInMinutes); process.destroyForcibly(); throw new IllegalStateException("Process waiting time of [" + waitTimeInMinutes + "] minutes exceeded"); } + if (process.exitValue() != 0) { + throw new IllegalStateException("The process has exited with exit code [" + process.exitValue() + "]"); + } } catch (InterruptedException | IOException e) { throw new IllegalStateException(e); } } + Process startProcess(ProcessBuilder builder) throws IOException { + return builder.start(); + } + ProcessBuilder builder(String[] commands, String workingDir) { return new ProcessBuilder(commands) .directory(new File(workingDir)) diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectTests.java index ef9cf4c0..42f002c6 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectTests.java @@ -2,6 +2,8 @@ package org.springframework.cloud.release.internal.project; import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.net.URISyntaxException; import java.nio.file.Files; @@ -124,6 +126,20 @@ public class ProjectTests { thenThrownBy(() -> builder.publishDocs("")).hasMessageContaining("Process waiting time of [0] minutes exceeded"); } + @Test + public void should_throw_exception_when_process_exits_with_invalid_code() throws Exception { + ReleaserProperties properties = new ReleaserProperties(); + properties.getMaven().setBuildCommand("exit 1"); + properties.setWorkingDir(file("/projects/builder/unresolved").getPath()); + Project builder = new Project(properties, new ProcessExecutor(properties) { + @Override Process startProcess(ProcessBuilder builder) throws IOException { + return processWithInvalidExitCode(); + } + }); + + thenThrownBy(builder::build).hasMessageContaining("The process has exited with exit code [1]"); + } + @Test public void should_successfully_execute_a_bump_versions_command() throws Exception { ReleaserProperties properties = new ReleaserProperties(); @@ -140,6 +156,34 @@ public class ProjectTests { then(this.reader.readPom(converters).getParent().getVersion()).isEqualTo("2.3.4.BUILD-SNAPSHOT"); } + private Process processWithInvalidExitCode() { + return new Process() { + @Override public OutputStream getOutputStream() { + return null; + } + + @Override public InputStream getInputStream() { + return null; + } + + @Override public InputStream getErrorStream() { + return null; + } + + @Override public int waitFor() throws InterruptedException { + return 0; + } + + @Override public int exitValue() { + return 1; + } + + @Override public void destroy() { + + } + }; + } + private TestProcessExecutor executor(ReleaserProperties properties) { return new TestProcessExecutor(properties); }