]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-12788 New code period is badly set when there's only one version
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Fri, 6 Dec 2019 18:46:58 +0000 (12:46 -0600)
committerSonarTech <sonartech@sonarsource.com>
Wed, 11 Dec 2019 19:46:08 +0000 (20:46 +0100)
server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/period/NewCodePeriodResolver.java
server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadPeriodsStepTest.java

index 5e925e88401b8624ead586f82314f2bfb8aef029..487309769f09c682d1dcfdecd34e86c5eead1d31 100644 (file)
@@ -81,7 +81,7 @@ public class NewCodePeriodResolver {
       .orElseThrow(() -> new IllegalStateException("Analysis '" + value + "' of project '" + rootUuid
         + "' defined as the baseline does not exist"));
     LOG.debug("Resolving new code period with a specific analysis");
-    return newPeriod(NewCodePeriodType.SPECIFIC_ANALYSIS, value, Instant.ofEpochMilli(baseline.getCreatedAt()));
+    return newPeriod(NewCodePeriodType.SPECIFIC_ANALYSIS, value, baseline.getCreatedAt());
   }
 
   private Period resolveByPreviousVersion(DbSession dbSession, String projectUuid, String projectVersion) {
@@ -93,9 +93,10 @@ public class NewCodePeriodResolver {
     String mostRecentVersion = Optional.ofNullable(versions.iterator().next().getName())
       .orElseThrow(() -> new IllegalStateException("selectVersionsByMostRecentFirst returned a DTO which didn't have a name"));
 
-    if (versions.size() == 1) {
+    if (versions.size() == 1 && projectVersion.equals(mostRecentVersion)) {
       return findOldestAnalysis(dbSession, projectUuid);
     }
+
     return resolvePreviousVersion(dbSession, projectVersion, versions, mostRecentVersion);
   }
 
@@ -107,7 +108,7 @@ public class NewCodePeriodResolver {
     Instant targetDate = DateUtils.addDays(Instant.ofEpochMilli(referenceDate), -days);
     LOG.debug("Resolving new code period by {} days: {}", days, supplierToString(() -> logDate(targetDate)));
     SnapshotDto snapshot = findNearestSnapshotToTargetDate(snapshots, targetDate);
-    return newPeriod(NewCodePeriodType.NUMBER_OF_DAYS, String.valueOf((int) days), Instant.ofEpochMilli(snapshot.getCreatedAt()));
+    return newPeriod(NewCodePeriodType.NUMBER_OF_DAYS, String.valueOf((int) days), snapshot.getCreatedAt());
   }
 
   private Period resolvePreviousVersion(DbSession dbSession, String currentVersion, List<EventDto> versions, String mostRecentVersion) {
@@ -119,14 +120,14 @@ public class NewCodePeriodResolver {
   private Period findOldestAnalysis(DbSession dbSession, String projectUuid) {
     LOG.debug("Resolving first analysis as new code period as there is only one existing version");
     Optional<Period> period = dbClient.snapshotDao().selectOldestSnapshot(dbSession, projectUuid)
-      .map(dto -> newPeriod(NewCodePeriodType.PREVIOUS_VERSION, null, Instant.ofEpochMilli(dto.getCreatedAt())));
+      .map(dto -> newPeriod(NewCodePeriodType.PREVIOUS_VERSION, null, dto.getCreatedAt()));
     ensureNotOnFirstAnalysis(period.isPresent());
     return period.get();
   }
 
   private Period newPeriod(DbSession dbSession, EventDto previousVersion) {
     Optional<Period> period = dbClient.snapshotDao().selectByUuid(dbSession, previousVersion.getAnalysisUuid())
-      .map(dto -> newPeriod(NewCodePeriodType.PREVIOUS_VERSION, dto.getProjectVersion(), Instant.ofEpochMilli(dto.getCreatedAt())));
+      .map(dto -> newPeriod(NewCodePeriodType.PREVIOUS_VERSION, dto.getProjectVersion(), dto.getCreatedAt()));
     if (!period.isPresent()) {
       throw new IllegalStateException(format("Analysis '%s' for version event '%s' has been deleted",
         previousVersion.getAnalysisUuid(), previousVersion.getName()));
@@ -134,8 +135,8 @@ public class NewCodePeriodResolver {
     return period.get();
   }
 
-  private static Period newPeriod(NewCodePeriodType type, @Nullable String value, Instant instant) {
-    return new Period(type.name(), value, instant.toEpochMilli());
+  private static Period newPeriod(NewCodePeriodType type, @Nullable String value, long date) {
+    return new Period(type.name(), value, date);
   }
 
   private static Object supplierToString(Supplier<String> s) {
index 47f9b6bf0426a069ed9648ec2bfd1ae761d30847..09666f0251f7a26099125e63583c0933a6524b26 100644 (file)
@@ -288,7 +288,7 @@ public class LoadPeriodsStepTest extends BaseStepTest {
     SnapshotDto analysis5 = dbTester.components().insertSnapshot(project, snapshot -> snapshot.setCreatedAt(1227934800000L).setProjectVersion("1.1").setLast(true)); // 2008-11-29
     dbTester.events().insertEvent(newEvent(analysis1).setName("0.9").setCategory(CATEGORY_VERSION).setDate(analysis1.getCreatedAt()));
     dbTester.events().insertEvent(newEvent(analysis2).setName("1.0").setCategory(CATEGORY_VERSION).setDate(analysis2.getCreatedAt()));
-    dbTester.events().insertEvent(newEvent(analysis5).setName("1.1").setCategory(CATEGORY_VERSION).setDate(analysis4.getCreatedAt()));
+    dbTester.events().insertEvent(newEvent(analysis5).setName("1.1").setCategory(CATEGORY_VERSION).setDate(analysis5.getCreatedAt()));
     setupRoot(project, "1.1");
     setProjectPeriod(project.uuid(), NewCodePeriodType.PREVIOUS_VERSION, null);
 
@@ -299,6 +299,22 @@ public class LoadPeriodsStepTest extends BaseStepTest {
     verifyDebugLogs("Resolving new code period by previous version: 1.0");
   }
 
+  @Test
+  public void load_previous_version_when_version_is_changing() {
+    SnapshotDto analysis1 = dbTester.components().insertSnapshot(project, snapshot -> snapshot.setCreatedAt(1226379600000L).setProjectVersion("0.9").setLast(false)); // 2008-11-11
+    SnapshotDto analysis2 = dbTester.components().insertSnapshot(project, snapshot -> snapshot.setCreatedAt(1226494680000L).setProjectVersion("0.9").setLast(true)); // 2008-11-12
+
+    dbTester.events().insertEvent(newEvent(analysis2).setName("0.9").setCategory(CATEGORY_VERSION).setDate(analysis2.getCreatedAt()));
+    setupRoot(project, "1.0");
+    setProjectPeriod(project.uuid(), NewCodePeriodType.PREVIOUS_VERSION, null);
+
+    underTest.execute(new TestComputationStepContext());
+
+    assertPeriod(NewCodePeriodType.PREVIOUS_VERSION, "0.9", analysis2.getCreatedAt());
+
+    verifyDebugLogs("Resolving new code period by previous version: 0.9");
+  }
+
   @Test
   @UseDataProvider("zeroOrLess")
   public void fail_with_MessageException_if_period_is_0_or_less(int zeroOrLess) {
@@ -313,10 +329,9 @@ public class LoadPeriodsStepTest extends BaseStepTest {
   public void load_previous_version_with_previous_version_deleted() {
     SnapshotDto analysis1 = dbTester.components().insertSnapshot(project, snapshot -> snapshot.setCreatedAt(1226379600000L).setProjectVersion("0.9").setLast(false)); // 2008-11-11
     SnapshotDto analysis2 = dbTester.components().insertSnapshot(project, snapshot -> snapshot.setCreatedAt(1226494680000L).setProjectVersion("1.0").setLast(false)); // 2008-11-12
-    SnapshotDto analysis3 = dbTester.components().insertSnapshot(project, snapshot -> snapshot.setCreatedAt(1227157200000L).setProjectVersion("1.1").setLast(false)); // 2008-11-20
+    SnapshotDto analysis3 = dbTester.components().insertSnapshot(project, snapshot -> snapshot.setCreatedAt(1227157200000L).setProjectVersion("1.1").setLast(true)); // 2008-11-20
     dbTester.events().insertEvent(newEvent(analysis1).setName("0.9").setCategory(CATEGORY_VERSION));
     // The "1.0" version was deleted from the history
-    dbTester.events().insertEvent(newEvent(analysis3).setName("1.1").setCategory(CATEGORY_VERSION));
     setupRoot(project, "1.1");
 
     underTest.execute(new TestComputationStepContext());
@@ -349,8 +364,8 @@ public class LoadPeriodsStepTest extends BaseStepTest {
 
     underTest.execute(new TestComputationStepContext());
 
-    assertPeriod(NewCodePeriodType.PREVIOUS_VERSION, null, analysis.getCreatedAt());
-    verifyDebugLogs("Resolving first analysis as new code period as there is only one existing version");
+    assertPeriod(NewCodePeriodType.PREVIOUS_VERSION, "0.9", analysis.getCreatedAt());
+    verifyDebugLogs("Resolving new code period by previous version: 0.9");
   }
 
   @Test
@@ -377,7 +392,7 @@ public class LoadPeriodsStepTest extends BaseStepTest {
 
   @DataProvider
   public static Object[][] zeroOrLess() {
-    return new Object[][]{
+    return new Object[][] {
       {0},
       {-1 - new Random().nextInt(30)}
     };
@@ -385,7 +400,7 @@ public class LoadPeriodsStepTest extends BaseStepTest {
 
   @DataProvider
   public static Object[][] stringConsideredAsVersions() {
-    return new Object[][]{
+    return new Object[][] {
       {randomAlphabetic(5)},
       {"1,3"},
       {"1.3"},
@@ -397,7 +412,7 @@ public class LoadPeriodsStepTest extends BaseStepTest {
 
   @DataProvider
   public static Object[][] projectVersionNullOrNot() {
-    return new Object[][]{
+    return new Object[][] {
       {null},
       {randomAlphabetic(15)},
     };
@@ -405,7 +420,7 @@ public class LoadPeriodsStepTest extends BaseStepTest {
 
   @DataProvider
   public static Object[][] anyValidLeakPeriodSettingValue() {
-    return new Object[][]{
+    return new Object[][] {
       // days
       {NewCodePeriodType.NUMBER_OF_DAYS, "100"},
       // previous_version