You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ScannerReportWriterTest.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2019 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.scanner.protocol.output;
  21. import com.google.common.collect.Iterators;
  22. import java.io.File;
  23. import org.apache.commons.io.FileUtils;
  24. import org.junit.Before;
  25. import org.junit.Rule;
  26. import org.junit.Test;
  27. import org.junit.rules.TemporaryFolder;
  28. import org.sonar.core.util.CloseableIterator;
  29. import org.sonar.core.util.Protobuf;
  30. import org.sonar.scanner.protocol.Constants;
  31. import org.sonar.scanner.protocol.output.ScannerReport.Component.ComponentType;
  32. import org.sonar.scanner.protocol.output.ScannerReport.Measure.DoubleValue;
  33. import org.sonar.scanner.protocol.output.ScannerReport.SyntaxHighlightingRule.HighlightingType;
  34. import static java.util.Arrays.asList;
  35. import static org.assertj.core.api.Assertions.assertThat;
  36. public class ScannerReportWriterTest {
  37. @Rule
  38. public TemporaryFolder temp = new TemporaryFolder();
  39. File dir;
  40. ScannerReportWriter underTest;
  41. @Before
  42. public void setUp() throws Exception {
  43. dir = temp.newFolder();
  44. underTest = new ScannerReportWriter(dir);
  45. }
  46. @Test
  47. public void create_dir_if_does_not_exist() {
  48. FileUtils.deleteQuietly(dir);
  49. underTest = new ScannerReportWriter(dir);
  50. assertThat(dir).isDirectory().exists();
  51. }
  52. @Test
  53. public void write_metadata() {
  54. ScannerReport.Metadata.Builder metadata = ScannerReport.Metadata.newBuilder()
  55. .setAnalysisDate(15000000L)
  56. .setProjectKey("PROJECT_A")
  57. .setRootComponentRef(1);
  58. underTest.writeMetadata(metadata.build());
  59. ScannerReport.Metadata read = Protobuf.read(underTest.getFileStructure().metadataFile(), ScannerReport.Metadata.parser());
  60. assertThat(read.getAnalysisDate()).isEqualTo(15000000L);
  61. assertThat(read.getProjectKey()).isEqualTo("PROJECT_A");
  62. assertThat(read.getRootComponentRef()).isEqualTo(1);
  63. }
  64. @Test
  65. public void write_component() {
  66. // no data yet
  67. assertThat(underTest.hasComponentData(FileStructure.Domain.COMPONENT, 1)).isFalse();
  68. // write data
  69. ScannerReport.Component.Builder component = ScannerReport.Component.newBuilder()
  70. .setRef(1)
  71. .setLanguage("java")
  72. .setProjectRelativePath("src/Foo.java")
  73. .setType(ComponentType.FILE)
  74. .setIsTest(false)
  75. .addChildRef(5)
  76. .addChildRef(42);
  77. underTest.writeComponent(component.build());
  78. assertThat(underTest.hasComponentData(FileStructure.Domain.COMPONENT, 1)).isTrue();
  79. File file = underTest.getFileStructure().fileFor(FileStructure.Domain.COMPONENT, 1);
  80. assertThat(file).exists().isFile();
  81. ScannerReport.Component read = Protobuf.read(file, ScannerReport.Component.parser());
  82. assertThat(read.getRef()).isEqualTo(1);
  83. assertThat(read.getChildRefList()).containsOnly(5, 42);
  84. assertThat(read.getName()).isEmpty();
  85. assertThat(read.getIsTest()).isFalse();
  86. }
  87. @Test
  88. public void write_issues() {
  89. // no data yet
  90. assertThat(underTest.hasComponentData(FileStructure.Domain.ISSUES, 1)).isFalse();
  91. // write data
  92. ScannerReport.Issue issue = ScannerReport.Issue.newBuilder()
  93. .setMsg("the message")
  94. .build();
  95. underTest.writeComponentIssues(1, asList(issue));
  96. assertThat(underTest.hasComponentData(FileStructure.Domain.ISSUES, 1)).isTrue();
  97. File file = underTest.getFileStructure().fileFor(FileStructure.Domain.ISSUES, 1);
  98. assertThat(file).exists().isFile();
  99. try (CloseableIterator<ScannerReport.Issue> read = Protobuf.readStream(file, ScannerReport.Issue.parser())) {
  100. assertThat(Iterators.size(read)).isEqualTo(1);
  101. }
  102. }
  103. @Test
  104. public void write_external_issues() {
  105. // no data yet
  106. assertThat(underTest.hasComponentData(FileStructure.Domain.EXTERNAL_ISSUES, 1)).isFalse();
  107. // write data
  108. ScannerReport.ExternalIssue issue = ScannerReport.ExternalIssue.newBuilder()
  109. .setMsg("the message")
  110. .build();
  111. underTest.appendComponentExternalIssue(1, issue);
  112. assertThat(underTest.hasComponentData(FileStructure.Domain.EXTERNAL_ISSUES, 1)).isTrue();
  113. File file = underTest.getFileStructure().fileFor(FileStructure.Domain.EXTERNAL_ISSUES, 1);
  114. assertThat(file).exists().isFile();
  115. try (CloseableIterator<ScannerReport.ExternalIssue> read = Protobuf.readStream(file, ScannerReport.ExternalIssue.parser())) {
  116. assertThat(Iterators.size(read)).isEqualTo(1);
  117. }
  118. }
  119. @Test
  120. public void write_adhoc_rule() {
  121. // write data
  122. ScannerReport.AdHocRule rule = ScannerReport.AdHocRule.newBuilder()
  123. .setEngineId("eslint")
  124. .setRuleId("123")
  125. .setName("Foo")
  126. .setDescription("Description")
  127. .setSeverity(Constants.Severity.BLOCKER)
  128. .setType(ScannerReport.IssueType.BUG)
  129. .build();
  130. underTest.appendAdHocRule(rule);
  131. File file = underTest.getFileStructure().adHocRules();
  132. assertThat(file).exists().isFile();
  133. try (CloseableIterator<ScannerReport.AdHocRule> read = Protobuf.readStream(file, ScannerReport.AdHocRule.parser())) {
  134. assertThat(Iterators.size(read)).isEqualTo(1);
  135. }
  136. }
  137. @Test
  138. public void write_changed_lines() {
  139. assertThat(underTest.hasComponentData(FileStructure.Domain.CHANGED_LINES, 1)).isFalse();
  140. ScannerReport.ChangedLines changedLines = ScannerReport.ChangedLines.newBuilder()
  141. .addLine(1)
  142. .addLine(3)
  143. .build();
  144. underTest.writeComponentChangedLines(1, changedLines);
  145. assertThat(underTest.hasComponentData(FileStructure.Domain.CHANGED_LINES, 1)).isTrue();
  146. File file = underTest.getFileStructure().fileFor(FileStructure.Domain.CHANGED_LINES, 1);
  147. assertThat(file).exists().isFile();
  148. ScannerReport.ChangedLines loadedChangedLines = Protobuf.read(file, ScannerReport.ChangedLines.parser());
  149. assertThat(loadedChangedLines.getLineList()).containsExactly(1, 3);
  150. }
  151. @Test
  152. public void write_measures() {
  153. assertThat(underTest.hasComponentData(FileStructure.Domain.MEASURES, 1)).isFalse();
  154. ScannerReport.Measure measure = ScannerReport.Measure.newBuilder()
  155. .setDoubleValue(DoubleValue.newBuilder().setValue(2.5d).setData("text-value"))
  156. .build();
  157. underTest.writeComponentMeasures(1, asList(measure));
  158. assertThat(underTest.hasComponentData(FileStructure.Domain.MEASURES, 1)).isTrue();
  159. File file = underTest.getFileStructure().fileFor(FileStructure.Domain.MEASURES, 1);
  160. assertThat(file).exists().isFile();
  161. try (CloseableIterator<ScannerReport.Measure> read = Protobuf.readStream(file, ScannerReport.Measure.parser())) {
  162. assertThat(Iterators.size(read)).isEqualTo(1);
  163. }
  164. }
  165. @Test
  166. public void write_scm() {
  167. assertThat(underTest.hasComponentData(FileStructure.Domain.CHANGESETS, 1)).isFalse();
  168. ScannerReport.Changesets scm = ScannerReport.Changesets.newBuilder()
  169. .setComponentRef(1)
  170. .addChangesetIndexByLine(0)
  171. .addChangeset(ScannerReport.Changesets.Changeset.newBuilder()
  172. .setRevision("123-456-789")
  173. .setAuthor("author")
  174. .setDate(123_456_789L))
  175. .build();
  176. underTest.writeComponentChangesets(scm);
  177. assertThat(underTest.hasComponentData(FileStructure.Domain.CHANGESETS, 1)).isTrue();
  178. File file = underTest.getFileStructure().fileFor(FileStructure.Domain.CHANGESETS, 1);
  179. assertThat(file).exists().isFile();
  180. ScannerReport.Changesets read = Protobuf.read(file, ScannerReport.Changesets.parser());
  181. assertThat(read.getComponentRef()).isEqualTo(1);
  182. assertThat(read.getChangesetCount()).isEqualTo(1);
  183. assertThat(read.getChangesetList()).hasSize(1);
  184. assertThat(read.getChangeset(0).getDate()).isEqualTo(123_456_789L);
  185. }
  186. @Test
  187. public void write_duplications() {
  188. assertThat(underTest.hasComponentData(FileStructure.Domain.DUPLICATIONS, 1)).isFalse();
  189. ScannerReport.Duplication duplication = ScannerReport.Duplication.newBuilder()
  190. .setOriginPosition(ScannerReport.TextRange.newBuilder()
  191. .setStartLine(1)
  192. .setEndLine(5)
  193. .build())
  194. .addDuplicate(ScannerReport.Duplicate.newBuilder()
  195. .setOtherFileRef(2)
  196. .setRange(ScannerReport.TextRange.newBuilder()
  197. .setStartLine(6)
  198. .setEndLine(10)
  199. .build())
  200. .build())
  201. .build();
  202. underTest.writeComponentDuplications(1, asList(duplication));
  203. assertThat(underTest.hasComponentData(FileStructure.Domain.DUPLICATIONS, 1)).isTrue();
  204. File file = underTest.getFileStructure().fileFor(FileStructure.Domain.DUPLICATIONS, 1);
  205. assertThat(file).exists().isFile();
  206. try (CloseableIterator<ScannerReport.Duplication> duplications = Protobuf.readStream(file, ScannerReport.Duplication.parser())) {
  207. ScannerReport.Duplication dup = duplications.next();
  208. assertThat(dup.getOriginPosition()).isNotNull();
  209. assertThat(dup.getDuplicateList()).hasSize(1);
  210. }
  211. }
  212. @Test
  213. public void write_duplication_blocks() {
  214. assertThat(underTest.hasComponentData(FileStructure.Domain.CPD_TEXT_BLOCKS, 1)).isFalse();
  215. ScannerReport.CpdTextBlock duplicationBlock = ScannerReport.CpdTextBlock.newBuilder()
  216. .setHash("abcdefghijklmnop")
  217. .setStartLine(1)
  218. .setEndLine(2)
  219. .setStartTokenIndex(10)
  220. .setEndTokenIndex(15)
  221. .build();
  222. underTest.writeCpdTextBlocks(1, asList(duplicationBlock));
  223. assertThat(underTest.hasComponentData(FileStructure.Domain.CPD_TEXT_BLOCKS, 1)).isTrue();
  224. File file = underTest.getFileStructure().fileFor(FileStructure.Domain.CPD_TEXT_BLOCKS, 1);
  225. assertThat(file).exists().isFile();
  226. try (CloseableIterator<ScannerReport.CpdTextBlock> duplicationBlocks = Protobuf.readStream(file, ScannerReport.CpdTextBlock.parser())) {
  227. ScannerReport.CpdTextBlock duplicationBlockResult = duplicationBlocks.next();
  228. assertThat(duplicationBlockResult.getHash()).isEqualTo("abcdefghijklmnop");
  229. assertThat(duplicationBlockResult.getStartLine()).isEqualTo(1);
  230. assertThat(duplicationBlockResult.getEndLine()).isEqualTo(2);
  231. assertThat(duplicationBlockResult.getStartTokenIndex()).isEqualTo(10);
  232. assertThat(duplicationBlockResult.getEndTokenIndex()).isEqualTo(15);
  233. }
  234. }
  235. @Test
  236. public void write_symbols() {
  237. // no data yet
  238. assertThat(underTest.hasComponentData(FileStructure.Domain.SYMBOLS, 1)).isFalse();
  239. // write data
  240. ScannerReport.Symbol symbol = ScannerReport.Symbol.newBuilder()
  241. .setDeclaration(ScannerReport.TextRange.newBuilder()
  242. .setStartLine(1)
  243. .setStartOffset(3)
  244. .setEndLine(1)
  245. .setEndOffset(5)
  246. .build())
  247. .addReference(ScannerReport.TextRange.newBuilder()
  248. .setStartLine(10)
  249. .setStartOffset(15)
  250. .setEndLine(11)
  251. .setEndOffset(2)
  252. .build())
  253. .build();
  254. underTest.writeComponentSymbols(1, asList(symbol));
  255. assertThat(underTest.hasComponentData(FileStructure.Domain.SYMBOLS, 1)).isTrue();
  256. File file = underTest.getFileStructure().fileFor(FileStructure.Domain.SYMBOLS, 1);
  257. assertThat(file).exists().isFile();
  258. try (CloseableIterator<ScannerReport.Symbol> read = Protobuf.readStream(file, ScannerReport.Symbol.parser())) {
  259. assertThat(read).hasSize(1);
  260. }
  261. }
  262. @Test
  263. public void write_syntax_highlighting() {
  264. // no data yet
  265. assertThat(underTest.hasComponentData(FileStructure.Domain.SYNTAX_HIGHLIGHTINGS, 1)).isFalse();
  266. underTest.writeComponentSyntaxHighlighting(1, asList(
  267. ScannerReport.SyntaxHighlightingRule.newBuilder()
  268. .setRange(ScannerReport.TextRange.newBuilder()
  269. .setStartLine(1)
  270. .setEndLine(1)
  271. .build())
  272. .setType(HighlightingType.ANNOTATION)
  273. .build()));
  274. assertThat(underTest.hasComponentData(FileStructure.Domain.SYNTAX_HIGHLIGHTINGS, 1)).isTrue();
  275. }
  276. @Test
  277. public void write_line_significant_code() {
  278. // no data yet
  279. assertThat(underTest.hasComponentData(FileStructure.Domain.SGNIFICANT_CODE, 1)).isFalse();
  280. underTest.writeComponentSignificantCode(1, asList(
  281. ScannerReport.LineSgnificantCode.newBuilder()
  282. .setLine(1)
  283. .setStartOffset(2)
  284. .setEndOffset(3)
  285. .build()));
  286. assertThat(underTest.hasComponentData(FileStructure.Domain.SGNIFICANT_CODE, 1)).isTrue();
  287. }
  288. @Test
  289. public void write_coverage() {
  290. // no data yet
  291. assertThat(underTest.hasComponentData(FileStructure.Domain.COVERAGES, 1)).isFalse();
  292. underTest.writeComponentCoverage(1, asList(
  293. ScannerReport.LineCoverage.newBuilder()
  294. .setLine(1)
  295. .setConditions(1)
  296. .setHits(true)
  297. .setCoveredConditions(1)
  298. .build()));
  299. assertThat(underTest.hasComponentData(FileStructure.Domain.COVERAGES, 1)).isTrue();
  300. }
  301. }