]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7612 Improve documentation and SensorContextTester
authorJulien HENRY <julien.henry@sonarsource.com>
Tue, 10 May 2016 16:45:48 +0000 (18:45 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Thu, 12 May 2016 06:49:09 +0000 (08:49 +0200)
16 files changed:
plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/lang/CpdTokenizerSensorTest.java
plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/lang/SyntaxHighlightingSensorTest.java
plugins/sonar-xoo-plugin/src/test/java/org/sonar/xoo/rule/OneIssuePerLineSensorTest.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/fs/internal/DefaultInputFile.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/Sensor.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/coverage/NewCoverage.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/cpd/NewCpdTokens.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/cpd/internal/DefaultCpdTokens.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/highlighting/NewHighlighting.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/internal/SensorContextTester.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/symbol/NewSymbolTable.java
sonar-scanner-engine/src/main/java/org/sonar/batch/sensor/noop/NoOpNewCpdTokens.java
sonar-scanner-engine/src/test/java/org/sonar/batch/issue/ModuleIssuesTest.java
sonar-scanner-engine/src/test/java/org/sonar/batch/source/DefaultHighlightableTest.java
sonar-scanner-engine/src/test/java/org/sonar/batch/source/DefaultSymbolizableTest.java
sonar-scanner-engine/src/test/java/org/sonar/batch/source/DeprecatedDefaultSymbolTableTest.java

index c58f85a9be70d486a307a7c1513592128c6356d5..ff32959310627abc815e540f5298059cd3377ed7 100644 (file)
@@ -21,7 +21,6 @@ package org.sonar.xoo.lang;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.StringReader;
 import org.apache.commons.io.FileUtils;
 import org.junit.Before;
 import org.junit.Rule;
@@ -29,7 +28,6 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.rules.TemporaryFolder;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
-import org.sonar.api.batch.fs.internal.FileMetadata;
 import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor;
 import org.sonar.api.batch.sensor.internal.SensorContextTester;
 
@@ -80,7 +78,7 @@ public class CpdTokenizerSensorTest {
     FileUtils.write(sourceFile, content);
     DefaultInputFile inputFile = new DefaultInputFile("foo", "src/foo.xoo")
       .setLanguage("xoo")
-      .initMetadata(new FileMetadata().readMetadata(new StringReader(content)));
+      .initMetadata(content);
     context.fileSystem().add(inputFile);
   }
 
index ade4d17c637bfac313e2cad9f92804f285cc60ee..0a2b80da4143a82ecc5b459ceeaabbdfaab5f489 100644 (file)
  */
 package org.sonar.xoo.lang;
 
+import java.io.File;
+import java.io.IOException;
 import org.apache.commons.io.FileUtils;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
-import org.sonar.api.batch.fs.internal.FileMetadata;
 import org.sonar.api.batch.sensor.highlighting.TypeOfText;
 import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor;
 import org.sonar.api.batch.sensor.internal.SensorContextTester;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class SyntaxHighlightingSensorTest {
@@ -69,7 +66,7 @@ public class SyntaxHighlightingSensorTest {
     File symbol = new File(baseDir, "src/foo.xoo.highlighting");
     FileUtils.write(symbol, "1:4:k\n12:15:cppd\n\n#comment");
     DefaultInputFile inputFile = new DefaultInputFile("foo", "src/foo.xoo").setLanguage("xoo")
-      .initMetadata(new FileMetadata().readMetadata(new StringReader(" xoo\nazertyazer\nfoo")));
+      .initMetadata(" xoo\nazertyazer\nfoo");
     context.fileSystem().add(inputFile);
 
     sensor.execute(context);
index 8993bac751ee427e8c40906830bcb42d84b709df..f182004de3ea7d82074bef94748320ca39274523 100644 (file)
 package org.sonar.xoo.rule;
 
 import java.io.IOException;
-import java.io.StringReader;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
-import org.sonar.api.batch.fs.internal.FileMetadata;
 import org.sonar.api.batch.rule.Severity;
 import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor;
 import org.sonar.api.batch.sensor.internal.SensorContextTester;
@@ -52,7 +50,7 @@ public class OneIssuePerLineSensorTest {
   @Test
   public void testRule() throws IOException {
     DefaultInputFile inputFile = new DefaultInputFile("foo", "src/Foo.xoo").setLanguage(Xoo.KEY)
-      .initMetadata(new FileMetadata().readMetadata(new StringReader("a\nb\nc\nd\ne\nf\ng\nh\ni\n")));
+      .initMetadata("a\nb\nc\nd\ne\nf\ng\nh\ni\n");
 
     SensorContextTester context = SensorContextTester.create(temp.newFolder());
     context.fileSystem().add(inputFile);
@@ -67,7 +65,7 @@ public class OneIssuePerLineSensorTest {
   @Test
   public void testForceSeverity() throws IOException {
     DefaultInputFile inputFile = new DefaultInputFile("foo", "src/Foo.xoo").setLanguage(Xoo.KEY)
-      .initMetadata(new FileMetadata().readMetadata(new StringReader("a\nb\nc\nd\ne\nf\ng\nh\ni\n")));
+      .initMetadata("a\nb\nc\nd\ne\nf\ng\nh\ni\n");
 
     SensorContextTester context = SensorContextTester.create(temp.newFolder());
     context.fileSystem().add(inputFile);
@@ -84,7 +82,7 @@ public class OneIssuePerLineSensorTest {
   @Test
   public void testProvideGap() throws IOException {
     DefaultInputFile inputFile = new DefaultInputFile("foo", "src/Foo.xoo").setLanguage(Xoo.KEY)
-      .initMetadata(new FileMetadata().readMetadata(new StringReader("a\nb\nc\nd\ne\nf\ng\nh\ni\n")));
+      .initMetadata("a\nb\nc\nd\ne\nf\ng\nh\ni\n");
 
     SensorContextTester context = SensorContextTester.create(temp.newFolder());
     context.fileSystem().add(inputFile);
@@ -101,7 +99,7 @@ public class OneIssuePerLineSensorTest {
   @Test
   public void testProvideGap_before_5_5() throws IOException {
     DefaultInputFile inputFile = new DefaultInputFile("foo", "src/Foo.xoo").setLanguage(Xoo.KEY)
-      .initMetadata(new FileMetadata().readMetadata(new StringReader("a\nb\nc\nd\ne\nf\ng\nh\ni\n")));
+      .initMetadata("a\nb\nc\nd\ne\nf\ng\nh\ni\n");
 
     SensorContextTester context = SensorContextTester.create(temp.newFolder());
     context.fileSystem().add(inputFile);
index c45cdd9756499d6548e62f2fc1c906017278eeb6..98fb14864c259eb4c5bcb0263791dd0d0354242a 100644 (file)
@@ -25,6 +25,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
+import java.io.StringReader;
 import java.nio.charset.Charset;
 import java.nio.file.Path;
 import java.util.Arrays;
@@ -287,6 +288,13 @@ public class DefaultInputFile extends DefaultInputComponent implements InputFile
     return this;
   }
 
+  /**
+   * For testing purpose
+   */
+  public DefaultInputFile initMetadata(String content) {
+    return initMetadata(new FileMetadata().readMetadata(new StringReader(content)));
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {
index e4cc8e617447a3a91268678b1bfa50cd663838bf..0633d0c35cd33df3978ecf252d2b4da1401b22f1 100644 (file)
@@ -21,6 +21,7 @@ package org.sonar.api.batch.sensor;
 
 import org.sonar.api.ExtensionPoint;
 import org.sonar.api.batch.BatchSide;
+import org.sonar.api.batch.sensor.internal.SensorContextTester;
 
 /**
  * <p>
@@ -28,6 +29,8 @@ import org.sonar.api.batch.BatchSide;
  * used to add measure and issues at file level.
  * <p>
  * For example the Cobertura Sensor parses Cobertura report and saves the first-level of measures on files.
+ * 
+ * For testing purpose you can use {@link SensorContextTester}
  * @since 5.1
  */
 @BatchSide
index c9e9024072ab158f530150f0574857ecacb3ef0e..63877cbe34dd32725e3ec4f3f48c6f9675c8df2a 100644 (file)
@@ -23,6 +23,22 @@ import org.sonar.api.batch.fs.InputFile;
 
 /**
  * This builder is used to define code coverage by tests of a given type (UT/IT/Overall) on files.
+ * 
+ * Example:
+ * 
+ * <pre>
+ *   sensorContext.newCoverage().onFile(file)
+       .ofType(UNIT)
+       .lineHits(1, 2)
+       .lineHits(2, 5)
+       .lineHits(3, 0)
+       . ...
+       .conditions(3, 4, 2)
+       .conditions(12, 2, 2)
+       . ...
+       .save();
+ *     
+ * </pre>
  * @since 5.2
  */
 public interface NewCoverage {
index 1a2785ac8fb0a121818a7b2ca63bd7e2f3185e23..e28caa4a6474444614fedae90b61223c9b26b95b 100644 (file)
@@ -24,6 +24,17 @@ import org.sonar.api.batch.fs.TextRange;
 
 /**
  * This builder is used to define tokens used by CPD algorithm on files.
+ * 
+ * Example:
+ * 
+ * <pre>
+ *   sensorContext.newCpdTokens().onFile(inputFile)
+ *     .addToken(1, 10, 1, 15, "class")
+ *     .addToken(1, 16, 1, 18, "IDENTIFIER")
+ *     // Add more tokens
+ *     .save;
+ *     
+ * </pre>
  * @since 5.5
  */
 public interface NewCpdTokens {
@@ -40,6 +51,12 @@ public interface NewCpdTokens {
    */
   NewCpdTokens addToken(TextRange range, String image);
 
+  /**
+   * Shortcut to avoid calling {@link InputFile#newRange(int, int, int, int)}
+   * @since 5.6
+   */
+  NewCpdTokens addToken(int startLine, int startLineOffset, int endLine, int endLineOffset, String image);
+
   /**
    * Call this method only once when your are done with defining tokens of the file.
    */
index 954f2869671b220072351338a7dc32bd9fa1b12b..20db6a92e5e319e79f47ab82ad549b243ed2dd3f 100644 (file)
@@ -80,11 +80,23 @@ public class DefaultCpdTokens extends DefaultStorable implements NewCpdTokens {
     return inputFile;
   }
 
+  @Override
+  public NewCpdTokens addToken(int startLine, int startLineOffset, int endLine, int endLineOffset, String image) {
+    checkInputFileNotNull();
+    TextRange newRange;
+    try {
+      newRange = inputFile.newRange(startLine, startLineOffset, endLine, endLineOffset);
+    } catch (Exception e) {
+      throw new IllegalArgumentException("Unable to register token in file " + inputFile, e);
+    }
+    return addToken(newRange, image);
+  }
+
   @Override
   public DefaultCpdTokens addToken(TextRange range, String image) {
     Preconditions.checkNotNull(range, "Range should not be null");
     Preconditions.checkNotNull(image, "Image should not be null");
-    Preconditions.checkState(inputFile != null, "Call onFile() first");
+    checkInputFileNotNull();
     if (excluded) {
       return this;
     }
@@ -126,4 +138,8 @@ public class DefaultCpdTokens extends DefaultStorable implements NewCpdTokens {
     addNewTokensLine(result, startIndex, currentIndex, startLine, sb);
     storage.store(this);
   }
+
+  private void checkInputFileNotNull() {
+    Preconditions.checkState(inputFile != null, "Call onFile() first");
+  }
 }
index 577aefd911e130bb8398a5acb8093797f425ccd7..c6fe46f806e1629af142fc29d679036c3ddaabf0 100644 (file)
@@ -24,6 +24,18 @@ import org.sonar.api.batch.fs.TextRange;
 
 /**
  * This builder is used to define syntax highlighting (aka code coloration) on files.
+ * 
+ * Example:
+ * 
+ * <pre>
+ *   sensorContext.newHighlighting().onFile(inputFile)
+ *     .highlight(1, 10, 1, 15, KEYWORD)
+ *     .highlight(1, 16, 1, 18, STRING)
+ *     // Add more highlight if needed
+ *     .save;
+ *     
+ * </pre>
+ * 
  * @since 5.1
  */
 public interface NewHighlighting {
index 0e4d51f9795e9a9b6f220232764d3c40995d5b02..c8ec440deb2e622e205ae24384b950acba9efb3b 100644 (file)
@@ -67,8 +67,16 @@ import org.sonar.duplications.internal.pmd.TokensLine;
 /**
  * Utility class to help testing {@link Sensor}.
  * 
- * Usage: call {@link #create(File)} to create an "in memory" implementation of {@link SensorContext} then
- * pass it to your {@link Sensor}. You can then query elements provided by your sensor using methods {@link #allIssues()}, ...
+ * Usage: call {@link #create(File)} to create an "in memory" implementation of {@link SensorContext} with a filesystem initialized with provided baseDir.
+ * <p>
+ * You have to manually register inputFiles using:
+ * <pre>
+ *   sensorContextTester.fileSystem().add(new DefaultInputFile("myProjectKey", "src/Foo.java")
+      .setLanguage("java")
+      .initMetadata("public class Foo {\n}"));
+ * </pre>
+ * <p>
+ * Then pass it to your {@link Sensor}. You can then query elements provided by your sensor using methods {@link #allIssues()}, ...
  * 
  * @since 5.1
  */
index 874261a6c6f754669e6120c10012bc4f2453e8b3..af2cab645e1b5158e125173d5c241d2bc72ec271 100644 (file)
@@ -24,6 +24,21 @@ import org.sonar.api.batch.fs.TextRange;
 
 /**
  * This builder is used to define symbol references on files.
+ * 
+ * Example:
+ * 
+ * <pre>
+ *   NewSymbolTable symbolTable = sensorContext.newSymbolTable().onFile(inputFile);
+ *   symbolTable.newSymbol(1, 10, 1, 15)
+ *     .newReference(10, 12, 10, 17)
+ *     .newReference(11, 11, 11, 16);
+ *     
+ *   // Add more symbols if needed
+ *     
+ *   symbolTable.save();
+ *     
+ * </pre>
+ * 
  * @since 5.6
  */
 public interface NewSymbolTable {
index afd00476b2a0ecf80483e6b9b1c181cccafefa4a..7ad3056b4ecb663119d6dc0b7ce31f3b798dcab0 100644 (file)
@@ -40,4 +40,10 @@ public class NoOpNewCpdTokens implements NewCpdTokens {
     // Do nothing
     return this;
   }
+
+  @Override
+  public NewCpdTokens addToken(int startLine, int startLineOffset, int endLine, int endLineOffset, String image) {
+    // Do nothing
+    return this;
+  }
 }
index af84563a8b81d995d2234ade39064f7619d97304..47726bc8a2e514af5cc071d21dc1747105fa65e0 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.batch.issue;
 
-import java.io.StringReader;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -28,7 +27,6 @@ import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
-import org.sonar.api.batch.fs.internal.FileMetadata;
 import org.sonar.api.batch.rule.internal.ActiveRulesBuilder;
 import org.sonar.api.batch.rule.internal.RulesBuilder;
 import org.sonar.api.batch.sensor.issue.internal.DefaultIssue;
@@ -67,7 +65,7 @@ public class ModuleIssuesTest {
   ModuleIssues moduleIssues;
 
   BatchComponentCache componentCache = new BatchComponentCache();
-  InputFile file = new DefaultInputFile("foo", "src/Foo.php").initMetadata(new FileMetadata().readMetadata(new StringReader("Foo\nBar\nBiz\n")));
+  InputFile file = new DefaultInputFile("foo", "src/Foo.php").initMetadata("Foo\nBar\nBiz\n");
   ReportPublisher reportPublisher = mock(ReportPublisher.class, RETURNS_DEEP_STUBS);
 
   @Before
index 3a791783b1d43c7f7d0f3e50775ac31734811808..d1f20eb1d168ee6ec008dcdaed974c8313b3afb3 100644 (file)
  */
 package org.sonar.batch.source;
 
-import java.io.StringReader;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.mockito.ArgumentCaptor;
 import org.sonar.api.batch.AnalysisMode;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
-import org.sonar.api.batch.fs.internal.FileMetadata;
 import org.sonar.api.batch.sensor.highlighting.internal.DefaultHighlighting;
 import org.sonar.api.batch.sensor.internal.SensorStorage;
 
@@ -43,7 +41,7 @@ public class DefaultHighlightableTest {
   public void should_store_highlighting_rules() {
     SensorStorage sensorStorage = mock(SensorStorage.class);
     DefaultInputFile inputFile = new DefaultInputFile("foo", "src/Foo.php")
-      .initMetadata(new FileMetadata().readMetadata(new StringReader("azerty\nbla bla")));
+      .initMetadata("azerty\nbla bla");
     DefaultHighlightable highlightablePerspective = new DefaultHighlightable(inputFile, sensorStorage, mock(AnalysisMode.class));
     highlightablePerspective.newHighlighting().highlight(0, 6, "k").highlight(7, 10, "cppd").done();
 
index a6dde755b359d0886dd5a2c8debbd4278edd2c0c..3f16b9331a619204bcd2983b75a79c500d35fb46 100644 (file)
 package org.sonar.batch.source;
 
 import com.google.common.base.Strings;
-import java.io.StringReader;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.sonar.api.batch.AnalysisMode;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
-import org.sonar.api.batch.fs.internal.FileMetadata;
 import org.sonar.api.batch.sensor.symbol.internal.DefaultSymbolTable;
 import org.sonar.api.source.Symbol;
 import org.sonar.api.source.Symbolizable;
@@ -42,7 +40,7 @@ public class DefaultSymbolizableTest {
 
     DefaultSensorStorage sensorStorage = mock(DefaultSensorStorage.class);
     DefaultInputFile inputFile = new DefaultInputFile("foo", "src/Foo.php")
-      .initMetadata(new FileMetadata().readMetadata(new StringReader(Strings.repeat("azerty\n", 20))));
+      .initMetadata(Strings.repeat("azerty\n", 20));
 
     DefaultSymbolizable symbolPerspective = new DefaultSymbolizable(inputFile, sensorStorage, mock(AnalysisMode.class));
     Symbolizable.SymbolTableBuilder symbolTableBuilder = symbolPerspective.newSymbolTableBuilder();
index e8b6d6df380b46f7a30be4b13b7832c3e84b9823..7c24a2384b06fad0af1b251649181e73a3a46236 100644 (file)
@@ -20,7 +20,6 @@
 package org.sonar.batch.source;
 
 import com.google.common.base.Strings;
-import java.io.StringReader;
 import java.util.Set;
 import org.junit.Before;
 import org.junit.Rule;
@@ -28,7 +27,6 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.sonar.api.batch.fs.TextRange;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
-import org.sonar.api.batch.fs.internal.FileMetadata;
 import org.sonar.api.batch.sensor.symbol.internal.DefaultSymbolTable;
 import org.sonar.api.source.Symbol;
 import org.sonar.api.source.Symbolizable;
@@ -44,7 +42,7 @@ public class DeprecatedDefaultSymbolTableTest {
   @Before
   public void prepare() {
     inputFile = new DefaultInputFile("foo", "src/Foo.php")
-      .initMetadata(new FileMetadata().readMetadata(new StringReader(Strings.repeat("azerty\n", 20))));
+      .initMetadata(Strings.repeat("azerty\n", 20));
   }
 
   @Test