aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2016-07-18 17:27:44 +0200
committerStas Vilchik <vilchiks@gmail.com>2016-07-18 18:26:58 +0200
commit097d696e994330a7523c5ed883b7c5afa7130152 (patch)
tree8c527c70da76add2e37f895b0884318a453eadd1 /server
parent655d123958ad814fba45877e9cf31a5fbb52d11b (diff)
downloadsonarqube-097d696e994330a7523c5ed883b7c5afa7130152.tar.gz
sonarqube-097d696e994330a7523c5ed883b7c5afa7130152.zip
SONAR-7789 Update last used date of ancestors profile
Diffstat (limited to 'server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/UpdateQualityProfilesLastUsedDateStep.java25
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/step/UpdateQualityProfilesLastUsedDateStepTest.java81
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) {