Skip to content

Commit 6f2c6f1

Browse files
authored
Merge pull request #31 from fsantiag/log_command_output
Log command output when debug is enabled
2 parents 79b0dbf + a69f197 commit 6f2c6f1

File tree

4 files changed

+111
-17
lines changed

4 files changed

+111
-17
lines changed

src/main/java/org/sonar/plugins/clojure/sensors/CommandRunner.java

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,49 @@
33
import org.sonar.api.batch.ScannerSide;
44
import org.sonar.api.utils.command.Command;
55
import org.sonar.api.utils.command.CommandExecutor;
6+
import org.sonar.api.utils.log.Logger;
7+
import org.sonar.api.utils.log.Loggers;
8+
9+
import java.util.Arrays;
610

711
@ScannerSide
812
public class CommandRunner {
913

14+
private static final Logger STATIC_LOGGER = Loggers.get(CommandRunner.class);
1015
private static final long TIMEOUT = 300_000;
16+
private static final String DELIMITER = "\n";
1117

12-
public CommandStreamConsumer run(String command, String... arguments) {
13-
CommandStreamConsumer stdOut = new CommandStreamConsumer();
14-
CommandStreamConsumer stdErr = new CommandStreamConsumer();
18+
private final Logger logger;
19+
private final CommandExecutor commandExecutor;
20+
21+
public CommandRunner(Logger log, CommandExecutor commandExecutor) {
22+
this.logger = log;
23+
this.commandExecutor = commandExecutor;
24+
}
25+
26+
public CommandRunner() {
27+
this(STATIC_LOGGER, CommandExecutor.create());
28+
}
29+
30+
CommandStreamConsumer run(String command, CommandStreamConsumer stdout,
31+
CommandStreamConsumer stderr, String... arguments) {
1532
Command cmd = Command.create(command);
16-
for (String arg: arguments) {
17-
if (arg != null) {
18-
cmd.addArgument(arg);
19-
}
33+
Arrays.stream(arguments).forEach(cmd::addArgument);
34+
35+
commandExecutor.execute(cmd, stdout, stderr, TIMEOUT);
36+
37+
if (logger.isDebugEnabled()) {
38+
logger.debug("Stdout: " + String.join(DELIMITER, stdout.getData()));
39+
}
40+
41+
if (!stderr.getData().isEmpty()) {
42+
logger.warn("Stderr: " + String.join(DELIMITER, stderr.getData()));
2043
}
21-
CommandExecutor.create().execute(cmd, stdOut, stdErr, TIMEOUT);
22-
return stdOut;
44+
45+
return stdout;
46+
}
47+
48+
public CommandStreamConsumer run(String command, String... arguments) {
49+
return run(command, new CommandStreamConsumer(), new CommandStreamConsumer(), arguments);
2350
}
2451
}

src/main/java/org/sonar/plugins/clojure/sensors/CommandStreamConsumer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
import org.sonar.api.utils.command.StreamConsumer;
44

5-
import java.util.LinkedList;
5+
import java.util.ArrayList;
66
import java.util.List;
77

88
public class CommandStreamConsumer implements StreamConsumer {
9-
private List<String> data = new LinkedList<>();
9+
private List<String> data = new ArrayList<>();
1010

1111
@Override
1212
public void consumeLine(String line) {

src/main/java/org/sonar/plugins/clojure/sensors/eastwood/EastwoodSensor.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ public void describe(SensorDescriptor descriptor) {
4242
@Override
4343
public void execute(SensorContext context) {
4444
if (!checkIfPluginIsDisabled(context, ClojureProperties.EASTWOOD_DISABLED)) {
45-
LOG.info("Clojure project detected");
4645
LOG.info("Running Eastwood");
4746
String options = context.config().get(ClojureProperties.EASTWOOD_OPTIONS).orElse(null);
4847
CommandStreamConsumer stdOut = this.commandRunner.run(LEIN_COMMAND, EASTWOOD_COMMAND, options);
Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,86 @@
11
package org.sonar.plugins.clojure.sensors;
22

3+
import org.junit.Before;
34
import org.junit.Test;
5+
import org.junit.runner.RunWith;
6+
import org.mockito.ArgumentCaptor;
7+
import org.mockito.Mock;
8+
import org.mockito.junit.MockitoJUnitRunner;
9+
import org.sonar.api.utils.command.Command;
10+
import org.sonar.api.utils.command.CommandExecutor;
11+
import org.sonar.api.utils.log.Logger;
412

513
import static org.hamcrest.CoreMatchers.is;
614
import static org.junit.Assert.assertThat;
15+
import static org.mockito.ArgumentMatchers.any;
16+
import static org.mockito.Mockito.anyLong;
17+
import static org.mockito.Mockito.doReturn;
18+
import static org.mockito.Mockito.times;
19+
import static org.mockito.Mockito.verify;
20+
import static org.mockito.Mockito.when;
721

22+
@RunWith(MockitoJUnitRunner.class)
823
public class CommandRunnerTest {
924

25+
@Mock
26+
private Logger logger;
27+
28+
@Mock
29+
private CommandExecutor commandExecutor;
30+
31+
private CommandRunner commandRunner;
32+
33+
@Before
34+
public void setUp() {
35+
commandRunner = new CommandRunner(logger, commandExecutor);
36+
}
37+
38+
@Test
39+
public void shouldTakeMultipleArgumentsForCommand() {
40+
doReturn(0).when(commandExecutor).execute(
41+
any(),
42+
any(),
43+
any(),
44+
anyLong());
45+
46+
commandRunner.run("echo", "argument1", "argument2");
47+
48+
ArgumentCaptor<Command> commandCaptor = ArgumentCaptor.forClass(Command.class);
49+
verify(commandExecutor, times(1))
50+
.execute(
51+
commandCaptor.capture(),
52+
any(CommandStreamConsumer.class),
53+
any(CommandStreamConsumer.class),
54+
anyLong());
55+
56+
Command cmd = commandCaptor.getValue();
57+
assertThat(cmd.getArguments().size(), is(2));
58+
assertThat(cmd.getArguments().get(0), is("argument1"));
59+
assertThat(cmd.getArguments().get(1), is("argument2"));
60+
}
61+
1062
@Test
11-
public void testMultipleArgumentsCommand() {
12-
//TODO This test fails on windows
13-
CommandStreamConsumer stdOut = new CommandRunner().run("echo", "argument1", "argument2");
14-
assertThat(stdOut.getData().get(0), is("argument1 argument2"));
15-
assertThat(stdOut.getData().size(), is(1));
63+
public void shouldLogCommandOutputWhenDebugIsEnabled() {
64+
when(logger.isDebugEnabled()).thenReturn(true);
65+
CommandStreamConsumer stdout = new CommandStreamConsumer();
66+
String commandOutput = "command output";
67+
stdout.consumeLine(commandOutput);
68+
69+
commandRunner.run("echo", stdout, new CommandStreamConsumer(), "argument1", "argument2");
70+
71+
verify(logger).debug("Stdout: command output");
72+
}
73+
74+
@Test
75+
public void shouldLogWarningForErrorsInStderr() {
76+
when(logger.isDebugEnabled()).thenReturn(true);
77+
CommandStreamConsumer stderr = new CommandStreamConsumer();
78+
String error = "some error message";
79+
stderr.consumeLine(error);
80+
81+
commandRunner.run("echo", new CommandStreamConsumer(), stderr, "argument1", "argument2");
82+
83+
verify(logger).warn("Stderr: some error message");
1684
}
1785

1886
}

0 commit comments

Comments
 (0)