*/
package org.sonar.ce.task.projectanalysis.step;
-import com.google.common.base.Optional;
import javax.annotation.CheckForNull;
import org.sonar.api.config.Configuration;
import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.ce.task.step.ComputationStep;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.component.ComponentDto;
/**
* Populates the {@link PeriodHolder}
*/
public class LoadPeriodsStep implements ComputationStep {
+ private final AnalysisMetadataHolder analysisMetadataHolder;
private final DbClient dbClient;
private final ConfigurationRepository configRepository;
private final TreeRootHolder treeRootHolder;
- private final AnalysisMetadataHolder analysisMetadataHolder;
private final PeriodHolderImpl periodsHolder;
- public LoadPeriodsStep(DbClient dbClient, ConfigurationRepository settingsRepository, TreeRootHolder treeRootHolder, AnalysisMetadataHolder analysisMetadataHolder,
- PeriodHolderImpl periodsHolder) {
+ public LoadPeriodsStep(AnalysisMetadataHolder analysisMetadataHolder, DbClient dbClient,
+ ConfigurationRepository configurationRepository, TreeRootHolder treeRootHolder, PeriodHolderImpl periodsHolder) {
+ this.analysisMetadataHolder = analysisMetadataHolder;
this.dbClient = dbClient;
- this.configRepository = settingsRepository;
+ this.configRepository = configurationRepository;
this.treeRootHolder = treeRootHolder;
- this.analysisMetadataHolder = analysisMetadataHolder;
this.periodsHolder = periodsHolder;
}
@Override
public void execute(ComputationStep.Context context) {
+ if (analysisMetadataHolder.isFirstAnalysis()) {
+ return;
+ }
+
new DepthTraversalTypeAwareCrawler(
new TypeAwareVisitorAdapter(CrawlerDepthLimit.PROJECT, ComponentVisitor.Order.PRE_ORDER) {
@Override
@CheckForNull
private Period buildPeriod(Component projectOrView, DbSession session) {
- Optional<ComponentDto> projectDto = dbClient.componentDao().selectByKey(session, projectOrView.getKey());
- // No project on first analysis, no period
- if (!projectDto.isPresent()) {
- return null;
- }
-
boolean isReportType = projectOrView.getType().isReportType();
- PeriodResolver periodResolver = new PeriodResolver(dbClient, session, projectDto.get().uuid(), analysisMetadataHolder.getAnalysisDate(),
+ PeriodResolver periodResolver = new PeriodResolver(dbClient, session, projectOrView.getUuid(), analysisMetadataHolder.getAnalysisDate(),
isReportType ? projectOrView.getReportAttributes().getVersion() : null);
Configuration config = configRepository.getConfiguration();
import com.tngtech.java.junit.dataprovider.DataProviderRunner;
import java.text.SimpleDateFormat;
+import org.apache.commons.lang.RandomStringUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
import org.sonar.api.utils.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
+import org.sonar.ce.task.projectanalysis.analysis.Analysis;
+import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.ce.task.projectanalysis.component.ReportComponent;
+import org.sonar.ce.task.projectanalysis.component.TreeRootHolder;
import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule;
import org.sonar.ce.task.projectanalysis.period.Period;
import org.sonar.ce.task.projectanalysis.period.PeriodHolderImpl;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import static org.sonar.core.config.CorePropertyDefinitions.LEAK_PERIOD_MODE_DATE;
import static org.sonar.core.config.CorePropertyDefinitions.LEAK_PERIOD_MODE_DAYS;
private MapSettings settings = new MapSettings();
private ConfigurationRepository settingsRepository = mock(ConfigurationRepository.class);
- private LoadPeriodsStep underTest = new LoadPeriodsStep(dbClient, settingsRepository, treeRootHolder, analysisMetadataHolder, periodsHolder);
+ private LoadPeriodsStep underTest = new LoadPeriodsStep(analysisMetadataHolder, dbClient, settingsRepository, treeRootHolder, periodsHolder);
@Override
protected ComputationStep step() {
@Before
public void setUp() throws Exception {
analysisMetadataHolder.setAnalysisDate(DATE_FORMAT.parse("2008-11-30").getTime());
+ analysisMetadataHolder.setBaseAnalysis(new Analysis.Builder().setUuid(RandomStringUtils.randomAlphabetic(15)).setId(888).setCreatedAt(5_666_777_888L).build());
}
@Test
public void no_period_on_first_analysis() {
- treeRootHolder.setRoot(ReportComponent.builder(Component.Type.PROJECT, 1).setKey("ROOT_KEY").setVersion("1.1").build());
+ DbClient dbClientMock = mock(DbClient.class);
+ ConfigurationRepository configurationRepositoryMock = mock(ConfigurationRepository.class);
+ TreeRootHolder treeRootHolderMock = mock(TreeRootHolder.class);
+ PeriodHolderImpl periodHolderMock = mock(PeriodHolderImpl.class);
+ AnalysisMetadataHolder analysisMetadataHolderMock = mock(AnalysisMetadataHolder.class);
+ when(analysisMetadataHolderMock.isFirstAnalysis()).thenReturn(true);
+
+ LoadPeriodsStep underTest = new LoadPeriodsStep(analysisMetadataHolderMock, dbClientMock, configurationRepositoryMock, treeRootHolderMock, periodHolderMock);
- // No project, no snapshot
underTest.execute(new TestComputationStepContext());
- assertThat(periodsHolder.hasPeriod()).isFalse();
+ verify(analysisMetadataHolderMock).isFirstAnalysis();
+ verifyZeroInteractions(dbClientMock, configurationRepositoryMock, treeRootHolderMock, periodHolderMock);
}
@Test