diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2016-07-18 17:27:44 +0200 |
---|---|---|
committer | Stas Vilchik <vilchiks@gmail.com> | 2016-07-18 18:26:58 +0200 |
commit | 097d696e994330a7523c5ed883b7c5afa7130152 (patch) | |
tree | 8c527c70da76add2e37f895b0884318a453eadd1 /server | |
parent | 655d123958ad814fba45877e9cf31a5fbb52d11b (diff) | |
download | sonarqube-097d696e994330a7523c5ed883b7c5afa7130152.tar.gz sonarqube-097d696e994330a7523c5ed883b7c5afa7130152.zip |
SONAR-7789 Update last used date of ancestors profile
Diffstat (limited to 'server')
2 files changed, 77 insertions, 29 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/UpdateQualityProfilesLastUsedDateStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/UpdateQualityProfilesLastUsedDateStep.java index 1f6a47b7ed2..fb027ffe715 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/UpdateQualityProfilesLastUsedDateStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/UpdateQualityProfilesLastUsedDateStep.java @@ -21,10 +21,10 @@ package org.sonar.server.computation.step; import com.google.common.base.Optional; +import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import org.sonar.api.measures.CoreMetrics; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.qualityprofile.QualityProfileDto; @@ -39,6 +39,7 @@ import org.sonar.server.computation.qualityprofile.QPMeasureData; import org.sonar.server.computation.qualityprofile.QualityProfile; import static java.util.Collections.emptySet; +import static org.sonar.api.measures.CoreMetrics.QUALITY_PROFILES_KEY; public class UpdateQualityProfilesLastUsedDateStep implements ComputationStep { @@ -49,7 +50,7 @@ public class UpdateQualityProfilesLastUsedDateStep implements ComputationStep { private final MeasureRepository measureRepository; public UpdateQualityProfilesLastUsedDateStep(DbClient dbClient, AnalysisMetadataHolder analysisMetadataHolder, TreeRootHolder treeRootHolder, MetricRepository metricRepository, - MeasureRepository measureRepository) { + MeasureRepository measureRepository) { this.dbClient = dbClient; this.analysisMetadataHolder = analysisMetadataHolder; this.treeRootHolder = treeRootHolder; @@ -62,13 +63,14 @@ public class UpdateQualityProfilesLastUsedDateStep implements ComputationStep { DbSession dbSession = dbClient.openSession(true); try { Component root = treeRootHolder.getRoot(); - Metric metric = metricRepository.getByKey(CoreMetrics.QUALITY_PROFILES_KEY); + Metric metric = metricRepository.getByKey(QUALITY_PROFILES_KEY); Set<QualityProfile> qualityProfiles = parseQualityProfiles(measureRepository.getRawMeasure(root, metric)); if (qualityProfiles.isEmpty()) { return; } List<QualityProfileDto> dtos = dbClient.qualityProfileDao().selectByKeys(dbSession, qualityProfiles.stream().map(QualityProfile::getQpKey).collect(Collectors.toList())); + dtos.addAll(getAncestors(dbSession, dtos)); long analysisDate = analysisMetadataHolder.getAnalysisDate(); dtos.forEach(dto -> { dto.setLastUsed(analysisDate); @@ -81,9 +83,24 @@ public class UpdateQualityProfilesLastUsedDateStep implements ComputationStep { } } + private List<QualityProfileDto> getAncestors(DbSession dbSession, List<QualityProfileDto> dtos) { + List<QualityProfileDto> ancestors = new ArrayList<>(); + dtos.forEach(dto -> incrementAncestors(dbSession, dto, ancestors)); + return ancestors; + } + + private void incrementAncestors(DbSession session, QualityProfileDto profile, List<QualityProfileDto> ancestors) { + String parentKey = profile.getParentKee(); + if (parentKey != null) { + QualityProfileDto parentDto = dbClient.qualityProfileDao().selectOrFailByKey(session, parentKey); + ancestors.add(parentDto); + incrementAncestors(session, parentDto, ancestors); + } + } + @Override public String getDescription() { - return "Update quality profiles"; + return "Update last usage date of quality profiles"; } private static Set<QualityProfile> parseQualityProfiles(Optional<Measure> measure) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/UpdateQualityProfilesLastUsedDateStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/UpdateQualityProfilesLastUsedDateStepTest.java index a3dcdca6d82..244c01973aa 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/UpdateQualityProfilesLastUsedDateStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/UpdateQualityProfilesLastUsedDateStepTest.java @@ -24,15 +24,14 @@ import java.util.Arrays; import java.util.Date; import java.util.stream.Collectors; import javax.annotation.CheckForNull; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.sonar.api.measures.CoreMetrics; -import org.sonar.api.measures.Metric; +import org.junit.rules.ExpectedException; import org.sonar.api.utils.System2; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.DbTester; +import org.sonar.db.RowNotFoundException; import org.sonar.db.qualityprofile.QualityProfileDbTester; import org.sonar.db.qualityprofile.QualityProfileDto; import org.sonar.server.computation.analysis.AnalysisMetadataHolderRule; @@ -41,13 +40,12 @@ import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.ReportComponent; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureRepositoryRule; -import org.sonar.server.computation.metric.Metric.MetricType; -import org.sonar.server.computation.metric.MetricImpl; import org.sonar.server.computation.metric.MetricRepositoryRule; import org.sonar.server.computation.qualityprofile.QPMeasureData; import org.sonar.server.computation.qualityprofile.QualityProfile; import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.api.measures.CoreMetrics.QUALITY_PROFILES; import static org.sonar.api.measures.CoreMetrics.QUALITY_PROFILES_KEY; import static org.sonar.db.qualityprofile.QualityProfileTesting.newQualityProfileDto; @@ -59,34 +57,33 @@ public class UpdateQualityProfilesLastUsedDateStepTest { private QualityProfileDto myQualityProfile = newQualityProfileDto().setKey("my-qp"); @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Rule public DbTester db = DbTester.create(System2.INSTANCE); - DbClient dbClient = db.getDbClient(); - DbSession dbSession = db.getSession(); - QualityProfileDbTester qualityProfileDb = new QualityProfileDbTester(db); + @Rule - public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule(); + public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule().setAnalysisDate(ANALYSIS_DATE); + @Rule - public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); + public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule().setRoot(PROJECT); + @Rule - public MetricRepositoryRule metricRepository = new MetricRepositoryRule(); + public MetricRepositoryRule metricRepository = new MetricRepositoryRule().add(QUALITY_PROFILES); + @Rule public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository); - UpdateQualityProfilesLastUsedDateStep underTest; + DbClient dbClient = db.getDbClient(); + DbSession dbSession = db.getSession(); + QualityProfileDbTester qualityProfileDb = new QualityProfileDbTester(db); - @Before - public void setUp() { - underTest = new UpdateQualityProfilesLastUsedDateStep(dbClient, analysisMetadataHolder, treeRootHolder, metricRepository, measureRepository); - analysisMetadataHolder.setAnalysisDate(ANALYSIS_DATE); - treeRootHolder.setRoot(PROJECT); - Metric<String> metric = CoreMetrics.QUALITY_PROFILES; - metricRepository.add(new MetricImpl(1, metric.getKey(), metric.getName(), MetricType.STRING)); + UpdateQualityProfilesLastUsedDateStep underTest = new UpdateQualityProfilesLastUsedDateStep(dbClient, analysisMetadataHolder, treeRootHolder, metricRepository, measureRepository); + @Test + public void doest_not_update_profiles_when_no_measure() { qualityProfileDb.insertQualityProfiles(sonarWayJava, sonarWayPhp, myQualityProfile); - } - @Test - public void project_without_quality_profiles() { underTest.execute(); assertQualityProfileIsTheSame(sonarWayJava); @@ -95,7 +92,9 @@ public class UpdateQualityProfilesLastUsedDateStepTest { } @Test - public void analysis_quality_profiles_are_updated() { + public void update_profiles_defined_in_quality_profiles_measure() { + qualityProfileDb.insertQualityProfiles(sonarWayJava, sonarWayPhp, myQualityProfile); + measureRepository.addRawMeasure(1, QUALITY_PROFILES_KEY, Measure.newMeasureBuilder().create( toJson(sonarWayJava.getKey(), myQualityProfile.getKey()))); @@ -107,8 +106,40 @@ public class UpdateQualityProfilesLastUsedDateStepTest { } @Test - public void description() { - assertThat(underTest.getDescription()).isEqualTo("Update quality profiles"); + public void ancestor_profiles_are_updated() throws Exception { + // Parent profiles should be updated + QualityProfileDto rootProfile = newQualityProfileDto().setKey("root"); + QualityProfileDto parentProfile = newQualityProfileDto().setKey("parent").setParentKee(rootProfile.getKey()); + // Current profile => should be updated + QualityProfileDto currentProfile = newQualityProfileDto().setKey("current").setParentKee(parentProfile.getKey()); + // Child of current profile => should not be updated + QualityProfileDto childProfile = newQualityProfileDto().setKey("child").setParentKee(currentProfile.getKey()); + qualityProfileDb.insertQualityProfiles(rootProfile, parentProfile, currentProfile, childProfile); + + measureRepository.addRawMeasure(1, QUALITY_PROFILES_KEY, Measure.newMeasureBuilder().create(toJson(currentProfile.getKey()))); + + underTest.execute(); + + assertQualityProfileIsUpdated(rootProfile); + assertQualityProfileIsUpdated(parentProfile); + assertQualityProfileIsUpdated(currentProfile); + assertQualityProfileIsTheSame(childProfile); + } + + @Test + public void fail_when_profile_is_linked_to_unknown_parent() throws Exception { + QualityProfileDto currentProfile = newQualityProfileDto().setKey("current").setParentKee("unknown"); + qualityProfileDb.insertQualityProfiles(currentProfile); + + measureRepository.addRawMeasure(1, QUALITY_PROFILES_KEY, Measure.newMeasureBuilder().create(toJson(currentProfile.getKey()))); + + expectedException.expect(RowNotFoundException.class); + underTest.execute(); + } + + @Test + public void test_description() { + assertThat(underTest.getDescription()).isEqualTo("Update last usage date of quality profiles"); } private void assertQualityProfileIsUpdated(QualityProfileDto qp) { |