Skip to content

Commit

Permalink
Improve logging about loading of reports
Browse files Browse the repository at this point in the history
  • Loading branch information
dbmeneses authored and Amaury Levé committed Nov 29, 2017
1 parent 80f6140 commit 8a5adda
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
@ScannerSide
public abstract class AbstractConfiguration {
private static final Logger LOG = Loggers.get(AbstractConfiguration.class);
private static final String MSG_SUFFIX = "'. No protobuf files will be loaded for this project.";
private static final String MSG_SUFFIX = "Analyzer results won't be loaded from this directory.";
private static final String PROP_PREFIX = "sonar.";

private final Configuration configuration;
Expand Down Expand Up @@ -67,6 +67,9 @@ private String getAnalyzerWorkDirProperty() {
return PROP_PREFIX + languageKey + ".analyzer.projectOutPaths";
}

/**
* To support Scanner for MSBuild <= 3.0
*/
private String getOldAnalyzerWorkDirProperty() {
return PROP_PREFIX + languageKey + ".analyzer.projectOutPath";
}
Expand Down Expand Up @@ -98,11 +101,12 @@ private List<Path> protobufReportPaths(boolean silent) {
.collect(Collectors.toList());

if (analyzerWorkDirPaths.isEmpty()) {
// fallback to old property
Optional<String> oldValue = configuration.get(getOldAnalyzerWorkDirProperty());
if (oldValue.isPresent()) {
analyzerWorkDirPaths = Collections.singletonList(Paths.get(oldValue.get()));
} else {
return empty("Property missing: '" + getAnalyzerWorkDirProperty() + "'" + MSG_SUFFIX, silent);
return empty("Property missing: '" + getAnalyzerWorkDirProperty() + "'. No protobuf files will be loaded for this project.", silent);
}
}

Expand All @@ -113,24 +117,25 @@ private List<Path> protobufReportPaths(boolean silent) {
}

private static boolean validateOutputDir(Path analyzerOutputDir, boolean silent) {
String path = analyzerOutputDir.toString();
try {
if (!analyzerOutputDir.toFile().exists()) {
ifNotSilent(silent, () -> LOG.warn("Analyzer working directory does not exist: " + analyzerOutputDir.toAbsolutePath() + MSG_SUFFIX));
ifNotSilent(silent, () -> LOG.warn("Analyzer working directory does not exist: '{}'. {}", path, MSG_SUFFIX));
return false;
}

try (DirectoryStream<Path> files = Files.newDirectoryStream(analyzerOutputDir, protoFileFilter())) {
long count = StreamSupport.stream(files.spliterator(), false).count();
if (count == 0) {
ifNotSilent(silent, () -> LOG.warn("Analyzer working directory contains no .pb file(s)" + MSG_SUFFIX));
ifNotSilent(silent, () -> LOG.warn("Analyzer working directory '{}' contains no .pb file(s). {}", path, MSG_SUFFIX));
return false;
}

ifNotSilent(silent, () -> LOG.debug("Analyzer working directory contains " + count + " .pb file(s)"));
ifNotSilent(silent, () -> LOG.debug("Analyzer working directory '{}' contains {} .pb file(s)", path, count));
return true;
}
} catch (IOException e) {
throw new IllegalStateException("Could not check for .pb files in " + analyzerOutputDir.toAbsolutePath(), e);
throw new IllegalStateException("Could not check for .pb files in '" + path + "'", e);
}
}

Expand All @@ -152,6 +157,7 @@ private static List<Path> empty(String msg, boolean silent) {
public List<Path> roslynReportPaths() {
String[] strPaths = configuration.getStringArray(getRoslynJsonReportPathProperty());
if (strPaths.length > 0) {
LOG.debug("Found Roslyn issues report");
return Arrays.stream(strPaths)
.map(Paths::get)
.collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public void importRoslynReports(List<Path> reportPaths, final SensorContext cont
Map<String, String> repositoryKeyByRoslynRuleKey = getRepoKeyByRoslynRuleKey(activeRoslynRulesByPartialRepoKey);
SarifParserCallback callback = new SarifParserCallbackImpl(context, repositoryKeyByRoslynRuleKey);

LOG.info("Importing Roslyn {} {}", reportPaths.size(), pluralize("report", reportPaths.size()));
LOG.info("Importing {} Roslyn {}", reportPaths.size(), pluralize("report", reportPaths.size()));

for (Path reportPath : reportPaths) {
SarifParserFactory.create(reportPath).accept(callback);
Expand All @@ -62,9 +62,6 @@ private static Map<String, String> getRepoKeyByRoslynRuleKey(Map<String, List<Ru
}

private static String pluralize(String s, int count) {
if (count == 1) {
return s;
}
return s + "s";
return (count == 1) ? s : (s + "s");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,24 +52,22 @@ public void setUp() {
settings = new MapSettings(new PropertyDefinitions(definitions.create()));
}

private void createProtobufOut() throws IOException {
Path path = workDir.resolve("report");
private Path createProtobufOut(String name) throws IOException {
Path path = workDir.resolve(name);
Path outputCs = path.resolve("output-cs");
Files.createDirectories(outputCs);
Files.createFile(outputCs.resolve("dummy.pb"));
return path;
}

Path path2 = workDir.resolve("report2");
Path outputCs2 = path2.resolve("output-cs");
Files.createDirectories(outputCs2);
Files.createFile(outputCs2.resolve("dummy.pb"));
settings.setProperty("sonar.cs.analyzer.projectOutPaths", new String[] {path.toString(), path2.toString()});
private void setProtobufOut() throws IOException {
Path path1 = createProtobufOut("report1");
Path path2 = createProtobufOut("report2");
settings.setProperty("sonar.cs.analyzer.projectOutPaths", new String[] {path1.toString(), path2.toString()});
}

private void createOldProtobufOut() throws IOException {
Path path = workDir.resolve("report");
Path outputCs = path.resolve("output-cs");
Files.createDirectories(outputCs);
Files.createFile(outputCs.resolve("dummy.pb"));
private void setOldProtobufOut() throws IOException {
Path path = createProtobufOut("report");
settings.setProperty("sonar.cs.analyzer.projectOutPath", path.toString());
}

Expand Down Expand Up @@ -107,11 +105,22 @@ public void giveWarningsWhenGettingProtobufPathAndNoPropertyAvailable() {
config = new AbstractConfiguration(settings.asConfig(), "cs") {
};
assertThat(config.protobufReportPaths()).isEmpty();
assertThat(logTester.logs(LoggerLevel.WARN)).containsOnly("Property missing: 'sonar.cs.analyzer.projectOutPaths''. No protobuf files will be loaded for this project.");
assertThat(logTester.logs(LoggerLevel.WARN)).containsOnly("Property missing: 'sonar.cs.analyzer.projectOutPaths'. No protobuf files will be loaded for this project.");
}

@Test
public void giveWarningsWhenGettingProtobufPathAndNoFolderAvailable() throws IOException {
Path path1 = createProtobufOut("report");
settings.setProperty("sonar.cs.analyzer.projectOutPaths", new String[] {path1.toString(), "non-existing"});
config = new AbstractConfiguration(settings.asConfig(), "cs") {
};
assertThat(config.protobufReportPaths()).containsOnly(path1.resolve("output-cs"));
assertThat(logTester.logs(LoggerLevel.WARN)).hasSize(1);
assertThat(logTester.logs(LoggerLevel.WARN).get(0)).matches(s -> s.startsWith("Analyzer working directory does not exist"));
}

@Test
public void giveWarningsWhenGettingProtobufPathAndNoFolderAvailable() {
public void giveWarningsWhenGettingOldProtobufPathAndNoFolderAvailable() {
settings.setProperty("sonar.cs.analyzer.projectOutPath", "non-existing");
config = new AbstractConfiguration(settings.asConfig(), "cs") {
};
Expand All @@ -122,11 +131,12 @@ public void giveWarningsWhenGettingProtobufPathAndNoFolderAvailable() {

@Test
public void informHowManyProtoFilesAreFound() throws IOException {
createOldProtobufOut();
setProtobufOut();
config = new AbstractConfiguration(settings.asConfig(), "cs") {
};
assertThat(config.protobufReportPaths()).isNotEmpty();
assertThat(logTester.logs(LoggerLevel.DEBUG)).containsOnly("Analyzer working directory contains 1 .pb file(s)");
assertThat(logTester.logs(LoggerLevel.DEBUG)).hasSize(2);
assertThat(logTester.logs(LoggerLevel.WARN)).allMatch(s -> s.endsWith("contains no .pb file(s). No protobuf files will be loaded from this directory."));
}

@Test
Expand All @@ -140,22 +150,22 @@ public void giveWarningsWhenGettingProtobufPathAndFolderIsEmpty() throws IOExcep
assertThat(config.protobufReportPaths()).isEmpty();
assertThat(logTester.logs(LoggerLevel.WARN)).hasSize(1);
assertThat(logTester.logs(LoggerLevel.WARN).get(0))
.matches(s -> s.startsWith("Analyzer working directory contains no .pb file(s)'. No protobuf files will be loaded for this project."));
.matches(s -> s.endsWith("contains no .pb file(s). Analyzer results won't be loaded from this directory."));
}

@Test
public void onlyProtobufReportsPresent() throws IOException {
createProtobufOut();
setProtobufOut();
config = new AbstractConfiguration(settings.asConfig(), "cs") {
};
assertThat(config.protobufReportPathsSilent()).isNotEmpty();
assertThat(config.roslynReportPaths()).isEmpty();
assertThat(config.protobufReportPathsSilent()).containsOnly(workDir.resolve("report").resolve("output-cs"), workDir.resolve("report2").resolve("output-cs"));
assertThat(config.protobufReportPathsSilent()).containsOnly(workDir.resolve("report1").resolve("output-cs"), workDir.resolve("report2").resolve("output-cs"));
}

@Test
public void onlyOldProtobufReportsPresent() throws IOException {
createOldProtobufOut();
setOldProtobufOut();
config = new AbstractConfiguration(settings.asConfig(), "cs") {
};
assertThat(config.protobufReportPathsSilent()).isNotEmpty();
Expand Down

0 comments on commit 8a5adda

Please sign in to comment.