aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-server
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2014-09-29 11:43:58 +0200
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2014-09-29 17:14:58 +0200
commit7de252ea61bdfc2cb33f74f04aa781d0ad773183 (patch)
tree04710c8a2bc8a74d2039ed0e5e90c56b2aa6e00e /server/sonar-server
parent64b43e759608ba4bec30be11dc9c6a0feed6fc8e (diff)
downloadsonarqube-7de252ea61bdfc2cb33f74f04aa781d0ad773183.tar.gz
sonarqube-7de252ea61bdfc2cb33f74f04aa781d0ad773183.zip
SONAR-5624 clean analysis report tasks to pending when server is starting and truncate when upgrading
Diffstat (limited to 'server/sonar-server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java20
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTasksCleaner.java62
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java16
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/db/AnalysisReportDao.java33
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java2
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java27
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportTasksCleanerTest.java67
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java59
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java52
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/any-analysis-reports.xml26
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml8
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select.xml26
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/truncate-result.xml3
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml46
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml26
15 files changed, 455 insertions, 18 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java b/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java
index 3c0d2f90b1b..15290fb9cfb 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java
@@ -76,19 +76,19 @@ public class UploadReportAction implements RequestHandler {
public void handle(Request request, Response response) throws Exception {
UserSession.get().checkGlobalPermission(GlobalPermissions.SCAN_EXECUTION);
- // Switch Issue search
- if (settings.getString("sonar.issues.use_es_backend") != null) {
- String projectKey = request.mandatoryParam(PARAM_PROJECT);
+ String projectKey = request.mandatoryParam(PARAM_PROJECT);
- DbSession session = dbClient.openSession(false);
- try {
- dbClient.componentDao().getAuthorizedComponentByKey(projectKey, session);
- computationService.create(projectKey);
+ DbSession session = dbClient.openSession(false);
+ try {
+ dbClient.componentDao().getAuthorizedComponentByKey(projectKey, session);
+ computationService.create(projectKey);
- } finally {
- MyBatis.closeQuietly(session);
- }
+ } finally {
+ MyBatis.closeQuietly(session);
+ }
+ // Switch Issue search
+ if (settings.getString("sonar.issues.use_es_backend") != null) {
// Synchronization of lot of data can only be done with a batch session for the moment
session = dbClient.openSession(true);
try {
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTasksCleaner.java b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTasksCleaner.java
new file mode 100644
index 00000000000..77929d47b98
--- /dev/null
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTasksCleaner.java
@@ -0,0 +1,62 @@
+/*
+ * 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.server.computation;
+
+import org.picocontainer.Startable;
+import org.sonar.api.ServerComponent;
+import org.sonar.api.platform.ServerUpgradeStatus;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.server.computation.db.AnalysisReportDao;
+import org.sonar.server.db.DbClient;
+
+public class AnalysisReportTasksCleaner implements Startable, ServerComponent {
+ private final ServerUpgradeStatus serverUpgradeStatus;
+ private final DbClient dbClient;
+
+ public AnalysisReportTasksCleaner(ServerUpgradeStatus serverUpgradeStatus, DbClient dbClient) {
+ this.serverUpgradeStatus = serverUpgradeStatus;
+ this.dbClient = dbClient;
+ }
+
+ @Override
+ public void start() {
+ DbSession session = dbClient.openSession(false);
+ AnalysisReportDao dao = dbClient.analysisReportDao();
+
+ try {
+ if (serverUpgradeStatus.isUpgraded()) {
+ dao.cleanWithTruncate(session);
+ } else {
+ dao.cleanWithUpdateAllToPendingStatus(session);
+ }
+
+ session.commit();
+ } finally {
+ MyBatis.closeQuietly(session);
+ }
+ }
+
+ @Override
+ public void stop() {
+ // do nothing
+ }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java
index 37cd3abc274..74112ddd24e 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java
@@ -23,9 +23,12 @@ package org.sonar.server.computation;
import org.sonar.api.ServerComponent;
import org.sonar.core.computation.db.AnalysisReportDto;
import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
import org.sonar.server.computation.db.AnalysisReportDao;
import org.sonar.server.db.DbClient;
+import java.util.List;
+
import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING;
/**
@@ -50,7 +53,18 @@ public class ComputationService implements ServerComponent {
dao.insert(session, report);
session.commit();
} finally {
- session.close();
+ MyBatis.closeQuietly(session);
+ }
+ }
+
+ public List<AnalysisReportDto> findByProjectKey(String projectKey) {
+ AnalysisReportDao dao = dbClient.analysisReportDao();
+
+ DbSession session = dbClient.openSession(false);
+ try {
+ return dao.findByProjectKey(session, projectKey);
+ } finally {
+ MyBatis.closeQuietly(session);
}
}
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/db/AnalysisReportDao.java b/server/sonar-server/src/main/java/org/sonar/server/computation/db/AnalysisReportDao.java
index 88fa780a4ea..6b26191e1fd 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/db/AnalysisReportDao.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/db/AnalysisReportDao.java
@@ -23,29 +23,51 @@ package org.sonar.server.computation.db;
import com.google.common.annotations.VisibleForTesting;
import org.sonar.api.utils.System2;
import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.computation.db.AnalysisReportDto.Status;
import org.sonar.core.computation.db.AnalysisReportMapper;
import org.sonar.core.persistence.DaoComponent;
import org.sonar.core.persistence.DbSession;
import org.sonar.server.db.BaseDao;
import java.util.Date;
+import java.util.List;
import java.util.Map;
-import static com.google.common.base.Preconditions.checkNotNull;
-
public class AnalysisReportDao extends BaseDao<AnalysisReportMapper, AnalysisReportDto, String> implements DaoComponent {
+ private System2 system2;
+
public AnalysisReportDao() {
this(System2.INSTANCE);
}
@VisibleForTesting
- public AnalysisReportDao(System2 system) {
- super(AnalysisReportMapper.class, system);
+ public AnalysisReportDao(System2 system2) {
+ super(AnalysisReportMapper.class, system2);
+ this.system2 = system2;
+ }
+
+ /**
+ * startup task use only
+ */
+ public void cleanWithUpdateAllToPendingStatus(DbSession session) {
+ mapper(session).cleanWithUpdateAllToPendingStatus(Status.PENDING, new Date(system2.now()));
+ }
+
+ /**
+ * startup task use only
+ */
+ public void cleanWithTruncate(DbSession session) {
+ mapper(session).cleanWithTruncate();
+ }
+
+ public List<AnalysisReportDto> findByProjectKey(DbSession session, String projectKey) {
+ List<AnalysisReportDto> analysisReports = mapper(session).selectByProjectKey(projectKey);
+ return analysisReports;
}
@Override
- protected AnalysisReportDto doGetNullableByKey(DbSession session, String key) {
+ protected AnalysisReportDto doGetNullableByKey(DbSession session, String projectKey) {
throw new UnsupportedOperationException();
}
@@ -56,7 +78,6 @@ public class AnalysisReportDao extends BaseDao<AnalysisReportMapper, AnalysisRep
@Override
protected AnalysisReportDto doInsert(DbSession session, AnalysisReportDto report) {
- checkNotNull(report.getProjectKey(), "Cannot insert Report with no project key!");
mapper(session).insert(report);
return report;
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
index 50da0a6d595..2fc25c2f8eb 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
@@ -99,6 +99,7 @@ import org.sonar.server.component.ws.ComponentsWs;
import org.sonar.server.component.ws.EventsWs;
import org.sonar.server.component.ws.ProjectsWs;
import org.sonar.server.component.ws.ResourcesWs;
+import org.sonar.server.computation.AnalysisReportTasksCleaner;
import org.sonar.server.computation.ComputationService;
import org.sonar.server.computation.db.AnalysisReportDao;
import org.sonar.server.config.ws.PropertiesWs;
@@ -766,6 +767,7 @@ class ServerComponents {
startupContainer.addSingleton(RegisterServletFilters.class);
startupContainer.addSingleton(CleanPreviewAnalysisCache.class);
startupContainer.addSingleton(CopyRequirementsFromCharacteristicsToRules.class);
+ startupContainer.addSingleton(AnalysisReportTasksCleaner.class);
DoPrivileged.execute(new DoPrivileged.Task() {
@Override
diff --git a/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java
index 2804a736dde..dcae8594b9a 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java
@@ -27,6 +27,7 @@ import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.web.UserRole;
import org.sonar.core.component.ComponentDto;
+import org.sonar.core.computation.db.AnalysisReportDto;
import org.sonar.core.issue.db.IssueDto;
import org.sonar.core.permission.GlobalPermissions;
import org.sonar.core.permission.PermissionFacade;
@@ -53,6 +54,7 @@ import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
import static org.fest.assertions.Assertions.assertThat;
+import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING;
public class UploadReportActionMediumTest {
@@ -112,6 +114,31 @@ public class UploadReportActionMediumTest {
// Check that issue authorization index has been created
assertThat(tester.get(IssueAuthorizationIndex.class).getNullableByKey(project.getKey())).isNotNull();
}
+
+ @Test
+ public void add_analysis_report_in_database() throws Exception {
+ final String projectKey = "123456789-987654321";
+ ComponentDto project = new ComponentDto()
+ .setKey(projectKey);
+ db.componentDao().insert(session, project);
+
+ // project can be seen by anyone
+ tester.get(PermissionFacade.class).insertGroupPermission(project.getId(), DefaultGroups.ANYONE, UserRole.USER, session);
+
+ session.commit();
+
+ MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+ WsTester.TestRequest request = wsTester.newGetRequest(BatchWs.API_ENDPOINT, UploadReportAction.UPLOAD_REPORT_ACTION);
+ request.setParam(UploadReportAction.PARAM_PROJECT, project.key());
+ request.execute();
+
+ List<AnalysisReportDto> analysisReports = db.analysisReportDao().findByProjectKey(session, projectKey);
+ AnalysisReportDto analysisReport = analysisReports.get(0);
+
+ assertThat(analysisReports).hasSize(1);
+ assertThat(analysisReport.getProjectKey()).isEqualTo(projectKey);
+ assertThat(analysisReport.getStatus()).isEqualTo(PENDING);
+ }
@Test(expected = ForbiddenException.class)
public void fail_without_global_scan_permission() throws Exception {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportTasksCleanerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportTasksCleanerTest.java
new file mode 100644
index 00000000000..e9ee75f1638
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportTasksCleanerTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.server.computation;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.sonar.api.platform.ServerUpgradeStatus;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.server.computation.db.AnalysisReportDao;
+import org.sonar.server.db.DbClient;
+
+import static org.mockito.Mockito.*;
+
+public class AnalysisReportTasksCleanerTest {
+
+ AnalysisReportTasksCleaner sut;
+ ServerUpgradeStatus serverUpgradeStatus;
+ DbClient dbClient;
+ AnalysisReportDao analysisReportDao;
+ DbSession session;
+
+ @Before
+ public void before() {
+ analysisReportDao = mock(AnalysisReportDao.class);
+ serverUpgradeStatus = mock(ServerUpgradeStatus.class);
+ dbClient = mock(DbClient.class);
+ session = mock(DbSession.class);
+
+ when(dbClient.analysisReportDao()).thenReturn(analysisReportDao);
+ when(dbClient.openSession(false)).thenReturn(session);
+
+ sut = new AnalysisReportTasksCleaner(serverUpgradeStatus, dbClient);
+ }
+
+ @Test
+ public void start_must_call_dao_clean_update_to_pending_by_default() {
+ sut.start();
+ verify(analysisReportDao).cleanWithUpdateAllToPendingStatus(any(DbSession.class));
+ sut.stop();
+ }
+
+ @Test
+ public void start_must_call_dao_truncate_when_upgrading() {
+ when(serverUpgradeStatus.isUpgraded()).thenReturn(Boolean.TRUE);
+ sut.start();
+ verify(analysisReportDao).cleanWithTruncate(any(DbSession.class));
+ sut.stop();
+ }
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java
new file mode 100644
index 00000000000..cacc48e9483
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.server.computation;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.server.computation.db.AnalysisReportDao;
+import org.sonar.server.db.DbClient;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class ComputationServiceTest {
+
+ ComputationService sut;
+ DbClient dbClient;
+ AnalysisReportDao analysisReportDao;
+ DbSession session;
+
+ @Before
+ public void before() {
+ analysisReportDao = mock(AnalysisReportDao.class);
+ dbClient = mock(DbClient.class);
+ session = mock(DbSession.class);
+
+ when(dbClient.analysisReportDao()).thenReturn(analysisReportDao);
+ when(dbClient.openSession(false)).thenReturn(session);
+
+ sut = new ComputationService(dbClient);
+ }
+
+ @Test
+ public void create_must_call_dao_insert() throws Exception {
+ sut.create("ANY-KEY");
+ verify(analysisReportDao).insert(any(DbSession.class), any(AnalysisReportDto.class));
+ }
+} \ No newline at end of file
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java
index cc07f14d388..d442b589b8a 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java
@@ -30,6 +30,9 @@ import org.sonar.core.computation.db.AnalysisReportDto;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.TestDatabase;
+import java.util.List;
+
+import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING;
@@ -55,7 +58,7 @@ public class AnalysisReportDaoTest {
}
@Test
- public void insert() {
+ public void insert_multiple_reports() {
when(system2.now()).thenReturn(DateUtils.parseDate("2014-09-26").getTime());
AnalysisReportDto report = new AnalysisReportDto()
@@ -66,8 +69,55 @@ public class AnalysisReportDaoTest {
.setUpdatedAt(DateUtils.parseDate("2014-09-25"));
dao.insert(session, report);
+ dao.insert(session, report);
+
session.commit();
db.assertDbUnit(getClass(), "insert-result.xml", "analysis_reports");
}
+
+ @Test
+ public void update_all_to_status() {
+ when(system2.now()).thenReturn(DateUtils.parseDate("2014-09-26").getTime());
+
+ db.prepareDbUnit(getClass(), "update-all-to-status-pending.xml");
+
+ dao.cleanWithUpdateAllToPendingStatus(session);
+ session.commit();
+
+ db.assertDbUnit(getClass(), "update-all-to-status-pending-result.xml", "analysis_reports");
+ }
+
+ @Test
+ public void truncate() {
+ db.prepareDbUnit(getClass(), "any-analysis-reports.xml");
+
+ dao.cleanWithTruncate(session);
+ session.commit();
+
+ db.assertDbUnit(getClass(), "truncate-result.xml", "analysis_reports");
+ }
+
+ @Test
+ public void select_one_report_by_project_key() {
+ db.prepareDbUnit(getClass(), "select.xml");
+
+ final String projectKey = "123456789-987654321";
+ List<AnalysisReportDto> reports = dao.findByProjectKey(session, projectKey);
+ AnalysisReportDto report = reports.get(0);
+
+ assertThat(reports).hasSize(1);
+ assertThat(report.getProjectKey()).isEqualTo(projectKey);
+ assertThat(report.getId()).isEqualTo(1);
+ }
+
+ @Test
+ public void select_several_reports_by_project_key() {
+ db.prepareDbUnit(getClass(), "select.xml");
+
+ final String projectKey = "987654321-123456789";
+ List<AnalysisReportDto> reports = dao.findByProjectKey(session, projectKey);
+
+ assertThat(reports).hasSize(2);
+ }
}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/any-analysis-reports.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/any-analysis-reports.xml
new file mode 100644
index 00000000000..66cdd2a55dc
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/any-analysis-reports.xml
@@ -0,0 +1,26 @@
+<dataset>
+ <analysis_reports
+ id="1"
+ project_key="123456789-987654321"
+ report_data="data-project"
+ report_status="WORKING"
+ created_at="2014-09-24"
+ updated_at="2014-09-24"
+ />
+ <analysis_reports
+ id="2"
+ project_key="123456789-987654321"
+ report_data="data-project"
+ report_status="WORKING"
+ created_at="2014-09-25"
+ updated_at="2014-09-25"
+ />
+ <analysis_reports
+ id="3"
+ project_key="123456789-987654321"
+ report_data="data-project"
+ report_status="PENDING"
+ created_at="2014-09-26"
+ updated_at="2014-09-26"
+ />
+</dataset> \ No newline at end of file
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml
index 1275fb9bd3d..2dcc8a250b7 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml
@@ -7,4 +7,12 @@
created_at="2014-09-24"
updated_at="2014-09-26"
/>
+ <analysis_reports
+ id="2"
+ project_key="123456789-987654321"
+ report_data="data-project"
+ report_status="PENDING"
+ created_at="2014-09-24"
+ updated_at="2014-09-26"
+ />
</dataset>
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select.xml
new file mode 100644
index 00000000000..6a347bb7795
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select.xml
@@ -0,0 +1,26 @@
+<dataset>
+ <analysis_reports
+ id="1"
+ project_key="123456789-987654321"
+ report_data="data-project"
+ report_status="WORKING"
+ created_at="2014-09-24"
+ updated_at="2014-09-24"
+ />
+ <analysis_reports
+ id="2"
+ project_key="987654321-123456789"
+ report_data="data-project"
+ report_status="WORKING"
+ created_at="2014-09-25"
+ updated_at="2014-09-25"
+ />
+ <analysis_reports
+ id="3"
+ project_key="987654321-123456789"
+ report_data="data-project"
+ report_status="PENDING"
+ created_at="2014-09-26"
+ updated_at="2014-09-26"
+ />
+</dataset> \ No newline at end of file
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/truncate-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/truncate-result.xml
new file mode 100644
index 00000000000..e573e0c5b06
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/truncate-result.xml
@@ -0,0 +1,3 @@
+<dataset>
+ <analysis_reports/>
+</dataset>
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml
new file mode 100644
index 00000000000..fd1f1c1d3e9
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml
@@ -0,0 +1,46 @@
+<!--
+ ~ 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.
+ -->
+
+<dataset>
+ <analysis_reports
+ id="1"
+ project_key="123456789-987654321"
+ report_data="data-project"
+ report_status="PENDING"
+ created_at="2014-09-24"
+ updated_at="2014-09-26"
+ />
+ <analysis_reports
+ id="2"
+ project_key="123456789-987654321"
+ report_data="data-project"
+ report_status="PENDING"
+ created_at="2014-09-25"
+ updated_at="2014-09-26"
+ />
+ <analysis_reports
+ id="3"
+ project_key="123456789-987654321"
+ report_data="data-project"
+ report_status="PENDING"
+ created_at="2014-09-26"
+ updated_at="2014-09-26"
+ />
+</dataset> \ No newline at end of file
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml
new file mode 100644
index 00000000000..66cdd2a55dc
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml
@@ -0,0 +1,26 @@
+<dataset>
+ <analysis_reports
+ id="1"
+ project_key="123456789-987654321"
+ report_data="data-project"
+ report_status="WORKING"
+ created_at="2014-09-24"
+ updated_at="2014-09-24"
+ />
+ <analysis_reports
+ id="2"
+ project_key="123456789-987654321"
+ report_data="data-project"
+ report_status="WORKING"
+ created_at="2014-09-25"
+ updated_at="2014-09-25"
+ />
+ <analysis_reports
+ id="3"
+ project_key="123456789-987654321"
+ report_data="data-project"
+ report_status="PENDING"
+ created_at="2014-09-26"
+ updated_at="2014-09-26"
+ />
+</dataset> \ No newline at end of file