Provide smarter output on the client, fixes #77

All events are directly forwarded to the client.  The client is now responsible for ordering them per project and displaying them if needed.  A thread is now started to read the terminal input with support for '+' to display one more line per project, '-' to display one line less, and 'Ctrl+L' to redraw the display which could become messed if the build messages are a bit unusual (this may require a better fix though).
This commit is contained in:
Guillaume Nodet
2020-10-07 13:44:48 +02:00
parent 41869a7115
commit dd32f41580
13 changed files with 305 additions and 156 deletions

View File

@@ -17,6 +17,7 @@ package org.jboss.fuse.mvnd.assertj;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -43,7 +44,7 @@ public class MatchInOrderAmongOthers<T extends List<? extends String>> extends C
.filter(pat -> pat.matcher(m).find())
.findFirst()
.orElse(null))
.filter(pat -> pat != null) /* remove null patterns */
.filter(Objects::nonNull) /* remove null patterns */
.collect(Collectors.toList())
/* if the mapped patterns equal the input patterns then each pattern matched exactly once */
.equals(patterns),

View File

@@ -32,6 +32,8 @@ import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import static org.mockito.ArgumentMatchers.any;
@MvndTest(projectDir = "src/test/projects/multi-module")
public class MultiModuleTest {
@@ -71,7 +73,7 @@ public class MultiModuleTest {
client.execute(output, "clean", "install", "-e").assertSuccess();
final ArgumentCaptor<String> logMessage = ArgumentCaptor.forClass(String.class);
Mockito.verify(output, Mockito.atLeast(1)).accept(logMessage.capture());
Mockito.verify(output, Mockito.atLeast(1)).accept(any(), logMessage.capture());
Assertions.assertThat(logMessage.getAllValues())
.satisfiesAnyOf( /* Two orderings are possible */
messages -> Assertions.assertThat(messages)

View File

@@ -30,6 +30,8 @@ import org.junit.jupiter.api.Test;
import org.mockito.InOrder;
import org.mockito.Mockito;
import static org.mockito.ArgumentMatchers.any;
@MvndNativeTest(projectDir = "src/test/projects/single-module")
public class SingleModuleNativeIT {
@@ -57,14 +59,14 @@ public class SingleModuleNativeIT {
final Properties props = MvndTestUtil.properties(layout.multiModuleProjectDirectory().resolve("pom.xml"));
final InOrder inOrder = Mockito.inOrder(o);
inOrder.verify(o).accept(Mockito.contains("Building single-module"));
inOrder.verify(o).accept(Mockito.contains(MvndTestUtil.plugin(props, "maven-clean-plugin") + ":clean"));
inOrder.verify(o).accept(Mockito.contains(MvndTestUtil.plugin(props, "maven-compiler-plugin") + ":compile"));
inOrder.verify(o).accept(Mockito.contains(MvndTestUtil.plugin(props, "maven-compiler-plugin") + ":testCompile"));
inOrder.verify(o).accept(Mockito.contains(MvndTestUtil.plugin(props, "maven-surefire-plugin") + ":test"));
inOrder.verify(o).accept(Mockito.contains(MvndTestUtil.plugin(props, "maven-install-plugin") + ":install"));
inOrder.verify(o)
.accept(Mockito.contains("SUCCESS build of project org.jboss.fuse.mvnd.test.single-module:single-module"));
inOrder.verify(o).accept(any(), Mockito.contains("Building single-module"));
inOrder.verify(o).accept(any(), Mockito.contains(MvndTestUtil.plugin(props, "maven-clean-plugin") + ":clean"));
inOrder.verify(o).accept(any(), Mockito.contains(MvndTestUtil.plugin(props, "maven-compiler-plugin") + ":compile"));
inOrder.verify(o).accept(any(), Mockito.contains(MvndTestUtil.plugin(props, "maven-compiler-plugin") + ":testCompile"));
inOrder.verify(o).accept(any(), Mockito.contains(MvndTestUtil.plugin(props, "maven-surefire-plugin") + ":test"));
inOrder.verify(o).accept(any(), Mockito.contains(MvndTestUtil.plugin(props, "maven-install-plugin") + ":install"));
inOrder.verify(o).accept(any(),
Mockito.contains("SUCCESS build of project org.jboss.fuse.mvnd.test.single-module:single-module"));
assertJVM(o, props);

View File

@@ -29,6 +29,8 @@ import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import static org.mockito.ArgumentMatchers.any;
@MvndTest(projectDir = "src/test/projects/single-module")
public class StopStatusTest {
@@ -54,7 +56,7 @@ public class StopStatusTest {
final ClientOutput output = Mockito.mock(ClientOutput.class);
client.execute(output, "--status").assertSuccess();
final ArgumentCaptor<String> logMessage = ArgumentCaptor.forClass(String.class);
Mockito.verify(output, Mockito.atLeast(1)).accept(logMessage.capture());
Mockito.verify(output, Mockito.atLeast(1)).accept(any(), logMessage.capture());
Assertions.assertThat(logMessage.getAllValues())
.is(new MatchInOrderAmongOthers<>(
d.getUid() + " +" + d.getPid() + " +" + d.getAddress()));
@@ -76,7 +78,7 @@ public class StopStatusTest {
final ClientOutput output = Mockito.mock(ClientOutput.class);
client.execute(output, "--status").assertSuccess();
final ArgumentCaptor<String> logMessage = ArgumentCaptor.forClass(String.class);
Mockito.verify(output, Mockito.atLeast(1)).accept(logMessage.capture());
Mockito.verify(output, Mockito.atLeast(1)).accept(any(), logMessage.capture());
Assertions.assertThat(
logMessage.getAllValues().stream()
.filter(m -> m.contains(d.getUid()))

View File

@@ -28,6 +28,8 @@ import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import static org.mockito.ArgumentMatchers.any;
@MvndNativeTest(projectDir = MvndTestExtension.TEMP_EXTERNAL)
public class VersionNativeIT {
@@ -44,7 +46,7 @@ public class VersionNativeIT {
client.execute(output, "-v").assertSuccess();
final ArgumentCaptor<String> logMessage = ArgumentCaptor.forClass(String.class);
Mockito.verify(output, Mockito.atLeast(1)).accept(logMessage.capture());
Mockito.verify(output, Mockito.atLeast(1)).accept(any(), logMessage.capture());
Assertions.assertThat(logMessage.getAllValues())
.is(new MatchInOrderAmongOthers<>(

View File

@@ -26,7 +26,6 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import org.jboss.fuse.mvnd.client.Client;
import org.jboss.fuse.mvnd.client.ClientLayout;
import org.jboss.fuse.mvnd.client.ClientOutput;
@@ -57,7 +56,7 @@ public class NativeTestClient implements Client {
public ExecutionResult execute(ClientOutput output, List<String> args) throws InterruptedException {
final List<String> cmd = new ArrayList<String>(args.size() + 1);
cmd.add(mvndNativeExecutablePath.toString());
args.stream().forEach(cmd::add);
cmd.addAll(args);
if (!Environment.MVND_PROPERTIES_PATH.hasCommandLineProperty(args)) {
cmd.add(Environment.MVND_PROPERTIES_PATH.asCommandLineProperty(layout.getMvndPropertiesPath().toString()));
}
@@ -81,9 +80,9 @@ public class NativeTestClient implements Client {
if (!Environment.JAVA_HOME.hasCommandLineProperty(args)) {
env.put("JAVA_HOME", System.getProperty("java.home"));
}
final String cmdString = cmd.stream().collect(Collectors.joining(" "));
output.accept("Executing " + cmdString);
try (CommandProcess process = new CommandProcess(builder.start(), cmd, output)) {
final String cmdString = String.join(" ", cmd);
output.accept(null, "Executing " + cmdString);
try (CommandProcess process = new CommandProcess(builder.start(), cmd, s -> output.accept(null, s))) {
return process.waitFor(timeoutMs);
} catch (IOException e) {
throw new RuntimeException("Could not execute: " + cmdString, e);
@@ -127,7 +126,7 @@ public class NativeTestClient implements Client {
}
sb.append("\n--- stderr+stdout start ---");
synchronized (log) {
log.stream().forEach(s -> sb.append('\n').append(s));
log.forEach(s -> sb.append('\n').append(s));
}
sb.append("\n--- stderr+stdout end ---");
throw new AssertionError(sb);