diff options
Diffstat (limited to 'sonar-batch')
16 files changed, 14 insertions, 624 deletions
diff --git a/sonar-batch/pom.xml b/sonar-batch/pom.xml index fdc637497e1..9c5ab4e2156 100644 --- a/sonar-batch/pom.xml +++ b/sonar-batch/pom.xml @@ -32,7 +32,6 @@ <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> - <dependency> <groupId>org.codehaus.sonar</groupId> <artifactId>sonar-core</artifactId> @@ -117,29 +116,11 @@ </dependency> <dependency> <groupId>org.codehaus.sonar</groupId> - <artifactId>sonar-core</artifactId> - <type>test-jar</type> - <scope>test</scope> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.dbunit</groupId> - <artifactId>dbunit</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.codehaus.sonar</groupId> <artifactId>sonar-java-api</artifactId> <scope>test</scope> </dependency> <dependency> - <!-- local database --> - <groupId>com.h2database</groupId> - <artifactId>h2</artifactId> - <scope>test</scope> - </dependency> - <dependency> <groupId>com.google.code.bean-matchers</groupId> <artifactId>bean-matchers</artifactId> <scope>test</scope> diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchComponents.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchComponents.java index 353bf44c9c7..ae4a35f7162 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchComponents.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchComponents.java @@ -49,7 +49,7 @@ import org.sonar.batch.scm.ScmSensor; import org.sonar.batch.source.CodeColorizerSensor; import org.sonar.batch.source.LinesSensor; import org.sonar.core.config.CorePropertyDefinitions; -import org.sonar.core.resource.DefaultResourceTypes; +import org.sonar.core.component.DefaultResourceTypes; public class BatchComponents { private BatchComponents() { diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginInstaller.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginInstaller.java index 55cec2910ed..3310365a856 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginInstaller.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchPluginInstaller.java @@ -34,8 +34,8 @@ import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.api.utils.log.Profiler; import org.sonar.core.platform.PluginInfo; -import org.sonar.core.plugins.RemotePlugin; -import org.sonar.core.plugins.RemotePluginFile; +import org.sonar.core.platform.RemotePlugin; +import org.sonar.core.platform.RemotePluginFile; import org.sonar.home.cache.FileCache; /** diff --git a/sonar-batch/src/main/java/org/sonar/batch/cpd/index/DbDuplicationsIndex.java b/sonar-batch/src/main/java/org/sonar/batch/cpd/index/DbDuplicationsIndex.java deleted file mode 100644 index 5e2908d23f0..00000000000 --- a/sonar-batch/src/main/java/org/sonar/batch/cpd/index/DbDuplicationsIndex.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2014 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * SonarQube is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.batch.cpd.index; - -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.internal.DefaultInputFile; -import org.sonar.batch.index.BatchComponentCache; -import org.sonar.core.duplication.DuplicationUnitDto; -import org.sonar.duplications.block.Block; -import org.sonar.duplications.block.ByteArray; - -public class DbDuplicationsIndex { - - private final Map<ByteArray, Collection<Block>> cache = Maps.newHashMap(); - - private final BatchComponentCache resourceCache; - - public DbDuplicationsIndex(BatchComponentCache resourceCache) { - this.resourceCache = resourceCache; - } - - int getSnapshotIdFor(InputFile inputFile) { - return resourceCache.get(((DefaultInputFile) inputFile).key()).snapshotId(); - } - - public void prepareCache(InputFile inputFile) { - List<DuplicationUnitDto> units = new ArrayList<>(); - cache.clear(); - // TODO Godin: maybe remove conversion of units to blocks? - for (DuplicationUnitDto unit : units) { - String hash = unit.getHash(); - String resourceKey = unit.getResourceKey(); - int indexInFile = unit.getIndexInFile(); - int startLine = unit.getStartLine(); - int endLine = unit.getEndLine(); - - // TODO Godin: in fact we could work directly with id instead of key - this will allow to decrease memory consumption - Block block = Block.builder() - .setResourceId(resourceKey) - .setBlockHash(new ByteArray(hash)) - .setIndexInFile(indexInFile) - .setLines(startLine, endLine) - .build(); - - // Group blocks by hash - Collection<Block> sameHash = cache.get(block.getBlockHash()); - if (sameHash == null) { - sameHash = Lists.newArrayList(); - cache.put(block.getBlockHash(), sameHash); - } - sameHash.add(block); - } - } - - public Collection<Block> getByHash(ByteArray hash) { - Collection<Block> result = cache.get(hash); - if (result != null) { - return result; - } else { - return Collections.emptyList(); - } - } - - public void insert(InputFile inputFile, Collection<Block> blocks) { - int resourceSnapshotId = getSnapshotIdFor(inputFile); - - // TODO Godin: maybe remove conversion of blocks to units? - List<DuplicationUnitDto> units = Lists.newArrayList(); - for (Block block : blocks) { - DuplicationUnitDto unit = new DuplicationUnitDto( - // TODO batch is no more creating snapshot - null, - resourceSnapshotId, - block.getBlockHash().toString(), - block.getIndexInFile(), - block.getStartLine(), - block.getEndLine()); - units.add(unit); - } - } - -} diff --git a/sonar-batch/src/main/java/org/sonar/batch/cpd/index/SonarDuplicationsIndex.java b/sonar-batch/src/main/java/org/sonar/batch/cpd/index/SonarDuplicationsIndex.java index dacedc06b74..ab583d672dd 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/cpd/index/SonarDuplicationsIndex.java +++ b/sonar-batch/src/main/java/org/sonar/batch/cpd/index/SonarDuplicationsIndex.java @@ -19,7 +19,7 @@ */ package org.sonar.batch.cpd.index; -import com.google.common.collect.Lists; +import java.util.Collection; import org.sonar.api.batch.fs.InputFile; import org.sonar.duplications.block.Block; import org.sonar.duplications.block.ByteArray; @@ -27,47 +27,23 @@ import org.sonar.duplications.index.AbstractCloneIndex; import org.sonar.duplications.index.CloneIndex; import org.sonar.duplications.index.PackedMemoryCloneIndex; -import java.util.Collection; -import java.util.List; - public class SonarDuplicationsIndex extends AbstractCloneIndex { private final CloneIndex mem = new PackedMemoryCloneIndex(); - private final DbDuplicationsIndex db; - - public SonarDuplicationsIndex() { - this.db = null; - } - - public SonarDuplicationsIndex(DbDuplicationsIndex db) { - this.db = db; - } public void insert(InputFile inputFile, Collection<Block> blocks) { for (Block block : blocks) { mem.insert(block); } - if (db != null) { - db.insert(inputFile, blocks); - } } public Collection<Block> getByInputFile(InputFile inputFile, String resourceKey) { - if (db != null) { - db.prepareCache(inputFile); - } return mem.getByResourceId(resourceKey); } @Override public Collection<Block> getBySequenceHash(ByteArray hash) { - if (db == null) { - return mem.getBySequenceHash(hash); - } else { - List<Block> result = Lists.newArrayList(mem.getBySequenceHash(hash)); - result.addAll(db.getByHash(hash)); - return result; - } + return mem.getBySequenceHash(hash); } @Override diff --git a/sonar-batch/src/main/java/org/sonar/batch/issue/tracking/ServerIssueFromDb.java b/sonar-batch/src/main/java/org/sonar/batch/issue/tracking/ServerIssueFromDb.java deleted file mode 100644 index d858d3a745f..00000000000 --- a/sonar-batch/src/main/java/org/sonar/batch/issue/tracking/ServerIssueFromDb.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2014 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * SonarQube is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.batch.issue.tracking; - -import org.sonar.api.rule.RuleKey; -import org.sonar.core.issue.db.IssueDto; - -public class ServerIssueFromDb implements ServerIssue { - - private IssueDto dto; - - public ServerIssueFromDb(IssueDto dto) { - this.dto = dto; - } - - public IssueDto getDto() { - return dto; - } - - @Override - public String key() { - return dto.getKee(); - } - - @Override - public RuleKey ruleKey() { - return dto.getRuleKey(); - } - - @Override - public String checksum() { - return dto.getChecksum(); - } - - @Override - public Integer line() { - return dto.getLine(); - } - - @Override - public String message() { - return dto.getMessage(); - } - -} diff --git a/sonar-batch/src/main/java/org/sonar/batch/rule/UsedQProfiles.java b/sonar-batch/src/main/java/org/sonar/batch/rule/UsedQProfiles.java index 15a6d3cd3ae..e2911b382d5 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/rule/UsedQProfiles.java +++ b/sonar-batch/src/main/java/org/sonar/batch/rule/UsedQProfiles.java @@ -25,7 +25,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.sonar.api.utils.text.JsonWriter; -import org.sonar.core.UtcDateUtils; +import org.sonar.core.util.UtcDateUtils; import javax.annotation.concurrent.Immutable; diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java index a224d4a3fb8..0d844339fba 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java @@ -19,8 +19,6 @@ */ package org.sonar.batch.scan; -import org.sonar.batch.bootstrap.ProjectTempFolderProvider; - import com.google.common.annotations.VisibleForTesting; import org.sonar.api.CoreProperties; import org.sonar.api.batch.InstantiationStrategy; @@ -41,6 +39,7 @@ import org.sonar.batch.bootstrap.ExtensionInstaller; import org.sonar.batch.bootstrap.ExtensionMatcher; import org.sonar.batch.bootstrap.ExtensionUtils; import org.sonar.batch.bootstrap.MetricProvider; +import org.sonar.batch.bootstrap.ProjectTempFolderProvider; import org.sonar.batch.bootstrapper.EnvironmentInformation; import org.sonar.batch.deprecated.components.DefaultResourceCreationLock; import org.sonar.batch.duplication.DuplicationCache; @@ -77,7 +76,6 @@ import org.sonar.batch.test.TestableBuilder; import org.sonar.core.issue.IssueUpdater; import org.sonar.core.issue.workflow.FunctionExecutor; import org.sonar.core.issue.workflow.IssueWorkflow; -import org.sonar.core.permission.PermissionFacade; import org.sonar.core.platform.ComponentContainer; public class ProjectScanContainer extends ComponentContainer { @@ -131,7 +129,6 @@ public class ProjectScanContainer extends ComponentContainer { EventBus.class, PhasesTimeProfiler.class, ResourceTypes.class, - PermissionFacade.class, DefaultProjectTree.class, ProjectExclusions.class, ProjectReactorValidator.class, diff --git a/sonar-batch/src/main/resources/org/sonar/batch/bootstrapper/logback.xml b/sonar-batch/src/main/resources/org/sonar/batch/bootstrapper/logback.xml index 4cda7344a24..99f956e4b4c 100644 --- a/sonar-batch/src/main/resources/org/sonar/batch/bootstrapper/logback.xml +++ b/sonar-batch/src/main/resources/org/sonar/batch/bootstrapper/logback.xml @@ -24,7 +24,7 @@ </logger> <!-- sonar.showSql --> - <!-- see also org.sonar.core.persistence.MyBatis#configureLogback() --> + <!-- see also org.sonar.db.MyBatis#configureLogback() --> <logger name="org.mybatis"> <level value="${SQL_LOGGER_LEVEL:-WARN}"/> </logger> diff --git a/sonar-batch/src/main/resources/org/sonar/batch/logback.xml b/sonar-batch/src/main/resources/org/sonar/batch/logback.xml index 8efa6dfeaad..198cd9c1bc6 100644 --- a/sonar-batch/src/main/resources/org/sonar/batch/logback.xml +++ b/sonar-batch/src/main/resources/org/sonar/batch/logback.xml @@ -20,7 +20,7 @@ </logger> <!-- sonar.showSql --> - <!-- see also org.sonar.core.persistence.MyBatis#configureLogback() --> + <!-- see also org.sonar.db.MyBatis#configureLogback() --> <logger name="org.apache.ibatis"> <level value="WARN"/> </logger> diff --git a/sonar-batch/src/test/java/org/sonar/batch/ProjectConfiguratorTest.java b/sonar-batch/src/test/java/org/sonar/batch/ProjectConfiguratorTest.java index 38305cc1c30..a892e726d1e 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/ProjectConfiguratorTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/ProjectConfiguratorTest.java @@ -27,13 +27,12 @@ import org.sonar.api.CoreProperties; import org.sonar.api.config.Settings; import org.sonar.api.resources.Project; import org.sonar.api.utils.System2; -import org.sonar.jpa.test.AbstractDbUnitTestCase; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class ProjectConfiguratorTest extends AbstractDbUnitTestCase { +public class ProjectConfiguratorTest { System2 system2; diff --git a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginInstallerTest.java b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginInstallerTest.java index 319f056dda1..c8d2e367475 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginInstallerTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/bootstrap/BatchPluginInstallerTest.java @@ -23,7 +23,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; -import org.sonar.core.plugins.RemotePlugin; +import org.sonar.core.platform.RemotePlugin; import org.sonar.home.cache.FileCache; import java.io.File; diff --git a/sonar-batch/src/test/java/org/sonar/batch/issue/tracking/IssueTrackingTest.java b/sonar-batch/src/test/java/org/sonar/batch/issue/tracking/IssueTrackingTest.java deleted file mode 100644 index 616c7fb6ed4..00000000000 --- a/sonar-batch/src/test/java/org/sonar/batch/issue/tracking/IssueTrackingTest.java +++ /dev/null @@ -1,391 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2014 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * SonarQube is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -package org.sonar.batch.issue.tracking; - -import com.google.common.collect.Lists; -import com.google.common.io.Resources; -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.fs.internal.DefaultInputFile; -import org.sonar.api.issue.Issue; -import org.sonar.core.issue.DefaultIssue; -import org.sonar.api.resources.Project; -import org.sonar.api.resources.Resource; -import org.sonar.api.rule.RuleKey; -import org.sonar.core.issue.db.IssueDto; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collections; - -import static com.google.common.collect.Lists.newArrayList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verifyZeroInteractions; -import static org.mockito.Mockito.when; - -public class IssueTrackingTest { - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - IssueTracking tracking; - Resource project; - SourceHashHolder sourceHashHolder; - ServerLineHashesLoader lastSnapshots; - long violationId = 0; - - @Before - public void before() { - lastSnapshots = mock(ServerLineHashesLoader.class); - - project = mock(Project.class); - tracking = new IssueTracking(); - } - - @Test - public void key_should_be_the_prioritary_field_to_check() { - ServerIssueFromDb referenceIssue1 = newReferenceIssue("message", 10, "squid", "AvoidCycle", "checksum1"); - referenceIssue1.getDto().setKee("100"); - ServerIssueFromDb referenceIssue2 = newReferenceIssue("message", 10, "squid", "AvoidCycle", "checksum2"); - referenceIssue2.getDto().setKee("200"); - - // exactly the fields of referenceIssue1 but not the same key - DefaultIssue newIssue = newDefaultIssue("message", 10, RuleKey.of("squid", "AvoidCycle"), "checksum1").setKey("200"); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues(newArrayList(newIssue), Lists.<ServerIssue>newArrayList(referenceIssue1, referenceIssue2), null, result); - // same key - assertThat(result.matching(newIssue)).isSameAs(referenceIssue2); - } - - @Test - public void checksum_should_have_greater_priority_than_line() { - ServerIssue referenceIssue1 = newReferenceIssue("message", 1, "squid", "AvoidCycle", "checksum1"); - ServerIssue referenceIssue2 = newReferenceIssue("message", 3, "squid", "AvoidCycle", "checksum2"); - - DefaultIssue newIssue1 = newDefaultIssue("message", 3, RuleKey.of("squid", "AvoidCycle"), "checksum1"); - DefaultIssue newIssue2 = newDefaultIssue("message", 5, RuleKey.of("squid", "AvoidCycle"), "checksum2"); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues(newArrayList(newIssue1, newIssue2), newArrayList(referenceIssue1, referenceIssue2), null, result); - assertThat(result.matching(newIssue1)).isSameAs(referenceIssue1); - assertThat(result.matching(newIssue2)).isSameAs(referenceIssue2); - } - - /** - * SONAR-2928 - */ - @Test - public void same_rule_and_null_line_and_checksum_but_different_messages() { - DefaultIssue newIssue = newDefaultIssue("new message", null, RuleKey.of("squid", "AvoidCycle"), "checksum1"); - ServerIssue referenceIssue = newReferenceIssue("old message", null, "squid", "AvoidCycle", "checksum1"); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues(newArrayList(newIssue), newArrayList(referenceIssue), null, result); - assertThat(result.matching(newIssue)).isSameAs(referenceIssue); - } - - @Test - public void same_rule_and_line_and_checksum_but_different_messages() { - DefaultIssue newIssue = newDefaultIssue("new message", 1, RuleKey.of("squid", "AvoidCycle"), "checksum1"); - ServerIssue referenceIssue = newReferenceIssue("old message", 1, "squid", "AvoidCycle", "checksum1"); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues(newArrayList(newIssue), newArrayList(referenceIssue), null, result); - assertThat(result.matching(newIssue)).isSameAs(referenceIssue); - } - - @Test - public void same_rule_and_line_message() { - DefaultIssue newIssue = newDefaultIssue("message", 1, RuleKey.of("squid", "AvoidCycle"), "checksum1"); - ServerIssue referenceIssue = newReferenceIssue("message", 1, "squid", "AvoidCycle", "checksum2"); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues(newArrayList(newIssue), newArrayList(referenceIssue), null, result); - assertThat(result.matching(newIssue)).isSameAs(referenceIssue); - } - - @Test - public void should_ignore_reference_measure_without_checksum() { - DefaultIssue newIssue = newDefaultIssue("message", 1, RuleKey.of("squid", "AvoidCycle"), null); - ServerIssue referenceIssue = newReferenceIssue("message", 1, "squid", "NullDeref", null); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues(newArrayList(newIssue), newArrayList(referenceIssue), null, result); - assertThat(result.matching(newIssue)).isNull(); - } - - @Test - public void same_rule_and_message_and_checksum_but_different_line() { - DefaultIssue newIssue = newDefaultIssue("message", 1, RuleKey.of("squid", "AvoidCycle"), "checksum1"); - ServerIssue referenceIssue = newReferenceIssue("message", 2, "squid", "AvoidCycle", "checksum1"); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues(newArrayList(newIssue), newArrayList(referenceIssue), null, result); - assertThat(result.matching(newIssue)).isSameAs(referenceIssue); - } - - /** - * SONAR-2812 - */ - @Test - public void same_checksum_and_rule_but_different_line_and_different_message() { - DefaultIssue newIssue = newDefaultIssue("new message", 1, RuleKey.of("squid", "AvoidCycle"), "checksum1"); - ServerIssue referenceIssue = newReferenceIssue("old message", 2, "squid", "AvoidCycle", "checksum1"); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues(newArrayList(newIssue), newArrayList(referenceIssue), null, result); - assertThat(result.matching(newIssue)).isSameAs(referenceIssue); - } - - @Test - public void should_create_new_issue_when_same_rule_same_message_but_different_line_and_checksum() { - DefaultIssue newIssue = newDefaultIssue("message", 1, RuleKey.of("squid", "AvoidCycle"), "checksum1"); - ServerIssue referenceIssue = newReferenceIssue("message", 2, "squid", "AvoidCycle", "checksum2"); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues(newArrayList(newIssue), newArrayList(referenceIssue), null, result); - assertThat(result.matching(newIssue)).isNull(); - } - - @Test - public void should_not_track_issue_if_different_rule() { - DefaultIssue newIssue = newDefaultIssue("message", 1, RuleKey.of("squid", "AvoidCycle"), "checksum1"); - ServerIssue referenceIssue = newReferenceIssue("message", 1, "squid", "NullDeref", "checksum1"); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues(newArrayList(newIssue), newArrayList(referenceIssue), null, result); - assertThat(result.matching(newIssue)).isNull(); - } - - @Test - public void should_compare_issues_with_database_format() { - // issue messages are trimmed and can be abbreviated when persisted in database. - // Comparing issue messages must use the same format. - DefaultIssue newIssue = newDefaultIssue(" message ", 1, RuleKey.of("squid", "AvoidCycle"), "checksum1"); - ServerIssue referenceIssue = newReferenceIssue("message", 1, "squid", "AvoidCycle", "checksum2"); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues(newArrayList(newIssue), newArrayList(referenceIssue), null, result); - assertThat(result.matching(newIssue)).isSameAs(referenceIssue); - } - - @Test - public void past_issue_not_associated_with_line_should_not_cause_npe() throws Exception { - initLastHashes("example2-v1", "example2-v2"); - - DefaultIssue newIssue = newDefaultIssue("Indentation", 9, RuleKey.of("squid", "AvoidCycle"), "foo"); - ServerIssue referenceIssue = newReferenceIssue("2 branches need to be covered", null, "squid", "AvoidCycle", null); - - IssueTrackingResult result = tracking.track(sourceHashHolder, newArrayList(referenceIssue), newArrayList(newIssue)); - - assertThat(result.matched()).isEmpty(); - } - - @Test - public void new_issue_not_associated_with_line_should_not_cause_npe() throws Exception { - initLastHashes("example2-v1", "example2-v2"); - - DefaultIssue newIssue = newDefaultIssue("1 branch need to be covered", null, RuleKey.of("squid", "AvoidCycle"), "foo"); - ServerIssue referenceIssue = newReferenceIssue("Indentationd", 7, "squid", "AvoidCycle", null); - - IssueTrackingResult result = tracking.track(sourceHashHolder, newArrayList(referenceIssue), newArrayList(newIssue)); - - assertThat(result.matched()).isEmpty(); - } - - /** - * SONAR-2928 - */ - @Test - public void issue_not_associated_with_line() throws Exception { - initLastHashes("example2-v1", "example2-v2"); - - DefaultIssue newIssue = newDefaultIssue("1 branch need to be covered", null, RuleKey.of("squid", "AvoidCycle"), null); - ServerIssue referenceIssue = newReferenceIssue("2 branches need to be covered", null, "squid", "AvoidCycle", null); - - IssueTrackingResult result = tracking.track(sourceHashHolder, newArrayList(referenceIssue), newArrayList(newIssue)); - - assertThat(result.matching(newIssue)).isEqualTo(referenceIssue); - } - - @Test - public void check_valid_line() throws Exception { - initLastHashes("example2-v1", "example2-v2"); - - DefaultIssue newIssue = newDefaultIssue("1 branch need to be covered", 200, RuleKey.of("squid", "AvoidCycle"), null); - - thrown - .expectMessage("Invalid line number for issue"); - - tracking.track(sourceHashHolder, Collections.<ServerIssue>emptyList(), newArrayList(newIssue)); - } - - /** - * SONAR-3072 - */ - @Test - public void should_track_issues_based_on_blocks_recognition_on_example1() throws Exception { - initLastHashes("example1-v1", "example1-v2"); - - ServerIssue referenceIssue1 = newReferenceIssue("Indentation", 7, "squid", "AvoidCycle", null); - ServerIssue referenceIssue2 = newReferenceIssue("Indentation", 11, "squid", "AvoidCycle", null); - - DefaultIssue newIssue1 = newDefaultIssue("Indentation", 9, RuleKey.of("squid", "AvoidCycle"), null); - DefaultIssue newIssue2 = newDefaultIssue("Indentation", 13, RuleKey.of("squid", "AvoidCycle"), null); - DefaultIssue newIssue3 = newDefaultIssue("Indentation", 17, RuleKey.of("squid", "AvoidCycle"), null); - DefaultIssue newIssue4 = newDefaultIssue("Indentation", 21, RuleKey.of("squid", "AvoidCycle"), null); - - IssueTrackingResult result = tracking.track(sourceHashHolder, Arrays.asList(referenceIssue1, referenceIssue2), Arrays.asList(newIssue1, newIssue2, newIssue3, newIssue4)); - - assertThat(result.matching(newIssue1)).isNull(); - assertThat(result.matching(newIssue2)).isNull(); - assertThat(result.matching(newIssue3)).isSameAs(referenceIssue1); - assertThat(result.matching(newIssue4)).isSameAs(referenceIssue2); - } - - /** - * SONAR-3072 - */ - @Test - public void should_track_issues_based_on_blocks_recognition_on_example2() throws Exception { - initLastHashes("example2-v1", "example2-v2"); - - ServerIssue referenceIssue1 = newReferenceIssue("SystemPrintln", 5, "squid", "AvoidCycle", null); - - DefaultIssue newIssue1 = newDefaultIssue("SystemPrintln", 6, RuleKey.of("squid", "AvoidCycle"), null); - DefaultIssue newIssue2 = newDefaultIssue("SystemPrintln", 10, RuleKey.of("squid", "AvoidCycle"), null); - DefaultIssue newIssue3 = newDefaultIssue("SystemPrintln", 14, RuleKey.of("squid", "AvoidCycle"), null); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues( - Arrays.asList(newIssue1, newIssue2, newIssue3), - Arrays.asList(referenceIssue1), - sourceHashHolder, result); - - assertThat(result.matching(newIssue1)).isNull(); - assertThat(result.matching(newIssue2)).isSameAs(referenceIssue1); - assertThat(result.matching(newIssue3)).isNull(); - } - - @Test - public void should_track_issues_based_on_blocks_recognition_on_example3() throws Exception { - initLastHashes("example3-v1", "example3-v2"); - - ServerIssue referenceIssue1 = newReferenceIssue("Avoid unused local variables such as 'j'.", 6, "squid", "AvoidCycle", "63c11570fc0a76434156be5f8138fa03"); - ServerIssue referenceIssue2 = newReferenceIssue("Avoid unused private methods such as 'myMethod()'.", 13, "squid", "NullDeref", "ef23288705d1ef1e512448ace287586e"); - ServerIssue referenceIssue3 = newReferenceIssue("Method 'avoidUtilityClass' is not designed for extension - needs to be abstract, final or empty.", 9, "pmd", - "UnusedLocalVariable", "ed5cdd046fda82727d6fedd1d8e3a310"); - - // New issue - DefaultIssue newIssue1 = newDefaultIssue("Avoid unused local variables such as 'msg'.", 18, RuleKey.of("squid", "AvoidCycle"), "a24254126be2bf1a9b9a8db43f633733"); - // Same as referenceIssue2 - DefaultIssue newIssue2 = newDefaultIssue("Avoid unused private methods such as 'myMethod()'.", 13, RuleKey.of("squid", "NullDeref"), "ef23288705d1ef1e512448ace287586e"); - // Same as referenceIssue3 - DefaultIssue newIssue3 = newDefaultIssue("Method 'avoidUtilityClass' is not designed for extension - needs to be abstract, final or empty.", 9, - RuleKey.of("pmd", "UnusedLocalVariable"), "ed5cdd046fda82727d6fedd1d8e3a310"); - // New issue - DefaultIssue newIssue4 = newDefaultIssue("Method 'newViolation' is not designed for extension - needs to be abstract, final or empty.", 17, - RuleKey.of("pmd", "UnusedLocalVariable"), "7d58ac9040c27e4ca2f11a0269e251e2"); - // Same as referenceIssue1 - DefaultIssue newIssue5 = newDefaultIssue("Avoid unused local variables such as 'j'.", 6, RuleKey.of("squid", "AvoidCycle"), "4432a2675ec3e1620daefe38386b51ef"); - - IssueTrackingResult result = new IssueTrackingResult(); - tracking.mapIssues( - Arrays.asList(newIssue1, newIssue2, newIssue3, newIssue4, newIssue5), - Arrays.asList(referenceIssue1, referenceIssue2, referenceIssue3), - sourceHashHolder, result); - - assertThat(result.matching(newIssue1)).isNull(); - assertThat(result.matching(newIssue2)).isSameAs(referenceIssue2); - assertThat(result.matching(newIssue3)).isSameAs(referenceIssue3); - assertThat(result.matching(newIssue4)).isNull(); - assertThat(result.matching(newIssue5)).isSameAs(referenceIssue1); - } - - @Test - public void dont_load_checksum_if_no_new_issue() { - sourceHashHolder = mock(SourceHashHolder.class); - - ServerIssue referenceIssue = newReferenceIssue("2 branches need to be covered", null, "squid", "AvoidCycle", null); - - tracking.track(sourceHashHolder, newArrayList(referenceIssue), Collections.<DefaultIssue>emptyList()); - - verifyZeroInteractions(lastSnapshots, sourceHashHolder); - } - - private static String load(String name) throws IOException { - return Resources.toString(IssueTrackingTest.class.getResource("IssueTrackingTest/" + name + ".txt"), StandardCharsets.UTF_8); - } - - private DefaultIssue newDefaultIssue(String message, Integer line, RuleKey ruleKey, String checksum) { - return new DefaultIssue().setMessage(message).setLine(line).setRuleKey(ruleKey).setChecksum(checksum).setStatus(Issue.STATUS_OPEN); - } - - private ServerIssueFromDb newReferenceIssue(String message, Integer lineId, String ruleRepo, String ruleKey, String lineChecksum) { - IssueDto referenceIssue = new IssueDto(); - Long id = violationId++; - referenceIssue.setId(id); - referenceIssue.setKee(Long.toString(id)); - referenceIssue.setLine(lineId); - referenceIssue.setMessage(message); - referenceIssue.setRuleKey(ruleRepo, ruleKey); - referenceIssue.setChecksum(lineChecksum); - referenceIssue.setResolution(null); - referenceIssue.setStatus(Issue.STATUS_OPEN); - return new ServerIssueFromDb(referenceIssue); - } - - private void initLastHashes(String reference, String newSource) throws IOException { - DefaultInputFile inputFile = mock(DefaultInputFile.class); - File f = temp.newFile(); - when(inputFile.path()).thenReturn(f.toPath()); - when(inputFile.file()).thenReturn(f); - when(inputFile.charset()).thenReturn(StandardCharsets.UTF_8); - String data = load(newSource); - when(inputFile.lines()).thenReturn(StringUtils.countMatches(data, "\n") + 1); - FileUtils.write(f, data, StandardCharsets.UTF_8); - when(inputFile.key()).thenReturn("foo:Action.java"); - when(lastSnapshots.getLineHashes("foo:Action.java")).thenReturn(computeHexHashes(load(reference))); - sourceHashHolder = new SourceHashHolder(inputFile, lastSnapshots); - } - - private String[] computeHexHashes(String source) { - String[] lines = source.split("\n"); - String[] hashes = new String[lines.length]; - for (int i = 0; i < lines.length; i++) { - hashes[i] = DigestUtils.md5Hex(lines[i].replaceAll("[\t ]", "")); - } - return hashes; - } -} diff --git a/sonar-batch/src/test/java/org/sonar/batch/report/ReportPublisherTest.java b/sonar-batch/src/test/java/org/sonar/batch/report/ReportPublisherTest.java index 8d2bdf973c7..ea301e425b0 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/report/ReportPublisherTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/report/ReportPublisherTest.java @@ -29,20 +29,16 @@ import org.sonar.api.platform.Server; import org.sonar.api.utils.TempFolder; import org.sonar.batch.bootstrap.DefaultAnalysisMode; import org.sonar.batch.bootstrap.ServerClient; -import org.sonar.batch.index.BatchComponentCache; import org.sonar.batch.scan.ImmutableProjectReactor; -import org.sonar.jpa.test.AbstractDbUnitTestCase; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -public class ReportPublisherTest extends AbstractDbUnitTestCase { +public class ReportPublisherTest { private DefaultAnalysisMode mode; - BatchComponentCache resourceCache = mock(BatchComponentCache.class); - private ImmutableProjectReactor reactor; @Before diff --git a/sonar-batch/src/test/java/org/sonar/batch/rule/QProfileSensorTest.java b/sonar-batch/src/test/java/org/sonar/batch/rule/QProfileSensorTest.java index f362690979a..81a9afb5938 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/rule/QProfileSensorTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/rule/QProfileSensorTest.java @@ -29,7 +29,7 @@ import org.sonar.api.batch.fs.internal.DefaultFileSystem; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.resources.Project; import org.sonar.api.test.IsMeasure; -import org.sonar.core.UtcDateUtils; +import org.sonar.core.util.UtcDateUtils; import java.util.Collections; import java.util.Date; diff --git a/sonar-batch/src/test/java/org/sonar/batch/rule/UsedQProfilesTest.java b/sonar-batch/src/test/java/org/sonar/batch/rule/UsedQProfilesTest.java index 1a26aeba91d..2bdd9fe7401 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/rule/UsedQProfilesTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/rule/UsedQProfilesTest.java @@ -20,7 +20,7 @@ package org.sonar.batch.rule; import org.junit.Test; -import org.sonar.core.UtcDateUtils; +import org.sonar.core.util.UtcDateUtils; import java.util.Arrays; import java.util.Map; |