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 42KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2020 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(String.join("\n", logTester.logs())).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()).containsAnyOf("'src/main/sample.java' indexed with no language", "'src\\main\\sample.java' indexed with no language");
  182. assertThat(logTester.logs()).contains("3 files indexed");
  183. assertThat(logTester.logs()).contains("'src/main/sample.xoo' generated metadata with charset 'UTF-8'");
  184. assertThat(logTester.logs()).doesNotContain("'src/main/sample.java' generated metadata", "'src\\main\\sample.java' generated metadata");
  185. assertThat(logTester.logs()).doesNotContain("'src/test/sample.java' generated metadata", "'src\\test\\sample.java' generated metadata");
  186. DefaultInputFile javaInputFile = (DefaultInputFile) result.inputFile("src/main/sample.java");
  187. thrown.expect(IllegalStateException.class);
  188. thrown.expectMessage("Unable to find report for component");
  189. result.getReportComponent(javaInputFile);
  190. }
  191. @Test
  192. public void createIssueOnAnyFile() throws IOException {
  193. tester
  194. .addRules(new XooRulesDefinition())
  195. .addActiveRule("xoo", "OneIssuePerUnknownFile", null, "OneIssuePerUnknownFile", "MAJOR", null, "xoo");
  196. File srcDir = new File(baseDir, "src");
  197. srcDir.mkdir();
  198. File xooFile = new File(srcDir, "sample.unknown");
  199. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  200. logTester.setLevel(LoggerLevel.DEBUG);
  201. AnalysisResult result = tester.newAnalysis()
  202. .properties(builder
  203. .put("sonar.sources", "src")
  204. .build())
  205. .execute();
  206. assertThat(logTester.logs()).contains("1 file indexed");
  207. assertThat(logTester.logs()).contains("'src" + File.separator + "sample.unknown' indexed with no language");
  208. assertThat(logTester.logs()).contains("'src/sample.unknown' generated metadata with charset 'UTF-8'");
  209. DefaultInputFile inputFile = (DefaultInputFile) result.inputFile("src/sample.unknown");
  210. assertThat(result.getReportComponent(inputFile)).isNotNull();
  211. }
  212. @Test
  213. public void lazyIssueExclusion() throws IOException {
  214. tester
  215. .addRules(new XooRulesDefinition())
  216. .addActiveRule("xoo", "OneIssuePerFile", null, "OneIssuePerFile", "MAJOR", null, "xoo");
  217. builder.put("sonar.issue.ignore.allfile", "1")
  218. .put("sonar.issue.ignore.allfile.1.fileRegexp", "pattern");
  219. File srcDir = new File(baseDir, "src");
  220. srcDir.mkdir();
  221. File xooFile = new File(srcDir, "sample.xoo");
  222. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  223. File unknownFile = new File(srcDir, "myfile.binary");
  224. byte[] b = new byte[512];
  225. new Random().nextBytes(b);
  226. FileUtils.writeByteArrayToFile(unknownFile, b);
  227. logTester.setLevel(LoggerLevel.DEBUG);
  228. tester.newAnalysis()
  229. .properties(builder
  230. .put("sonar.sources", "src")
  231. .build())
  232. .execute();
  233. assertThat(logTester.logs()).containsOnlyOnce("'src" + File.separator + "myfile.binary' indexed with no language");
  234. assertThat(logTester.logs()).doesNotContain("Evaluate issue exclusions for 'src/myfile.binary'");
  235. assertThat(logTester.logs()).containsOnlyOnce("Evaluate issue exclusions for 'src/sample.xoo'");
  236. }
  237. @Test
  238. public void preloadIssueExclusions() throws IOException {
  239. builder.put("sonar.issue.ignore.allfile", "1")
  240. .put("sonar.issue.ignore.allfile.1.fileRegexp", "pattern")
  241. .put("sonar.preloadFileMetadata", "true");
  242. File srcDir = new File(baseDir, "src");
  243. srcDir.mkdir();
  244. File xooFile = new File(srcDir, "sample.xoo");
  245. FileUtils.write(xooFile, "Sample xoo\npattern", StandardCharsets.UTF_8);
  246. File unknownFile = new File(srcDir, "myfile.binary");
  247. FileUtils.write(unknownFile, "some text", StandardCharsets.UTF_8);
  248. logTester.setLevel(LoggerLevel.DEBUG);
  249. tester.newAnalysis()
  250. .properties(builder
  251. .put("sonar.sources", "src")
  252. .build())
  253. .execute();
  254. assertThat(logTester.logs()).containsSequence("Evaluate issue exclusions for 'src/sample.xoo'",
  255. " - Exclusion pattern 'pattern': all issues in this file will be ignored.");
  256. }
  257. @Test
  258. public void publishFilesWithIssues() throws IOException {
  259. tester
  260. .addRules(new XooRulesDefinition())
  261. .addActiveRule("xoo", "OneIssueOnDirPerFile", null, "OneIssueOnDirPerFile", "MAJOR", null, "xoo");
  262. File srcDir = new File(baseDir, "src");
  263. srcDir.mkdir();
  264. File xooFile = new File(srcDir, "sample.xoo");
  265. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  266. AnalysisResult result = tester.newAnalysis()
  267. .properties(builder
  268. .put("sonar.sources", "src")
  269. .build())
  270. .execute();
  271. DefaultInputFile file = (DefaultInputFile) result.inputFile("src/sample.xoo");
  272. assertThat(file.isPublished()).isTrue();
  273. assertThat(result.getReportComponent(file)).isNotNull();
  274. }
  275. @Test
  276. public void scanProjectWithSourceDir() throws IOException {
  277. File srcDir = new File(baseDir, "src");
  278. srcDir.mkdir();
  279. File xooFile = new File(srcDir, "sample.xoo");
  280. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  281. AnalysisResult result = tester.newAnalysis()
  282. .properties(builder
  283. .put("sonar.sources", "src")
  284. .build())
  285. .execute();
  286. assertThat(result.inputFiles()).hasSize(1);
  287. assertThat(result.inputFile("src/sample.xoo").type()).isEqualTo(InputFile.Type.MAIN);
  288. assertThat(result.inputFile("src/sample.xoo").relativePath()).isEqualTo("src/sample.xoo");
  289. }
  290. @Test
  291. public void scanBigProject() throws IOException {
  292. File srcDir = new File(baseDir, "src");
  293. srcDir.mkdir();
  294. int nbFiles = 100;
  295. int ruleCount = 100000;
  296. for (int nb = 1; nb <= nbFiles; nb++) {
  297. File xooFile = new File(srcDir, "sample" + nb + ".xoo");
  298. FileUtils.write(xooFile, StringUtils.repeat(StringUtils.repeat("a", 100) + "\n", ruleCount / 1000));
  299. }
  300. AnalysisResult result = tester.newAnalysis()
  301. .properties(builder
  302. .put("sonar.sources", "src")
  303. .build())
  304. .execute();
  305. assertThat(result.inputFiles()).hasSize(100);
  306. }
  307. @Test
  308. public void scanProjectWithTestDir() throws IOException {
  309. File test = new File(baseDir, "test");
  310. test.mkdir();
  311. File xooFile = new File(test, "sampleTest.xoo");
  312. FileUtils.write(xooFile, "Sample test xoo\ncontent", StandardCharsets.UTF_8);
  313. AnalysisResult result = tester.newAnalysis()
  314. .properties(builder
  315. .put("sonar.sources", "")
  316. .put("sonar.tests", "test")
  317. .build())
  318. .execute();
  319. assertThat(result.inputFiles()).hasSize(1);
  320. assertThat(result.inputFile("test/sampleTest.xoo").type()).isEqualTo(InputFile.Type.TEST);
  321. }
  322. /**
  323. * SONAR-5419
  324. */
  325. @Test
  326. public void scanProjectWithMixedSourcesAndTests() throws IOException {
  327. File srcDir = new File(baseDir, "src");
  328. srcDir.mkdir();
  329. File xooFile = new File(srcDir, "sample.xoo");
  330. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  331. File xooFile2 = new File(baseDir, "another.xoo");
  332. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  333. File testDir = new File(baseDir, "test");
  334. testDir.mkdir();
  335. File xooTestFile = new File(baseDir, "sampleTest2.xoo");
  336. FileUtils.write(xooTestFile, "Sample test xoo\ncontent", StandardCharsets.UTF_8);
  337. File xooTestFile2 = new File(testDir, "sampleTest.xoo");
  338. FileUtils.write(xooTestFile2, "Sample test xoo 2\ncontent", StandardCharsets.UTF_8);
  339. AnalysisResult result = tester.newAnalysis()
  340. .properties(builder
  341. .put("sonar.sources", "src,another.xoo")
  342. .put("sonar.tests", "test,sampleTest2.xoo")
  343. .build())
  344. .execute();
  345. assertThat(result.inputFiles()).hasSize(4);
  346. }
  347. @Test
  348. public void fileInclusionsExclusions() throws IOException {
  349. File srcDir = new File(baseDir, "src");
  350. srcDir.mkdir();
  351. File xooFile = new File(srcDir, "sample.xoo");
  352. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  353. File xooFile2 = new File(baseDir, "another.xoo");
  354. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  355. File testDir = new File(baseDir, "test");
  356. testDir.mkdir();
  357. File xooTestFile = new File(baseDir, "sampleTest2.xoo");
  358. FileUtils.write(xooTestFile, "Sample test xoo\ncontent");
  359. File xooTestFile2 = new File(testDir, "sampleTest.xoo");
  360. FileUtils.write(xooTestFile2, "Sample test xoo 2\ncontent");
  361. AnalysisResult result = tester.newAnalysis()
  362. .properties(builder
  363. .put("sonar.sources", "src,another.xoo")
  364. .put("sonar.tests", "test,sampleTest2.xoo")
  365. .put("sonar.inclusions", "src/**")
  366. .put("sonar.exclusions", "**/another.*")
  367. .put("sonar.test.inclusions", "**/sampleTest*.*")
  368. .put("sonar.test.exclusions", "**/sampleTest2.xoo")
  369. .build())
  370. .execute();
  371. assertThat(result.inputFiles()).hasSize(2);
  372. }
  373. @Test
  374. public void test_inclusions_on_multi_modules() throws IOException {
  375. File baseDir = temp.getRoot();
  376. File baseDirModuleA = new File(baseDir, "moduleA");
  377. File baseDirModuleB = new File(baseDir, "moduleB");
  378. File srcDirA = new File(baseDirModuleA, "tests");
  379. srcDirA.mkdirs();
  380. File srcDirB = new File(baseDirModuleB, "tests");
  381. srcDirB.mkdirs();
  382. File xooFileA = new File(srcDirA, "sampleTestA.xoo");
  383. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  384. File xooFileB = new File(srcDirB, "sampleTestB.xoo");
  385. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  386. final ImmutableMap.Builder<String, String> builder = ImmutableMap.<String, String>builder()
  387. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  388. .put("sonar.projectKey", "com.foo.project")
  389. .put("sonar.sources", "")
  390. .put("sonar.tests", "tests")
  391. .put("sonar.modules", "moduleA,moduleB");
  392. AnalysisResult result = tester.newAnalysis()
  393. .properties(builder.build())
  394. .execute();
  395. assertThat(result.inputFiles()).hasSize(2);
  396. InputFile fileA = result.inputFile("moduleA/tests/sampleTestA.xoo");
  397. assertThat(fileA).isNotNull();
  398. InputFile fileB = result.inputFile("moduleB/tests/sampleTestB.xoo");
  399. assertThat(fileB).isNotNull();
  400. result = tester.newAnalysis()
  401. .properties(builder
  402. .put("sonar.test.inclusions", "moduleA/tests/**")
  403. .build())
  404. .execute();
  405. assertThat(result.inputFiles()).hasSize(1);
  406. fileA = result.inputFile("moduleA/tests/sampleTestA.xoo");
  407. assertThat(fileA).isNotNull();
  408. fileB = result.inputFile("moduleB/tests/sampleTestB.xoo");
  409. assertThat(fileB).isNull();
  410. }
  411. @Test
  412. public void test_module_level_inclusions_override_parent_on_multi_modules() throws IOException {
  413. File baseDir = temp.getRoot();
  414. File baseDirModuleA = new File(baseDir, "moduleA");
  415. File baseDirModuleB = new File(baseDir, "moduleB");
  416. File srcDirA = new File(baseDirModuleA, "src");
  417. srcDirA.mkdirs();
  418. File srcDirB = new File(baseDirModuleB, "src");
  419. srcDirB.mkdirs();
  420. File xooFileA = new File(srcDirA, "sampleA.xoo");
  421. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  422. File xooFileB = new File(srcDirB, "sampleB.xoo");
  423. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  424. final ImmutableMap.Builder<String, String> builder = ImmutableMap.<String, String>builder()
  425. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  426. .put("sonar.projectKey", "com.foo.project")
  427. .put("sonar.sources", "src")
  428. .put("sonar.modules", "moduleA,moduleB")
  429. .put("sonar.inclusions", "**/*.php");
  430. AnalysisResult result = tester.newAnalysis()
  431. .properties(builder.build())
  432. .execute();
  433. assertThat(result.inputFiles()).isEmpty();
  434. result = tester.newAnalysis()
  435. .properties(builder
  436. .put("moduleA.sonar.inclusions", "**/*.xoo")
  437. .build())
  438. .execute();
  439. assertThat(result.inputFiles()).hasSize(1);
  440. InputFile fileA = result.inputFile("moduleA/src/sampleA.xoo");
  441. assertThat(fileA).isNotNull();
  442. }
  443. @Test
  444. public void warn_user_for_outdated_scanner_side_inherited_exclusions_for_multi_module_project() throws IOException {
  445. File baseDir = temp.getRoot();
  446. File baseDirModuleA = new File(baseDir, "moduleA");
  447. File baseDirModuleB = new File(baseDir, "moduleB");
  448. File srcDirA = new File(baseDirModuleA, "src");
  449. srcDirA.mkdirs();
  450. File srcDirB = new File(baseDirModuleB, "src");
  451. srcDirB.mkdirs();
  452. File xooFileA = new File(srcDirA, "sample.xoo");
  453. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  454. File xooFileB = new File(srcDirB, "sample.xoo");
  455. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  456. AnalysisResult result = tester.newAnalysis()
  457. .properties(ImmutableMap.<String, String>builder()
  458. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  459. .put("sonar.projectKey", "com.foo.project")
  460. .put("sonar.sources", "src")
  461. .put("sonar.modules", "moduleA,moduleB")
  462. .put("sonar.exclusions", "src/sample.xoo")
  463. .build())
  464. .execute();
  465. InputFile fileA = result.inputFile("moduleA/src/sample.xoo");
  466. assertThat(fileA).isNull();
  467. InputFile fileB = result.inputFile("moduleB/src/sample.xoo");
  468. assertThat(fileB).isNull();
  469. assertThat(logTester.logs(LoggerLevel.WARN))
  470. .contains("Specifying module-relative paths at project level in the property 'sonar.exclusions' is deprecated. " +
  471. "To continue matching files like 'moduleA/src/sample.xoo', update this property so that patterns refer to project-relative paths.");
  472. }
  473. @Test
  474. public void support_global_server_side_exclusions_for_multi_module_project() throws IOException {
  475. File baseDir = temp.getRoot();
  476. File baseDirModuleA = new File(baseDir, "moduleA");
  477. File baseDirModuleB = new File(baseDir, "moduleB");
  478. File srcDirA = new File(baseDirModuleA, "src");
  479. srcDirA.mkdirs();
  480. File srcDirB = new File(baseDirModuleB, "src");
  481. srcDirB.mkdirs();
  482. File xooFileA = new File(srcDirA, "sample.xoo");
  483. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  484. File xooFileB = new File(srcDirB, "sample.xoo");
  485. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  486. tester.addGlobalServerSettings(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY, "**/*.xoo");
  487. AnalysisResult result = tester.newAnalysis()
  488. .properties(ImmutableMap.<String, String>builder()
  489. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  490. .put("sonar.projectKey", "com.foo.project")
  491. .put("sonar.sources", "src")
  492. .put("sonar.modules", "moduleA,moduleB")
  493. .build())
  494. .execute();
  495. InputFile fileA = result.inputFile("moduleA/src/sample.xoo");
  496. assertThat(fileA).isNull();
  497. InputFile fileB = result.inputFile("moduleB/src/sample.xoo");
  498. assertThat(fileB).isNull();
  499. }
  500. @Test
  501. public void support_global_server_side_global_exclusions_for_multi_module_project() throws IOException {
  502. File baseDir = temp.getRoot();
  503. File baseDirModuleA = new File(baseDir, "moduleA");
  504. File baseDirModuleB = new File(baseDir, "moduleB");
  505. File srcDirA = new File(baseDirModuleA, "src");
  506. srcDirA.mkdirs();
  507. File srcDirB = new File(baseDirModuleB, "src");
  508. srcDirB.mkdirs();
  509. File xooFileA = new File(srcDirA, "sample.xoo");
  510. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  511. File xooFileB = new File(srcDirB, "sample.xoo");
  512. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  513. tester.addGlobalServerSettings(CoreProperties.GLOBAL_EXCLUSIONS_PROPERTY, "**/*.xoo");
  514. AnalysisResult result = tester.newAnalysis()
  515. .properties(ImmutableMap.<String, String>builder()
  516. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  517. .put("sonar.projectKey", "com.foo.project")
  518. .put("sonar.sources", "src")
  519. .put("sonar.modules", "moduleA,moduleB")
  520. .build())
  521. .execute();
  522. InputFile fileA = result.inputFile("moduleA/src/sample.xoo");
  523. assertThat(fileA).isNull();
  524. InputFile fileB = result.inputFile("moduleB/src/sample.xoo");
  525. assertThat(fileB).isNull();
  526. }
  527. @Test
  528. public void warn_user_for_outdated_server_side_inherited_exclusions_for_multi_module_project() throws IOException {
  529. File baseDir = temp.getRoot();
  530. File baseDirModuleA = new File(baseDir, "moduleA");
  531. File baseDirModuleB = new File(baseDir, "moduleB");
  532. File srcDirA = new File(baseDirModuleA, "src");
  533. srcDirA.mkdirs();
  534. File srcDirB = new File(baseDirModuleB, "src");
  535. srcDirB.mkdirs();
  536. File xooFileA = new File(srcDirA, "sample.xoo");
  537. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  538. File xooFileB = new File(srcDirB, "sample.xoo");
  539. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  540. tester.addProjectServerSettings("sonar.exclusions", "src/sample.xoo");
  541. AnalysisResult result = tester.newAnalysis()
  542. .properties(ImmutableMap.<String, String>builder()
  543. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  544. .put("sonar.projectKey", "com.foo.project")
  545. .put("sonar.sources", "src")
  546. .put("sonar.modules", "moduleA,moduleB")
  547. .build())
  548. .execute();
  549. InputFile fileA = result.inputFile("moduleA/src/sample.xoo");
  550. assertThat(fileA).isNull();
  551. InputFile fileB = result.inputFile("moduleB/src/sample.xoo");
  552. assertThat(fileB).isNull();
  553. assertThat(logTester.logs(LoggerLevel.WARN))
  554. .contains("Specifying module-relative paths at project level in the property 'sonar.exclusions' is deprecated. " +
  555. "To continue matching files like 'moduleA/src/sample.xoo', update this property so that patterns refer to project-relative paths.");
  556. }
  557. @Test
  558. public void failForDuplicateInputFile() throws IOException {
  559. File srcDir = new File(baseDir, "src");
  560. srcDir.mkdir();
  561. File xooFile = new File(srcDir, "sample.xoo");
  562. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  563. thrown.expect(MessageException.class);
  564. 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");
  565. tester.newAnalysis()
  566. .properties(builder
  567. .put("sonar.sources", "src,src/sample.xoo")
  568. .build())
  569. .execute();
  570. }
  571. // SONAR-9574
  572. @Test
  573. public void failForDuplicateInputFileInDifferentModules() throws IOException {
  574. File srcDir = new File(baseDir, "module1/src");
  575. srcDir.mkdir();
  576. File xooFile = new File(srcDir, "sample.xoo");
  577. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  578. thrown.expect(MessageException.class);
  579. 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");
  580. tester.newAnalysis()
  581. .properties(builder
  582. .put("sonar.sources", "module1/src")
  583. .put("sonar.modules", "module1")
  584. .put("module1.sonar.sources", "src")
  585. .build())
  586. .execute();
  587. }
  588. // SONAR-5330
  589. @Test
  590. public void scanProjectWithSourceSymlink() {
  591. assumeTrue(!System2.INSTANCE.isOsWindows());
  592. File projectDir = new File("test-resources/mediumtest/xoo/sample-with-symlink");
  593. AnalysisResult result = tester
  594. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  595. .property("sonar.exclusions", "**/*.xoo.measures,**/*.xoo.scm")
  596. .property("sonar.test.exclusions", "**/*.xoo.measures,**/*.xoo.scm")
  597. .execute();
  598. assertThat(result.inputFiles()).hasSize(3);
  599. // check that symlink was not resolved to target
  600. assertThat(result.inputFiles()).extractingResultOf("path").toString().startsWith(projectDir.toString());
  601. }
  602. // SONAR-6719
  603. @Test
  604. public void scanProjectWithWrongCase() {
  605. // To please the quality gate, don't use assumeTrue, or the test will be reported as skipped
  606. File projectDir = new File("test-resources/mediumtest/xoo/sample");
  607. ScannerMediumTester.AnalysisBuilder analysis = tester
  608. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  609. .property("sonar.sources", "XOURCES")
  610. .property("sonar.tests", "TESTX");
  611. if (System2.INSTANCE.isOsWindows()) { // Windows is file path case-insensitive
  612. AnalysisResult result = analysis.execute();
  613. assertThat(result.inputFiles()).hasSize(8);
  614. assertThat(result.inputFiles()).extractingResultOf("relativePath").containsOnly(
  615. "testx/ClassOneTest.xoo.measures",
  616. "xources/hello/helloscala.xoo.measures",
  617. "xources/hello/HelloJava.xoo.measures",
  618. "testx/ClassOneTest.xoo",
  619. "xources/hello/HelloJava.xoo.scm",
  620. "xources/hello/helloscala.xoo",
  621. "testx/ClassOneTest.xoo.scm",
  622. "xources/hello/HelloJava.xoo");
  623. } else if (System2.INSTANCE.isOsMac()) {
  624. AnalysisResult result = analysis.execute();
  625. assertThat(result.inputFiles()).hasSize(8);
  626. assertThat(result.inputFiles()).extractingResultOf("relativePath").containsOnly(
  627. "TESTX/ClassOneTest.xoo.measures",
  628. "XOURCES/hello/helloscala.xoo.measures",
  629. "XOURCES/hello/HelloJava.xoo.measures",
  630. "TESTX/ClassOneTest.xoo",
  631. "XOURCES/hello/HelloJava.xoo.scm",
  632. "XOURCES/hello/helloscala.xoo",
  633. "TESTX/ClassOneTest.xoo.scm",
  634. "XOURCES/hello/HelloJava.xoo");
  635. } else {
  636. thrown.expect(MessageException.class);
  637. thrown.expectMessage("The folder 'TESTX' does not exist for 'sample'");
  638. analysis.execute();
  639. }
  640. }
  641. @Test
  642. public void indexAnyFile() throws IOException {
  643. File srcDir = new File(baseDir, "src");
  644. srcDir.mkdir();
  645. File xooFile = new File(srcDir, "sample.xoo");
  646. FileUtils.write(xooFile, "Sample xoo\ncontent");
  647. File otherFile = new File(srcDir, "sample.other");
  648. FileUtils.write(otherFile, "Sample other\ncontent");
  649. AnalysisResult result = tester.newAnalysis()
  650. .properties(builder
  651. .put("sonar.sources", "src")
  652. .build())
  653. .execute();
  654. assertThat(result.inputFiles()).hasSize(2);
  655. assertThat(result.inputFile("src/sample.other").type()).isEqualTo(InputFile.Type.MAIN);
  656. assertThat(result.inputFile("src/sample.other").relativePath()).isEqualTo("src/sample.other");
  657. assertThat(result.inputFile("src/sample.other").language()).isNull();
  658. }
  659. @Test
  660. public void scanMultiModuleProject() {
  661. File projectDir = new File("test-resources/mediumtest/xoo/multi-modules-sample");
  662. AnalysisResult result = tester
  663. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  664. .execute();
  665. assertThat(result.inputFiles()).hasSize(4);
  666. }
  667. @Test
  668. public void deprecated_global_sensor_should_see_project_relative_paths() {
  669. File projectDir = new File("test-resources/mediumtest/xoo/multi-modules-sample");
  670. AnalysisResult result = tester
  671. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  672. .property(DeprecatedGlobalSensor.ENABLE_PROP, "true")
  673. .execute();
  674. assertThat(result.inputFiles()).hasSize(4);
  675. assertThat(logTester.logs(LoggerLevel.INFO)).contains(
  676. "Deprecated Global Sensor: module_a/module_a1/src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo",
  677. "Deprecated Global Sensor: module_a/module_a2/src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo",
  678. "Deprecated Global Sensor: module_b/module_b1/src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo",
  679. "Deprecated Global Sensor: module_b/module_b2/src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo");
  680. }
  681. @Test
  682. public void global_sensor_should_see_project_relative_paths() {
  683. File projectDir = new File("test-resources/mediumtest/xoo/multi-modules-sample");
  684. AnalysisResult result = tester
  685. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  686. .property(GlobalProjectSensor.ENABLE_PROP, "true")
  687. .execute();
  688. assertThat(result.inputFiles()).hasSize(4);
  689. assertThat(logTester.logs(LoggerLevel.INFO)).contains(
  690. "Global Sensor: module_a/module_a1/src/main/xoo/com/sonar/it/samples/modules/a1/HelloA1.xoo",
  691. "Global Sensor: module_a/module_a2/src/main/xoo/com/sonar/it/samples/modules/a2/HelloA2.xoo",
  692. "Global Sensor: module_b/module_b1/src/main/xoo/com/sonar/it/samples/modules/b1/HelloB1.xoo",
  693. "Global Sensor: module_b/module_b2/src/main/xoo/com/sonar/it/samples/modules/b2/HelloB2.xoo");
  694. }
  695. @Test
  696. public void scanProjectWithCommaInSourcePath() throws IOException {
  697. File srcDir = new File(baseDir, "src");
  698. srcDir.mkdir();
  699. File xooFile = new File(srcDir, "sample,1.xoo");
  700. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  701. File xooFile2 = new File(baseDir, "another,2.xoo");
  702. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  703. File testDir = new File(baseDir, "test");
  704. testDir.mkdir();
  705. File xooTestFile = new File(testDir, "sampleTest,1.xoo");
  706. FileUtils.write(xooTestFile, "Sample test xoo\ncontent", StandardCharsets.UTF_8);
  707. File xooTestFile2 = new File(baseDir, "sampleTest,2.xoo");
  708. FileUtils.write(xooTestFile2, "Sample test xoo 2\ncontent", StandardCharsets.UTF_8);
  709. AnalysisResult result = tester.newAnalysis()
  710. .properties(builder
  711. .put("sonar.sources", "src,\"another,2.xoo\"")
  712. .put("sonar.tests", "\"test\",\"sampleTest,2.xoo\"")
  713. .build())
  714. .execute();
  715. assertThat(result.inputFiles()).hasSize(4);
  716. }
  717. @Test
  718. public void twoLanguagesWithSameExtension() throws IOException {
  719. File srcDir = new File(baseDir, "src");
  720. srcDir.mkdir();
  721. File xooFile = new File(srcDir, "sample.xoo");
  722. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  723. File xooFile2 = new File(srcDir, "sample.xoo2");
  724. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  725. AnalysisResult result = tester.newAnalysis()
  726. .properties(builder
  727. .put("sonar.sources", "src")
  728. .build())
  729. .execute();
  730. assertThat(result.inputFiles()).hasSize(2);
  731. try {
  732. result = tester.newAnalysis()
  733. .properties(builder
  734. .put("sonar.lang.patterns.xoo2", "**/*.xoo")
  735. .build())
  736. .execute();
  737. } catch (Exception e) {
  738. assertThat(e)
  739. .isInstanceOf(MessageException.class)
  740. .hasMessage(
  741. "Language of file 'src" + File.separator
  742. + "sample.xoo' can not be decided as the file matches patterns of both sonar.lang.patterns.xoo : **/*.xoo and sonar.lang.patterns.xoo2 : **/*.xoo");
  743. }
  744. // SONAR-9561
  745. result = tester.newAnalysis()
  746. .properties(builder
  747. .put("sonar.exclusions", "**/sample.xoo")
  748. .build())
  749. .execute();
  750. assertThat(result.inputFiles()).hasSize(1);
  751. }
  752. @Test
  753. public void log_all_exclusions_properties_per_modules() throws IOException {
  754. File baseDir = temp.getRoot();
  755. File baseDirModuleA = new File(baseDir, "moduleA");
  756. File baseDirModuleB = new File(baseDir, "moduleB");
  757. File srcDirA = new File(baseDirModuleA, "src");
  758. srcDirA.mkdirs();
  759. File srcDirB = new File(baseDirModuleB, "src");
  760. srcDirB.mkdirs();
  761. File xooFileA = new File(srcDirA, "sample.xoo");
  762. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  763. File xooFileB = new File(srcDirB, "sample.xoo");
  764. FileUtils.write(xooFileB, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  765. AnalysisResult result = tester.newAnalysis()
  766. .properties(ImmutableMap.<String, String>builder()
  767. .put("sonar.projectBaseDir", baseDir.getAbsolutePath())
  768. .put("sonar.projectKey", "com.foo.project")
  769. .put("sonar.sources", "src")
  770. .put("sonar.modules", "moduleA,moduleB")
  771. .put("sonar.inclusions", "**/global.inclusions")
  772. .put("sonar.test.inclusions", "**/global.test.inclusions")
  773. .put("sonar.exclusions", "**/global.exclusions")
  774. .put("sonar.test.exclusions", "**/global.test.exclusions")
  775. .put("sonar.coverage.exclusions", "**/coverage.exclusions")
  776. .put("sonar.cpd.exclusions", "**/cpd.exclusions")
  777. .build())
  778. .execute();
  779. assertThat(logTester.logs(LoggerLevel.INFO))
  780. .containsSequence("Indexing files...",
  781. "Project configuration:",
  782. " Included sources: **/global.inclusions",
  783. " Excluded sources: **/global.exclusions, **/global.test.inclusions",
  784. " Included tests: **/global.test.inclusions",
  785. " Excluded tests: **/global.test.exclusions",
  786. " Excluded sources for coverage: **/coverage.exclusions",
  787. " Excluded sources for duplication: **/cpd.exclusions",
  788. "Indexing files of module 'moduleA'",
  789. " Base dir: " + baseDirModuleA.getAbsolutePath(),
  790. " Source paths: src",
  791. " Included sources: **/global.inclusions",
  792. " Excluded sources: **/global.exclusions, **/global.test.inclusions",
  793. " Included tests: **/global.test.inclusions",
  794. " Excluded tests: **/global.test.exclusions",
  795. " Excluded sources for coverage: **/coverage.exclusions",
  796. " Excluded sources for duplication: **/cpd.exclusions",
  797. "Indexing files of module 'moduleB'",
  798. " Base dir: " + baseDirModuleB.getAbsolutePath(),
  799. " Source paths: src",
  800. " Included sources: **/global.inclusions",
  801. " Excluded sources: **/global.exclusions, **/global.test.inclusions",
  802. " Included tests: **/global.test.inclusions",
  803. " Excluded tests: **/global.test.exclusions",
  804. " Excluded sources for coverage: **/coverage.exclusions",
  805. " Excluded sources for duplication: **/cpd.exclusions",
  806. "Indexing files of module 'com.foo.project'",
  807. " Base dir: " + baseDir.getAbsolutePath(),
  808. " Included sources: **/global.inclusions",
  809. " Excluded sources: **/global.exclusions, **/global.test.inclusions",
  810. " Included tests: **/global.test.inclusions",
  811. " Excluded tests: **/global.test.exclusions",
  812. " Excluded sources for coverage: **/coverage.exclusions",
  813. " Excluded sources for duplication: **/cpd.exclusions");
  814. }
  815. @Test
  816. public void ignore_files_outside_project_basedir() throws IOException {
  817. File srcDir = new File(baseDir, "src");
  818. srcDir.mkdir();
  819. File xooFile = new File(srcDir, "sample1.xoo");
  820. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  821. File outsideBaseDir = temp.newFolder().getCanonicalFile();
  822. File xooFile2 = new File(outsideBaseDir, "another.xoo");
  823. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  824. AnalysisResult result = tester.newAnalysis()
  825. .properties(builder
  826. .put("sonar.sources", "src," + PathUtils.canonicalPath(xooFile2))
  827. .build())
  828. .execute();
  829. assertThat(result.inputFiles()).hasSize(1);
  830. assertThat(logTester.logs(LoggerLevel.WARN)).contains("File '" + xooFile2.getAbsolutePath() + "' is ignored. It is not located in project basedir '" + baseDir + "'.");
  831. }
  832. @Test
  833. public void dont_log_warn_about_files_out_of_basedir_if_they_arent_included() throws IOException {
  834. File srcDir = new File(baseDir, "src");
  835. srcDir.mkdir();
  836. File xooFile = new File(srcDir, "sample1.xoo");
  837. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  838. File outsideBaseDir = temp.newFolder().getCanonicalFile();
  839. File xooFile2 = new File(outsideBaseDir, "another.xoo");
  840. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  841. AnalysisResult result = tester.newAnalysis()
  842. .properties(builder
  843. .put("sonar.sources", "src," + PathUtils.canonicalPath(xooFile2))
  844. .put("sonar.inclusions", "**/sample1.xoo")
  845. .build())
  846. .execute();
  847. assertThat(result.inputFiles()).hasSize(1);
  848. assertThat(logTester.logs(LoggerLevel.WARN)).doesNotContain("File '" + xooFile2.getAbsolutePath() + "' is ignored. It is not located in project basedir '" + baseDir + "'.");
  849. }
  850. @Test
  851. public void ignore_files_outside_module_basedir() throws IOException {
  852. File moduleA = new File(baseDir, "moduleA");
  853. moduleA.mkdir();
  854. File xooFileA = new File(moduleA, "src/sampleA.xoo");
  855. FileUtils.write(xooFileA, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  856. File xooFile2 = new File(baseDir, "another.xoo");
  857. FileUtils.write(xooFile2, "Sample xoo 2\ncontent", StandardCharsets.UTF_8);
  858. AnalysisResult result = tester.newAnalysis()
  859. .properties(builder
  860. .put("sonar.modules", "moduleA")
  861. .put("moduleA.sonar.sources", "src," + PathUtils.canonicalPath(xooFile2))
  862. .build())
  863. .execute();
  864. assertThat(result.inputFiles()).hasSize(1);
  865. assertThat(logTester.logs(LoggerLevel.WARN))
  866. .contains("File '" + xooFile2.getAbsolutePath() + "' is ignored. It is not located in module basedir '" + new File(baseDir, "moduleA") + "'.");
  867. }
  868. @Test
  869. public void exclusion_based_on_scm_info() {
  870. File projectDir = new File("test-resources/mediumtest/xoo/sample-with-ignored-file");
  871. AnalysisResult result = tester
  872. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  873. .property("sonar.exclusions", "**/*.xoo.ignore")
  874. .property("sonar.test.exclusions", "**/*.xoo.ignore")
  875. .execute();
  876. assertThat(result.inputFile("xources/hello/ClassTwo.xoo")).isNull();
  877. assertThat(result.inputFile("testx/ClassTwoTest.xoo")).isNull();
  878. assertThat(result.inputFile("xources/hello/ClassOne.xoo")).isNotNull();
  879. assertThat(result.inputFile("testx/ClassOneTest.xoo")).isNotNull();
  880. }
  881. @Test
  882. public void no_exclusion_when_scm_exclusions_is_disabled() {
  883. File projectDir = new File("test-resources/mediumtest/xoo/sample-with-ignored-file");
  884. AnalysisResult result = tester
  885. .newAnalysis(new File(projectDir, "sonar-project.properties"))
  886. .property("sonar.scm.exclusions.disabled", "true")
  887. .property("sonar.exclusions", "**/*.xoo.ignore")
  888. .property("sonar.test.exclusions", "**/*.xoo.ignore")
  889. .execute();
  890. assertThat(result.inputFiles()).hasSize(4);
  891. assertThat(result.inputFile("xources/hello/ClassTwo.xoo")).isNotNull();
  892. assertThat(result.inputFile("testx/ClassTwoTest.xoo")).isNotNull();
  893. assertThat(result.inputFile("xources/hello/ClassOne.xoo")).isNotNull();
  894. assertThat(result.inputFile("testx/ClassOneTest.xoo")).isNotNull();
  895. }
  896. @Test
  897. public void index_basedir_by_default() throws IOException {
  898. File xooFile = new File(baseDir, "sample.xoo");
  899. FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8);
  900. AnalysisResult result = tester.newAnalysis()
  901. .properties(builder
  902. .build())
  903. .execute();
  904. assertThat(logTester.logs()).contains("1 file indexed");
  905. assertThat(result.inputFile("sample.xoo")).isNotNull();
  906. }
  907. }