Skip to content

Commit d394b2b

Browse files
authored
Fail fast when setting sonar.internal.analysis.failFast (SonarSource#632)
1 parent 1b1c60a commit d394b2b

3 files changed

Lines changed: 33 additions & 7 deletions

File tree

its/ruling/src/test/java/org/sonar/python/it/PythonRulingTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public void test() throws Exception {
7272
.setProperty("dump.new", FileLocation.of("target/actual").getFile().getAbsolutePath())
7373
.setProperty("sonar.cpd.exclusions", "**/*")
7474
.setProperty("lits.differences", litsDifferencesFile.getAbsolutePath())
75+
.setProperty("sonar.internal.analysis.failFast", "true")
7576
.setEnvironmentVariable("SONAR_RUNNER_OPTS", "-Xmx2000m");
7677
ORCHESTRATOR.executeBuild(build);
7778

sonar-python-plugin/src/main/java/org/sonar/plugins/python/Scanner.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
abstract class Scanner {
3333
private static final Logger LOG = Loggers.get(Scanner.class);
34+
private static final String FAIL_FAST_PROPERTY_NAME = "sonar.internal.analysis.failFast";
3435
protected final SensorContext context;
3536

3637
Scanner(SensorContext context) {
@@ -51,6 +52,9 @@ void execute(List<InputFile> files, SensorContext context) {
5152
this.scanFile(file);
5253
} catch (Exception e) {
5354
this.processException(e, file);
55+
if (context.config().getBoolean(FAIL_FAST_PROPERTY_NAME).orElse(false)) {
56+
throw new IllegalStateException("Exception when analyzing " + file, e);
57+
}
5458
} finally {
5559
progressReport.nextFile();
5660
}

sonar-python-plugin/src/test/java/org/sonar/plugins/python/PythonSensorTest.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.sonar.plugins.python;
2121

2222
import java.io.File;
23+
import java.io.FileNotFoundException;
2324
import java.io.IOException;
2425
import java.nio.charset.StandardCharsets;
2526
import java.nio.file.Files;
@@ -50,6 +51,7 @@
5051
import org.sonar.api.batch.sensor.internal.SensorContextTester;
5152
import org.sonar.api.batch.sensor.issue.Issue;
5253
import org.sonar.api.batch.sensor.issue.IssueLocation;
54+
import org.sonar.api.config.internal.MapSettings;
5355
import org.sonar.api.internal.SonarRuntimeImpl;
5456
import org.sonar.api.issue.NoSonarFilter;
5557
import org.sonar.api.measures.CoreMetrics;
@@ -67,6 +69,7 @@
6769
import org.sonar.python.checks.CheckList;
6870

6971
import static org.assertj.core.api.Assertions.assertThat;
72+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
7073
import static org.mockito.Mockito.mock;
7174
import static org.mockito.Mockito.spy;
7275
import static org.mockito.Mockito.when;
@@ -344,6 +347,20 @@ public void test_exception_does_not_fail_analysis() throws IOException {
344347
assertThat(context.allIssues()).hasSize(2);
345348
}
346349

350+
@Test
351+
public void test_exception_should_fail_analysis_if_configured_so() throws IOException {
352+
DefaultInputFile inputFile = spy(createInputFile(FILE_1));
353+
when(inputFile.contents()).thenThrow(FileNotFoundException.class);
354+
context.fileSystem().add(inputFile);
355+
356+
activeRules = new ActiveRulesBuilder().build();
357+
context.setSettings(new MapSettings().setProperty("sonar.internal.analysis.failFast", "true"));
358+
359+
assertThatThrownBy(() -> sensor().execute(context))
360+
.isInstanceOf(IllegalStateException.class)
361+
.hasCauseInstanceOf(FileNotFoundException.class);
362+
}
363+
347364
@Test
348365
public void parse_error() {
349366
inputFile("parse_error.py");
@@ -392,17 +409,21 @@ private PythonSensor sensor(@Nullable PythonCustomRuleRepository[] customRuleRep
392409
}
393410

394411
private InputFile inputFile(String name) {
395-
DefaultInputFile inputFile = TestInputFileBuilder.create("moduleKey", name)
396-
.setModuleBaseDir(baseDir.toPath())
397-
.setCharset(StandardCharsets.UTF_8)
398-
.setType(Type.MAIN)
399-
.setLanguage(Python.KEY)
400-
.initMetadata(TestUtils.fileContent(new File(baseDir, name), StandardCharsets.UTF_8))
401-
.build();
412+
DefaultInputFile inputFile = createInputFile(name);
402413
context.fileSystem().add(inputFile);
403414
return inputFile;
404415
}
405416

417+
private DefaultInputFile createInputFile(String name) {
418+
return TestInputFileBuilder.create("moduleKey", name)
419+
.setModuleBaseDir(baseDir.toPath())
420+
.setCharset(StandardCharsets.UTF_8)
421+
.setType(Type.MAIN)
422+
.setLanguage(Python.KEY)
423+
.initMetadata(TestUtils.fileContent(new File(baseDir, name), StandardCharsets.UTF_8))
424+
.build();
425+
}
426+
406427
private void verifyUsages(String componentKey, int line, int offset, TextRange... trs) {
407428
Collection<TextRange> textRanges = context.referencesForSymbolAt(componentKey, line, offset);
408429
assertThat(textRanges).containsExactly(trs);

0 commit comments

Comments
 (0)