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.

FileSystemMediumTest.java 41KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102
  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.mediumtest.fs;
  21. import com.google.common.collect.ImmutableMap;
  22. import java.io.File;
  23. import java.io.IOException;
  24. import java.nio.charset.StandardCharsets;
  25. import java.nio.file.Files;
  26. import java.nio.file.Path;
  27. import java.util.Random;
  28. import org.apache.commons.io.FileUtils;
  29. import org.apache.commons.lang.StringUtils;
  30. import org.junit.Before;
  31. import org.junit.Rule;
  32. import org.junit.Test;
  33. import org.junit.rules.ExpectedException;
  34. import org.junit.rules.TemporaryFolder;
  35. import org.sonar.api.CoreProperties;
  36. import org.sonar.api.SonarEdition;
  37. import org.sonar.api.batch.fs.InputFile;
  38. import org.sonar.api.batch.fs.internal.DefaultInputFile;
  39. import org.sonar.api.utils.MessageException;
  40. import org.sonar.api.utils.PathUtils;
  41. import org.sonar.api.utils.System2;
  42. import org.sonar.api.utils.log.LogTester;
  43. import org.sonar.api.utils.log.LoggerLevel;
  44. import org.sonar.scanner.mediumtest.AnalysisResult;
  45. import org.sonar.scanner.mediumtest.ScannerMediumTester;
  46. import org.sonar.xoo.XooPlugin;
  47. import org.sonar.xoo.global.DeprecatedGlobalSensor;
  48. import org.sonar.xoo.global.GlobalProjectSensor;
  49. import org.sonar.xoo.rule.XooRulesDefinition;
  50. import static java.util.stream.Collectors.joining;
  51. import static org.assertj.core.api.Assertions.assertThat;
  52. import static org.junit.Assume.assumeTrue;
  53. public class FileSystemMediumTest {
  54. @Rule
  55. public TemporaryFolder temp = new TemporaryFolder();
  56. @Rule
  57. public ExpectedException thrown = ExpectedException.none();
  58. @Rule
  59. public LogTester logTester = new LogTester();
  60. @Rule
  61. public ScannerMediumTester tester = new ScannerMediumTester()
  62. .setEdition(SonarEdition.SONARCLOUD)
  63. .registerPlugin("xoo", new XooPlugin())
  64. .addDefaultQProfile("xoo", "Sonar Way")
  65. .addDefaultQProfile("xoo2", "Sonar Way");
  66. private File baseDir;
  67. private ImmutableMap.Builder<String, String> builder;
  68. @Before
  69. public void prepare() throws IOException {
  70. baseDir = temp.newFolder().getCanonicalFile();
  71. builder = ImmutableMap.<String, String>builder()
  72. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  73. .put("sonar.projectKey", "com.foo.project");
  74. }
  75. @Test
  76. public void scanProjectWithoutProjectName() throws IOException {
  77. File srcDir = new File(baseDir, "src");
  78. srcDir.mkdir();
  79. File xooFile = new File(srcDir, "sample.xoo");
  80. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  81. AnalysisResult result = tester.newAnalysis()
  82. .properties(builder
  83. .put("sonar.sources", "src")
  84. .build())
  85. .execute();
  86. int ref = result.getReportReader().readMetadata().getRootComponentRef();
  87. assertThat(result.getReportReader().readComponent(ref).getName()).isEmpty();
  88. assertThat(result.inputFiles()).hasSize(1);
  89. DefaultInputFile file = (DefaultInputFile) result.inputFile("src/sample.xoo");
  90. assertThat(file.type()).isEqualTo(InputFile.Type.MAIN);
  91. assertThat(file.relativePath()).isEqualTo("src/sample.xoo");
  92. assertThat(file.language()).isEqualTo("xoo");
  93. // file was published, since language matched xoo
  94. assertThat(file.isPublished()).isTrue();
  95. assertThat(result.getReportComponent(file.scannerId())).isNotNull();
  96. }
  97. @Test
  98. public void logBranchNameAndType() {
  99. builder.put("sonar.branch.name", "my-branch");
  100. File srcDir = new File(baseDir, "src");
  101. assertThat(srcDir.mkdir()).isTrue();
  102. // Using sonar.branch.name when the branch plugin is not installed is an error.
  103. thrown.expect(MessageException.class);
  104. tester.newAnalysis()
  105. .properties(builder
  106. .put("sonar.sources", "src")
  107. .build())
  108. .execute();
  109. }
  110. @Test
  111. public void dontLogInvalidOrganization() throws IOException {
  112. File srcDir = new File(baseDir, "src");
  113. srcDir.mkdir();
  114. File xooFile = new File(srcDir, "sample.xoo");
  115. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  116. tester.newAnalysis()
  117. .properties(builder
  118. .put("sonar.sources", "src")
  119. .build())
  120. .execute();
  121. assertThat(logTester.logs()).contains("Project key: com.foo.project");
  122. assertThat(logTester.logs().stream().collect(joining("\n"))).doesNotContain("Organization key");
  123. assertThat(logTester.logs().stream().collect(joining("\n"))).doesNotContain("Branch key");
  124. }
  125. @Test
  126. public void onlyGenerateMetadataIfNeeded() throws IOException {
  127. File srcDir = new File(baseDir, "src");
  128. srcDir.mkdir();
  129. File xooFile = new File(srcDir, "sample.xoo");
  130. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  131. File javaFile = new File(srcDir, "sample.java");
  132. FileUtils.write(javaFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  133. logTester.setLevel(LoggerLevel.DEBUG);
  134. tester.newAnalysis()
  135. .properties(builder
  136. .put("sonar.sources", "src")
  137. .build())
  138. .execute();
  139. assertThat(logTester.logs()).contains("2 files indexed");
  140. assertThat(logTester.logs()).contains("'src/sample.xoo' generated metadata with charset 'UTF-8'");
  141. assertThat(logTester.logs().stream().collect(joining("\n"))).doesNotContain("'src/sample.java' generated metadata");
  142. }
  143. @Test
  144. public void preloadFileMetadata() throws IOException {
  145. builder.put("sonar.preloadFileMetadata", "true");
  146. File srcDir = new File(baseDir, "src");
  147. srcDir.mkdir();
  148. File xooFile = new File(srcDir, "sample.xoo");
  149. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  150. File javaFile = new File(srcDir, "sample.java");
  151. FileUtils.write(javaFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  152. logTester.setLevel(LoggerLevel.DEBUG);
  153. tester.newAnalysis()
  154. .properties(builder
  155. .put("sonar.sources", "src")
  156. .build())
  157. .execute();
  158. assertThat(logTester.logs()).contains("2 files indexed");
  159. assertThat(logTester.logs()).contains("'src/sample.xoo' generated metadata with charset 'UTF-8'");
  160. assertThat(logTester.logs()).contains("'src/sample.java' generated metadata with charset 'UTF-8'");
  161. }
  162. @Test
  163. public void dontPublishFilesWithoutDetectedLanguage() throws IOException {
  164. Path mainDir = baseDir.toPath().resolve("src").resolve("main");
  165. Files.createDirectories(mainDir);
  166. Path testDir = baseDir.toPath().resolve("src").resolve("test");
  167. Files.createDirectories(testDir);
  168. Path testXooFile = testDir.resolve("sample.java");
  169. Files.write(testXooFile, "Sample xoo\ncontent".getBytes(StandardCharsets.UTF_8));
  170. Path xooFile = mainDir.resolve("sample.xoo");
  171. Files.write(xooFile, "Sample xoo\ncontent".getBytes(StandardCharsets.UTF_8));
  172. Path javaFile = mainDir.resolve("sample.java");
  173. Files.write(javaFile, "Sample xoo\ncontent".getBytes(StandardCharsets.UTF_8));
  174. logTester.setLevel(LoggerLevel.DEBUG);
  175. AnalysisResult result = tester.newAnalysis()
  176. .properties(builder
  177. .put("sonar.sources", "src/main")
  178. .put("sonar.tests", "src/test")
  179. .build())
  180. .execute();
  181. assertThat(logTester.logs()).contains("3 files indexed");
  182. assertThat(logTester.logs()).contains("'src/main/sample.xoo' generated metadata with charset 'UTF-8'");
  183. assertThat(logTester.logs().stream().collect(joining("\n"))).doesNotContain("'src/main/sample.java' generated metadata");
  184. assertThat(logTester.logs().stream().collect(joining("\n"))).doesNotContain("'src/test/sample.java' generated metadata");
  185. DefaultInputFile javaInputFile = (DefaultInputFile) result.inputFile("src/main/sample.java");
  186. thrown.expect(IllegalStateException.class);
  187. thrown.expectMessage("Unable to find report for component");
  188. result.getReportComponent(javaInputFile);
  189. }
  190. @Test
  191. public void createIssueOnAnyFile() throws IOException {
  192. tester
  193. .addRules(new XooRulesDefinition())
  194. .addActiveRule("xoo", "OneIssuePerUnknownFile", null, "OneIssuePerUnknownFile", "MAJOR", null, "xoo");
  195. File srcDir = new File(baseDir, "src");
  196. srcDir.mkdir();
  197. File xooFile = new File(srcDir, "sample.unknown");
  198. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  199. logTester.setLevel(LoggerLevel.DEBUG);
  200. AnalysisResult result = tester.newAnalysis()
  201. .properties(builder
  202. .put("sonar.sources", "src")
  203. .build())
  204. .execute();
  205. assertThat(logTester.logs()).contains("1 file indexed");
  206. assertThat(logTester.logs()).contains("'src" + File.separator + "sample.unknown' indexed with language 'null'");
  207. assertThat(logTester.logs()).contains("'src/sample.unknown' generated metadata with charset 'UTF-8'");
  208. DefaultInputFile inputFile = (DefaultInputFile) result.inputFile("src/sample.unknown");
  209. assertThat(result.getReportComponent(inputFile)).isNotNull();
  210. }
  211. @Test
  212. public void lazyIssueExclusion() throws IOException {
  213. tester
  214. .addRules(new XooRulesDefinition())
  215. .addActiveRule("xoo", "OneIssuePerFile", null, "OneIssuePerFile", "MAJOR", null, "xoo");
  216. builder.put("sonar.issue.ignore.allfile", "1")
  217. .put("sonar.issue.ignore.allfile.1.fileRegexp", "pattern");
  218. File srcDir = new File(baseDir, "src");
  219. srcDir.mkdir();
  220. File xooFile = new File(srcDir, "sample.xoo");
  221. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  222. File unknownFile = new File(srcDir, "myfile.binary");
  223. byte[] b = new byte[512];
  224. new Random().nextBytes(b);
  225. FileUtils.writeByteArrayToFile(unknownFile, b);
  226. logTester.setLevel(LoggerLevel.DEBUG);
  227. tester.newAnalysis()
  228. .properties(builder
  229. .put("sonar.sources", "src")
  230. .build())
  231. .execute();
  232. assertThat(logTester.logs()).containsOnlyOnce("'src" + File.separator + "myfile.binary' indexed with language 'null'");
  233. assertThat(logTester.logs()).doesNotContain("Evaluate issue exclusions for 'src/myfile.binary'");
  234. assertThat(logTester.logs()).containsOnlyOnce("Evaluate issue exclusions for 'src/sample.xoo'");
  235. }
  236. @Test
  237. public void preloadIssueExclusions() throws IOException {
  238. builder.put("sonar.issue.ignore.allfile", "1")
  239. .put("sonar.issue.ignore.allfile.1.fileRegexp", "pattern")
  240. .put("sonar.preloadFileMetadata", "true");
  241. File srcDir = new File(baseDir, "src");
  242. srcDir.mkdir();
  243. File xooFile = new File(srcDir, "sample.xoo");
  244. FileUtils.write(xooFile, "Sample xoo\npattern", StandardCharsets.UTF_8);
  245. File unknownFile = new File(srcDir, "myfile.binary");
  246. FileUtils.write(unknownFile, "some text", StandardCharsets.UTF_8);
  247. logTester.setLevel(LoggerLevel.DEBUG);
  248. tester.newAnalysis()
  249. .properties(builder
  250. .put("sonar.sources", "src")
  251. .build())
  252. .execute();
  253. assertThat(logTester.logs()).containsSequence("Evaluate issue exclusions for 'src/sample.xoo'",
  254. " - Exclusion pattern 'pattern': all issues in this file will be ignored.");
  255. }
  256. @Test
  257. public void publishFilesWithIssues() throws IOException {
  258. tester
  259. .addRules(new XooRulesDefinition())
  260. .addActiveRule("xoo", "OneIssueOnDirPerFile", null, "OneIssueOnDirPerFile", "MAJOR", null, "xoo");
  261. File srcDir = new File(baseDir, "src");
  262. srcDir.mkdir();
  263. File xooFile = new File(srcDir, "sample.xoo");
  264. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  265. AnalysisResult result = tester.newAnalysis()
  266. .properties(builder
  267. .put("sonar.sources", "src")
  268. .build())
  269. .execute();
  270. DefaultInputFile file = (DefaultInputFile) result.inputFile("src/sample.xoo");
  271. assertThat(file.isPublished()).isTrue();
  272. assertThat(result.getReportComponent(file)).isNotNull();
  273. }
  274. @Test
  275. public void scanProjectWithSourceDir() throws IOException {
  276. File srcDir = new File(baseDir, "src");
  277. srcDir.mkdir();
  278. File xooFile = new File(srcDir, "sample.xoo");
  279. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  280. AnalysisResult result = tester.newAnalysis()
  281. .properties(builder
  282. .put("sonar.sources", "src")
  283. .build())
  284. .execute();
  285. assertThat(result.inputFiles()).hasSize(1);
  286. assertThat(result.inputFile("src/sample.xoo").type()).isEqualTo(InputFile.Type.MAIN);
  287. assertThat(result.inputFile("src/sample.xoo").relativePath()).isEqualTo("src/sample.xoo");
  288. }
  289. @Test
  290. public void scanBigProject() throws IOException {
  291. File srcDir = new File(baseDir, "src");
  292. srcDir.mkdir();
  293. int nbFiles = 100;
  294. int ruleCount = 100000;
  295. for (int nb = 1; nb <= nbFiles; nb++) {
  296. File xooFile = new File(srcDir, "sample" + nb + ".xoo");
  297. FileUtils.write(xooFile, StringUtils.repeat(StringUtils.repeat("a", 100) + "\n", ruleCount / 1000));
  298. }
  299. AnalysisResult result = tester.newAnalysis()
  300. .properties(builder
  301. .put("sonar.sources", "src")
  302. .build())
  303. .execute();
  304. assertThat(result.inputFiles()).hasSize(100);
  305. }
  306. @Test
  307. public void scanProjectWithTestDir() throws IOException {
  308. File test = new File(baseDir, "test");
  309. test.mkdir();
  310. File xooFile = new File(test, "sampleTest.xoo");
  311. FileUtils.write(xooFile, "Sample test xoo\ncontent", StandardCharsets.UTF_8);
  312. AnalysisResult result = tester.newAnalysis()
  313. .properties(builder
  314. .put("sonar.sources", "")
  315. .put("sonar.tests", "test")
  316. .build())
  317. .execute();
  318. assertThat(result.inputFiles()).hasSize(1);
  319. assertThat(result.inputFile("test/sampleTest.xoo").type()).isEqualTo(InputFile.Type.TEST);
  320. }
  321. /**
  322. * SONAR-5419
  323. */
  324. @Test
  325. public void scanProjectWithMixedSourcesAndTests() throws IOException {
  326. File srcDir = new File(baseDir, "src");
  327. srcDir.mkdir();
  328. File xooFile = new File(srcDir, "sample.xoo");
  329. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  330. File xooFile2 = new File(baseDir, "another.xoo");
  331. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  332. File testDir = new File(baseDir, "test");
  333. testDir.mkdir();
  334. File xooTestFile = new File(baseDir, "sampleTest2.xoo");
  335. FileUtils.write(xooTestFile, "Sample test xoo\ncontent", StandardCharsets.UTF_8);
  336. File xooTestFile2 = new File(testDir, "sampleTest.xoo");
  337. FileUtils.write(xooTestFile2, "Sample test xoo 2\ncontent", StandardCharsets.UTF_8);
  338. AnalysisResult result = tester.newAnalysis()
  339. .properties(builder
  340. .put("sonar.sources", "src,another.xoo")
  341. .put("sonar.tests", "test,sampleTest2.xoo")
  342. .build())
  343. .execute();
  344. assertThat(result.inputFiles()).hasSize(4);
  345. }
  346. @Test
  347. public void fileInclusionsExclusions() throws IOException {
  348. File srcDir = new File(baseDir, "src");
  349. srcDir.mkdir();
  350. File xooFile = new File(srcDir, "sample.xoo");
  351. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  352. File xooFile2 = new File(baseDir, "another.xoo");
  353. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  354. File testDir = new File(baseDir, "test");
  355. testDir.mkdir();
  356. File xooTestFile = new File(baseDir, "sampleTest2.xoo");
  357. FileUtils.write(xooTestFile, "Sample test xoo\ncontent");
  358. File xooTestFile2 = new File(testDir, "sampleTest.xoo");
  359. FileUtils.write(xooTestFile2, "Sample test xoo 2\ncontent");
  360. AnalysisResult result = tester.newAnalysis()
  361. .properties(builder
  362. .put("sonar.sources", "src,another.xoo")
  363. .put("sonar.tests", "test,sampleTest2.xoo")
  364. .put("sonar.inclusions", "src/**")
  365. .put("sonar.exclusions", "**/another.*")
  366. .put("sonar.test.inclusions", "**/sampleTest*.*")
  367. .put("sonar.test.exclusions", "**/sampleTest2.xoo")
  368. .build())
  369. .execute();
  370. assertThat(result.inputFiles()).hasSize(2);
  371. }
  372. @Test
  373. public void test_inclusions_on_multi_modules() throws IOException {
  374. File baseDir = temp.getRoot();
  375. File baseDirModuleA = new File(baseDir, "moduleA");
  376. File baseDirModuleB = new File(baseDir, "moduleB");
  377. File srcDirA = new File(baseDirModuleA, "tests");
  378. srcDirA.mkdirs();
  379. File srcDirB = new File(baseDirModuleB, "tests");
  380. srcDirB.mkdirs();
  381. File xooFileA = new File(srcDirA, "sampleTestA.xoo");
  382. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  383. File xooFileB = new File(srcDirB, "sampleTestB.xoo");
  384. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  385. final ImmutableMap.Builder<String, String> builder = ImmutableMap.<String, String>builder()
  386. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  387. .put("sonar.projectKey", "com.foo.project")
  388. .put("sonar.sources", "")
  389. .put("sonar.tests", "tests")
  390. .put("sonar.modules", "moduleA,moduleB");
  391. AnalysisResult result = tester.newAnalysis()
  392. .properties(builder.build())
  393. .execute();
  394. assertThat(result.inputFiles()).hasSize(2);
  395. InputFile fileA = result.inputFile("moduleA/tests/sampleTestA.xoo");
  396. assertThat(fileA).isNotNull();
  397. InputFile fileB = result.inputFile("moduleB/tests/sampleTestB.xoo");
  398. assertThat(fileB).isNotNull();
  399. result = tester.newAnalysis()
  400. .properties(builder
  401. .put("sonar.test.inclusions", "moduleA/tests/**")
  402. .build())
  403. .execute();
  404. assertThat(result.inputFiles()).hasSize(1);
  405. fileA = result.inputFile("moduleA/tests/sampleTestA.xoo");
  406. assertThat(fileA).isNotNull();
  407. fileB = result.inputFile("moduleB/tests/sampleTestB.xoo");
  408. assertThat(fileB).isNull();
  409. }
  410. @Test
  411. public void test_module_level_inclusions_override_parent_on_multi_modules() throws IOException {
  412. File baseDir = temp.getRoot();
  413. File baseDirModuleA = new File(baseDir, "moduleA");
  414. File baseDirModuleB = new File(baseDir, "moduleB");
  415. File srcDirA = new File(baseDirModuleA, "src");
  416. srcDirA.mkdirs();
  417. File srcDirB = new File(baseDirModuleB, "src");
  418. srcDirB.mkdirs();
  419. File xooFileA = new File(srcDirA, "sampleA.xoo");
  420. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  421. File xooFileB = new File(srcDirB, "sampleB.xoo");
  422. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  423. final ImmutableMap.Builder<String, String> builder = ImmutableMap.<String, String>builder()
  424. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  425. .put("sonar.projectKey", "com.foo.project")
  426. .put("sonar.sources", "src")
  427. .put("sonar.modules", "moduleA,moduleB")
  428. .put("sonar.inclusions", "**/*.php");
  429. AnalysisResult result = tester.newAnalysis()
  430. .properties(builder.build())
  431. .execute();
  432. assertThat(result.inputFiles()).isEmpty();
  433. result = tester.newAnalysis()
  434. .properties(builder
  435. .put("moduleA.sonar.inclusions", "**/*.xoo")
  436. .build())
  437. .execute();
  438. assertThat(result.inputFiles()).hasSize(1);
  439. InputFile fileA = result.inputFile("moduleA/src/sampleA.xoo");
  440. assertThat(fileA).isNotNull();
  441. }
  442. @Test
  443. public void warn_user_for_outdated_scanner_side_inherited_exclusions_for_multi_module_project() throws IOException {
  444. File baseDir = temp.getRoot();
  445. File baseDirModuleA = new File(baseDir, "moduleA");
  446. File baseDirModuleB = new File(baseDir, "moduleB");
  447. File srcDirA = new File(baseDirModuleA, "src");
  448. srcDirA.mkdirs();
  449. File srcDirB = new File(baseDirModuleB, "src");
  450. srcDirB.mkdirs();
  451. File xooFileA = new File(srcDirA, "sample.xoo");
  452. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  453. File xooFileB = new File(srcDirB, "sample.xoo");
  454. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  455. AnalysisResult result = tester.newAnalysis()
  456. .properties(ImmutableMap.<String, String>builder()
  457. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  458. .put("sonar.projectKey", "com.foo.project")
  459. .put("sonar.sources", "src")
  460. .put("sonar.modules", "moduleA,moduleB")
  461. .put("sonar.exclusions", "src/sample.xoo")
  462. .build())
  463. .execute();
  464. InputFile fileA = result.inputFile("moduleA/src/sample.xoo");
  465. assertThat(fileA).isNull();
  466. InputFile fileB = result.inputFile("moduleB/src/sample.xoo");
  467. assertThat(fileB).isNull();
  468. assertThat(logTester.logs(LoggerLevel.WARN))
  469. .contains("Specifying module-relative paths at project level in the property 'sonar.exclusions' is deprecated. " +
  470. "To continue matching files like 'moduleA/src/sample.xoo', update this property so that patterns refer to project-relative paths.");
  471. }
  472. @Test
  473. public void support_global_server_side_exclusions_for_multi_module_project() throws IOException {
  474. File baseDir = temp.getRoot();
  475. File baseDirModuleA = new File(baseDir, "moduleA");
  476. File baseDirModuleB = new File(baseDir, "moduleB");
  477. File srcDirA = new File(baseDirModuleA, "src");
  478. srcDirA.mkdirs();
  479. File srcDirB = new File(baseDirModuleB, "src");
  480. srcDirB.mkdirs();
  481. File xooFileA = new File(srcDirA, "sample.xoo");
  482. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  483. File xooFileB = new File(srcDirB, "sample.xoo");
  484. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  485. tester.addGlobalServerSettings(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY, "**/*.xoo");
  486. AnalysisResult result = tester.newAnalysis()
  487. .properties(ImmutableMap.<String, String>builder()
  488. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  489. .put("sonar.projectKey", "com.foo.project")
  490. .put("sonar.sources", "src")
  491. .put("sonar.modules", "moduleA,moduleB")
  492. .build())
  493. .execute();
  494. InputFile fileA = result.inputFile("moduleA/src/sample.xoo");
  495. assertThat(fileA).isNull();
  496. InputFile fileB = result.inputFile("moduleB/src/sample.xoo");
  497. assertThat(fileB).isNull();
  498. }
  499. @Test
  500. public void support_global_server_side_global_exclusions_for_multi_module_project() throws IOException {
  501. File baseDir = temp.getRoot();
  502. File baseDirModuleA = new File(baseDir, "moduleA");
  503. File baseDirModuleB = new File(baseDir, "moduleB");
  504. File srcDirA = new File(baseDirModuleA, "src");
  505. srcDirA.mkdirs();
  506. File srcDirB = new File(baseDirModuleB, "src");
  507. srcDirB.mkdirs();
  508. File xooFileA = new File(srcDirA, "sample.xoo");
  509. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  510. File xooFileB = new File(srcDirB, "sample.xoo");
  511. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  512. tester.addGlobalServerSettings(CoreProperties.GLOBAL_EXCLUSIONS_PROPERTY, "**/*.xoo");
  513. AnalysisResult result = tester.newAnalysis()
  514. .properties(ImmutableMap.<String, String>builder()
  515. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  516. .put("sonar.projectKey", "com.foo.project")
  517. .put("sonar.sources", "src")
  518. .put("sonar.modules", "moduleA,moduleB")
  519. .build())
  520. .execute();
  521. InputFile fileA = result.inputFile("moduleA/src/sample.xoo");
  522. assertThat(fileA).isNull();
  523. InputFile fileB = result.inputFile("moduleB/src/sample.xoo");
  524. assertThat(fileB).isNull();
  525. }
  526. @Test
  527. public void warn_user_for_outdated_server_side_inherited_exclusions_for_multi_module_project() throws IOException {
  528. File baseDir = temp.getRoot();
  529. File baseDirModuleA = new File(baseDir, "moduleA");
  530. File baseDirModuleB = new File(baseDir, "moduleB");
  531. File srcDirA = new File(baseDirModuleA, "src");
  532. srcDirA.mkdirs();
  533. File srcDirB = new File(baseDirModuleB, "src");
  534. srcDirB.mkdirs();
  535. File xooFileA = new File(srcDirA, "sample.xoo");
  536. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  537. File xooFileB = new File(srcDirB, "sample.xoo");
  538. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  539. tester.addProjectServerSettings("sonar.exclusions", "src/sample.xoo");
  540. AnalysisResult result = tester.newAnalysis()
  541. .properties(ImmutableMap.<String, String>builder()
  542. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  543. .put("sonar.projectKey", "com.foo.project")
  544. .put("sonar.sources", "src")
  545. .put("sonar.modules", "moduleA,moduleB")
  546. .build())
  547. .execute();
  548. InputFile fileA = result.inputFile("moduleA/src/sample.xoo");
  549. assertThat(fileA).isNull();
  550. InputFile fileB = result.inputFile("moduleB/src/sample.xoo");
  551. assertThat(fileB).isNull();
  552. assertThat(logTester.logs(LoggerLevel.WARN))
  553. .contains("Specifying module-relative paths at project level in the property 'sonar.exclusions' is deprecated. " +
  554. "To continue matching files like 'moduleA/src/sample.xoo', update this property so that patterns refer to project-relative paths.");
  555. }
  556. @Test
  557. public void failForDuplicateInputFile() throws IOException {
  558. File srcDir = new File(baseDir, "src");
  559. srcDir.mkdir();
  560. File xooFile = new File(srcDir, "sample.xoo");
  561. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  562. thrown.expect(MessageException.class);
  563. thrown.expectMessage("File src/sample.xoo can't be indexed twice. Please check that inclusion/exclusion patterns produce disjoint sets for main and test files");
  564. tester.newAnalysis()
  565. .properties(builder
  566. .put("sonar.sources", "src,src/sample.xoo")
  567. .build())
  568. .execute();
  569. }
  570. // SONAR-9574
  571. @Test
  572. public void failForDuplicateInputFileInDifferentModules() throws IOException {
  573. File srcDir = new File(baseDir, "module1/src");
  574. srcDir.mkdir();
  575. File xooFile = new File(srcDir, "sample.xoo");
  576. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  577. thrown.expect(MessageException.class);
  578. thrown.expectMessage("File module1/src/sample.xoo can't be indexed twice. Please check that inclusion/exclusion patterns produce disjoint sets for main and test files");
  579. tester.newAnalysis()
  580. .properties(builder
  581. .put("sonar.sources", "module1/src")
  582. .put("sonar.modules", "module1")
  583. .put("module1.sonar.sources", "src")
  584. .build())
  585. .execute();
  586. }
  587. // SONAR-5330
  588. @Test
  589. public void scanProjectWithSourceSymlink() {
  590. assumeTrue(!System2.INSTANCE.isOsWindows());
  591. File projectDir = new File("test-resources/mediumtest/xoo/sample-with-symlink");
  592. AnalysisResult result = tester
  593. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  594. .property("sonar.exclusions", "**/*.xoo.measures,**/*.xoo.scm")
  595. .property("sonar.test.exclusions", "**/*.xoo.measures,**/*.xoo.scm")
  596. .execute();
  597. assertThat(result.inputFiles()).hasSize(3);
  598. // check that symlink was not resolved to target
  599. assertThat(result.inputFiles()).extractingResultOf("path").toString().startsWith(projectDir.toString());
  600. }
  601. // SONAR-6719
  602. @Test
  603. public void scanProjectWithWrongCase() {
  604. // To please the quality gate, don't use assumeTrue, or the test will be reported as skipped
  605. File projectDir = new File("test-resources/mediumtest/xoo/sample");
  606. ScannerMediumTester.AnalysisBuilder analysis = tester
  607. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  608. .property("sonar.sources", "XOURCES")
  609. .property("sonar.tests", "TESTX");
  610. if (System2.INSTANCE.isOsWindows()) { // Windows is file path case-insensitive
  611. AnalysisResult result = analysis.execute();
  612. assertThat(result.inputFiles()).hasSize(8);
  613. assertThat(result.inputFiles()).extractingResultOf("relativePath").containsOnly(
  614. "testx/ClassOneTest.xoo.measures",
  615. "xources/hello/helloscala.xoo.measures",
  616. "xources/hello/HelloJava.xoo.measures",
  617. "testx/ClassOneTest.xoo",
  618. "xources/hello/HelloJava.xoo.scm",
  619. "xources/hello/helloscala.xoo",
  620. "testx/ClassOneTest.xoo.scm",
  621. "xources/hello/HelloJava.xoo");
  622. } else if (System2.INSTANCE.isOsMac()) {
  623. AnalysisResult result = analysis.execute();
  624. assertThat(result.inputFiles()).hasSize(8);
  625. assertThat(result.inputFiles()).extractingResultOf("relativePath").containsOnly(
  626. "TESTX/ClassOneTest.xoo.measures",
  627. "XOURCES/hello/helloscala.xoo.measures",
  628. "XOURCES/hello/HelloJava.xoo.measures",
  629. "TESTX/ClassOneTest.xoo",
  630. "XOURCES/hello/HelloJava.xoo.scm",
  631. "XOURCES/hello/helloscala.xoo",
  632. "TESTX/ClassOneTest.xoo.scm",
  633. "XOURCES/hello/HelloJava.xoo");
  634. } else {
  635. thrown.expect(MessageException.class);
  636. thrown.expectMessage("The folder 'TESTX' does not exist for 'sample'");
  637. analysis.execute();
  638. }
  639. }
  640. @Test
  641. public void indexAnyFile() throws IOException {
  642. File srcDir = new File(baseDir, "src");
  643. srcDir.mkdir();
  644. File xooFile = new File(srcDir, "sample.xoo");
  645. FileUtils.write(xooFile, "Sample xoo\ncontent");
  646. File otherFile = new File(srcDir, "sample.other");
  647. FileUtils.write(otherFile, "Sample other\ncontent");
  648. AnalysisResult result = tester.newAnalysis()
  649. .properties(builder
  650. .put("sonar.sources", "src")
  651. .build())
  652. .execute();
  653. assertThat(result.inputFiles()).hasSize(2);
  654. assertThat(result.inputFile("src/sample.other").type()).isEqualTo(InputFile.Type.MAIN);
  655. assertThat(result.inputFile("src/sample.other").relativePath()).isEqualTo("src/sample.other");
  656. assertThat(result.inputFile("src/sample.other").language()).isNull();
  657. }
  658. @Test
  659. public void scanMultiModuleProject() {
  660. File projectDir = new File("test-resources/mediumtest/xoo/multi-modules-sample");
  661. AnalysisResult result = tester
  662. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  663. .execute();
  664. assertThat(result.inputFiles()).hasSize(4);
  665. }
  666. @Test
  667. public void deprecated_global_sensor_should_see_project_relative_paths() {
  668. File projectDir = new File("test-resources/mediumtest/xoo/multi-modules-sample");
  669. AnalysisResult result = tester
  670. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  671. .property(DeprecatedGlobalSensor.ENABLE_PROP, "true")
  672. .execute();
  673. assertThat(result.inputFiles()).hasSize(4);
  674. assertThat(logTester.logs(LoggerLevel.INFO)).contains(
  675. "Deprecated Global Sensor: module_a/module_a1/src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo",
  676. "Deprecated Global Sensor: module_a/module_a2/src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo",
  677. "Deprecated Global Sensor: module_b/module_b1/src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo",
  678. "Deprecated Global Sensor: module_b/module_b2/src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo");
  679. }
  680. @Test
  681. public void global_sensor_should_see_project_relative_paths() {
  682. File projectDir = new File("test-resources/mediumtest/xoo/multi-modules-sample");
  683. AnalysisResult result = tester
  684. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  685. .property(GlobalProjectSensor.ENABLE_PROP, "true")
  686. .execute();
  687. assertThat(result.inputFiles()).hasSize(4);
  688. assertThat(logTester.logs(LoggerLevel.INFO)).contains(
  689. "Global Sensor: module_a/module_a1/src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo",
  690. "Global Sensor: module_a/module_a2/src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo",
  691. "Global Sensor: module_b/module_b1/src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo",
  692. "Global Sensor: module_b/module_b2/src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo");
  693. }
  694. @Test
  695. public void scanProjectWithCommaInSourcePath() throws IOException {
  696. File srcDir = new File(baseDir, "src");
  697. srcDir.mkdir();
  698. File xooFile = new File(srcDir, "sample,1.xoo");
  699. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  700. File xooFile2 = new File(baseDir, "another,2.xoo");
  701. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  702. File testDir = new File(baseDir, "test");
  703. testDir.mkdir();
  704. File xooTestFile = new File(testDir, "sampleTest,1.xoo");
  705. FileUtils.write(xooTestFile, "Sample test xoo\ncontent", StandardCharsets.UTF_8);
  706. File xooTestFile2 = new File(baseDir, "sampleTest,2.xoo");
  707. FileUtils.write(xooTestFile2, "Sample test xoo 2\ncontent", StandardCharsets.UTF_8);
  708. AnalysisResult result = tester.newAnalysis()
  709. .properties(builder
  710. .put("sonar.sources", "src,\"another,2.xoo\"")
  711. .put("sonar.tests", "\"test\",\"sampleTest,2.xoo\"")
  712. .build())
  713. .execute();
  714. assertThat(result.inputFiles()).hasSize(4);
  715. }
  716. @Test
  717. public void twoLanguagesWithSameExtension() throws IOException {
  718. File srcDir = new File(baseDir, "src");
  719. srcDir.mkdir();
  720. File xooFile = new File(srcDir, "sample.xoo");
  721. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  722. File xooFile2 = new File(srcDir, "sample.xoo2");
  723. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  724. AnalysisResult result = tester.newAnalysis()
  725. .properties(builder
  726. .put("sonar.sources", "src")
  727. .build())
  728. .execute();
  729. assertThat(result.inputFiles()).hasSize(2);
  730. try {
  731. result = tester.newAnalysis()
  732. .properties(builder
  733. .put("sonar.lang.patterns.xoo2", "**/*.xoo")
  734. .build())
  735. .execute();
  736. } catch (Exception e) {
  737. assertThat(e)
  738. .isInstanceOf(MessageException.class)
  739. .hasMessage(
  740. "Language of file 'src" + File.separator
  741. + "sample.xoo' can not be decided as the file matches patterns of both sonar.lang.patterns.xoo : **/*.xoo and sonar.lang.patterns.xoo2 : **/*.xoo");
  742. }
  743. // SONAR-9561
  744. result = tester.newAnalysis()
  745. .properties(builder
  746. .put("sonar.exclusions", "**/sample.xoo")
  747. .build())
  748. .execute();
  749. assertThat(result.inputFiles()).hasSize(1);
  750. }
  751. @Test
  752. public void log_all_exclusions_properties_per_modules() throws IOException {
  753. File baseDir = temp.getRoot();
  754. File baseDirModuleA = new File(baseDir, "moduleA");
  755. File baseDirModuleB = new File(baseDir, "moduleB");
  756. File srcDirA = new File(baseDirModuleA, "src");
  757. srcDirA.mkdirs();
  758. File srcDirB = new File(baseDirModuleB, "src");
  759. srcDirB.mkdirs();
  760. File xooFileA = new File(srcDirA, "sample.xoo");
  761. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  762. File xooFileB = new File(srcDirB, "sample.xoo");
  763. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  764. AnalysisResult result = tester.newAnalysis()
  765. .properties(ImmutableMap.<String, String>builder()
  766. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  767. .put("sonar.projectKey", "com.foo.project")
  768. .put("sonar.sources", "src")
  769. .put("sonar.modules", "moduleA,moduleB")
  770. .put("sonar.inclusions", "**/global.inclusions")
  771. .put("sonar.test.inclusions", "**/global.test.inclusions")
  772. .put("sonar.exclusions", "**/global.exclusions")
  773. .put("sonar.test.exclusions", "**/global.test.exclusions")
  774. .put("sonar.coverage.exclusions", "**/coverage.exclusions")
  775. .put("sonar.cpd.exclusions", "**/cpd.exclusions")
  776. .build())
  777. .execute();
  778. assertThat(logTester.logs(LoggerLevel.INFO))
  779. .containsSequence("Indexing files...",
  780. "Project configuration:",
  781. " Included sources: **/global.inclusions",
  782. " Excluded sources: **/global.exclusions, **/global.test.inclusions",
  783. " Included tests: **/global.test.inclusions",
  784. " Excluded tests: **/global.test.exclusions",
  785. " Excluded sources for coverage: **/coverage.exclusions",
  786. " Excluded sources for duplication: **/cpd.exclusions",
  787. "Indexing files of module 'moduleA'",
  788. " Base dir: " + baseDirModuleA.getAbsolutePath(),
  789. " Source paths: src",
  790. " Included sources: **/global.inclusions",
  791. " Excluded sources: **/global.exclusions, **/global.test.inclusions",
  792. " Included tests: **/global.test.inclusions",
  793. " Excluded tests: **/global.test.exclusions",
  794. " Excluded sources for coverage: **/coverage.exclusions",
  795. " Excluded sources for duplication: **/cpd.exclusions",
  796. "Indexing files of module 'moduleB'",
  797. " Base dir: " + baseDirModuleB.getAbsolutePath(),
  798. " Source paths: src",
  799. " Included sources: **/global.inclusions",
  800. " Excluded sources: **/global.exclusions, **/global.test.inclusions",
  801. " Included tests: **/global.test.inclusions",
  802. " Excluded tests: **/global.test.exclusions",
  803. " Excluded sources for coverage: **/coverage.exclusions",
  804. " Excluded sources for duplication: **/cpd.exclusions",
  805. "Indexing files of module 'com.foo.project'",
  806. " Base dir: " + baseDir.getAbsolutePath(),
  807. " Included sources: **/global.inclusions",
  808. " Excluded sources: **/global.exclusions, **/global.test.inclusions",
  809. " Included tests: **/global.test.inclusions",
  810. " Excluded tests: **/global.test.exclusions",
  811. " Excluded sources for coverage: **/coverage.exclusions",
  812. " Excluded sources for duplication: **/cpd.exclusions");
  813. }
  814. @Test
  815. public void ignore_files_outside_project_basedir() throws IOException {
  816. File srcDir = new File(baseDir, "src");
  817. srcDir.mkdir();
  818. File xooFile = new File(srcDir, "sample1.xoo");
  819. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  820. File outsideBaseDir = temp.newFolder().getCanonicalFile();
  821. File xooFile2 = new File(outsideBaseDir, "another.xoo");
  822. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  823. AnalysisResult result = tester.newAnalysis()
  824. .properties(builder
  825. .put("sonar.sources", "src," + PathUtils.canonicalPath(xooFile2))
  826. .build())
  827. .execute();
  828. assertThat(result.inputFiles()).hasSize(1);
  829. assertThat(logTester.logs(LoggerLevel.WARN)).contains("File '" + xooFile2.getAbsolutePath() + "' is ignored. It is not located in project basedir '" + baseDir + "'.");
  830. }
  831. @Test
  832. public void ignore_files_outside_module_basedir() throws IOException {
  833. File moduleA = new File(baseDir, "moduleA");
  834. moduleA.mkdir();
  835. File xooFileA = new File(moduleA, "src/sampleA.xoo");
  836. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  837. File xooFile2 = new File(baseDir, "another.xoo");
  838. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  839. AnalysisResult result = tester.newAnalysis()
  840. .properties(builder
  841. .put("sonar.modules", "moduleA")
  842. .put("moduleA.sonar.sources", "src," + PathUtils.canonicalPath(xooFile2))
  843. .build())
  844. .execute();
  845. assertThat(result.inputFiles()).hasSize(1);
  846. assertThat(logTester.logs(LoggerLevel.WARN))
  847. .contains("File '" + xooFile2.getAbsolutePath() + "' is ignored. It is not located in module basedir '" + new File(baseDir, "moduleA") + "'.");
  848. }
  849. @Test
  850. public void exclusion_based_on_scm_info() {
  851. File projectDir = new File("test-resources/mediumtest/xoo/sample-with-ignored-file");
  852. AnalysisResult result = tester
  853. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  854. .property("sonar.exclusions", "**/*.xoo.ignore")
  855. .property("sonar.test.exclusions", "**/*.xoo.ignore")
  856. .execute();
  857. assertThat(result.inputFile("xources/hello/ClassTwo.xoo")).isNull();
  858. assertThat(result.inputFile("testx/ClassTwoTest.xoo")).isNull();
  859. assertThat(result.inputFile("xources/hello/ClassOne.xoo")).isNotNull();
  860. assertThat(result.inputFile("testx/ClassOneTest.xoo")).isNotNull();
  861. }
  862. @Test
  863. public void no_exclusion_when_scm_exclusions_is_disabled() {
  864. File projectDir = new File("test-resources/mediumtest/xoo/sample-with-ignored-file");
  865. AnalysisResult result = tester
  866. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  867. .property("sonar.scm.exclusions.disabled", "true")
  868. .property("sonar.exclusions", "**/*.xoo.ignore")
  869. .property("sonar.test.exclusions", "**/*.xoo.ignore")
  870. .execute();
  871. assertThat(result.inputFiles()).hasSize(4);
  872. assertThat(result.inputFile("xources/hello/ClassTwo.xoo")).isNotNull();
  873. assertThat(result.inputFile("testx/ClassTwoTest.xoo")).isNotNull();
  874. assertThat(result.inputFile("xources/hello/ClassOne.xoo")).isNotNull();
  875. assertThat(result.inputFile("testx/ClassOneTest.xoo")).isNotNull();
  876. }
  877. @Test
  878. public void index_basedir_by_default() throws IOException {
  879. File xooFile = new File(baseDir, "sample.xoo");
  880. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  881. AnalysisResult result = tester.newAnalysis()
  882. .properties(builder
  883. .build())
  884. .execute();
  885. assertThat(logTester.logs()).contains("1 file indexed");
  886. assertThat(result.inputFile("sample.xoo")).isNotNull();
  887. }
  888. }