aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2016-02-16 15:46:12 +0100
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2016-02-16 15:46:30 +0100
commit7d0f619f33a47ea1755e993df0e2084ba2a6f074 (patch)
tree6e7936131ca0984db45317079461a16a81cc7aff /server
parent4621ff0206176da5af9fc8c1c704a2ca5aded1ad (diff)
downloadsonarqube-7d0f619f33a47ea1755e993df0e2084ba2a6f074.tar.gz
sonarqube-7d0f619f33a47ea1755e993df0e2084ba2a6f074.zip
SONAR-7187 WS api/ce/activity parse date and date time parameters
Diffstat (limited to 'server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActivityAction.java28
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java49
2 files changed, 63 insertions, 14 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActivityAction.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActivityAction.java
index 0ca8d174c46..a75efc58f58 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActivityAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActivityAction.java
@@ -27,6 +27,8 @@ import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
import org.sonar.api.resources.Qualifiers;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
@@ -40,8 +42,8 @@ import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.ce.CeActivityDto;
-import org.sonar.db.ce.CeTaskQuery;
import org.sonar.db.ce.CeQueueDto;
+import org.sonar.db.ce.CeTaskQuery;
import org.sonar.db.ce.CeTaskTypes;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentDtoFunctions;
@@ -55,7 +57,7 @@ import org.sonarqube.ws.WsCe.ActivityResponse;
import org.sonarqube.ws.client.ce.ActivityWsRequest;
import static java.lang.String.format;
-import static org.sonar.api.utils.DateUtils.dateToLong;
+import static org.sonar.api.utils.DateUtils.parseDateQuietly;
import static org.sonar.api.utils.DateUtils.parseDateTimeQuietly;
import static org.sonar.api.utils.Paging.offset;
import static org.sonar.server.ws.WsUtils.checkRequest;
@@ -163,8 +165,8 @@ public class ActivityAction implements CeWsAction {
CeTaskQuery query = new CeTaskQuery();
query.setType(request.getType());
query.setOnlyCurrents(request.getOnlyCurrents());
- query.setMinSubmittedAt(dateToLong(parseDateTimeQuietly(request.getMinSubmittedAt())));
- query.setMaxExecutedAt(dateToLong(parseDateTimeQuietly(request.getMaxExecutedAt())));
+ query.setMinSubmittedAt(parseDateTimeAsLong(request.getMinSubmittedAt()));
+ query.setMaxExecutedAt(parseDateTimeAsLong(request.getMaxExecutedAt()));
List<String> statuses = request.getStatus();
if (statuses != null && !statuses.isEmpty()) {
@@ -220,6 +222,22 @@ public class ActivityAction implements CeWsAction {
}
}
+ @CheckForNull
+ private static Long parseDateTimeAsLong(@Nullable String dateAsString) {
+ if (dateAsString == null) {
+ return null;
+ }
+
+ Date date = parseDateTimeQuietly(dateAsString);
+ if (date == null) {
+ date = parseDateQuietly(dateAsString);
+ }
+
+ checkRequest(date != null, "Date '%s' cannot be parsed as either a date or date+time", dateAsString);
+
+ return date.getTime();
+ }
+
public static boolean isAllowedOnComponentUuid(UserSession userSession, String componentUuid) {
return userSession.hasPermission(GlobalPermissions.SYSTEM_ADMIN) || userSession.hasComponentUuidPermission(UserRole.ADMIN, componentUuid);
}
@@ -256,8 +274,8 @@ public class ActivityAction implements CeWsAction {
.setComponentQuery(request.param(PARAM_COMPONENT_QUERY))
.setStatus(request.paramAsStrings(PARAM_STATUS))
.setType(request.param(PARAM_TYPE))
- .setMaxExecutedAt(request.param(PARAM_MAX_EXECUTED_AT))
.setMinSubmittedAt(request.param(PARAM_MIN_SUBMITTED_AT))
+ .setMaxExecutedAt(request.param(PARAM_MAX_EXECUTED_AT))
.setOnlyCurrents(request.paramAsBoolean(PARAM_ONLY_CURRENTS))
.setPage(request.mandatoryParamAsInt(Param.PAGE))
.setPageSize(request.mandatoryParamAsInt(Param.PAGE_SIZE));
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java
index 44385edf3bd..d6b0b310c65 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java
@@ -32,6 +32,7 @@ import org.junit.rules.ExpectedException;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
import org.sonar.api.web.UserRole;
+import org.sonar.core.permission.GlobalPermissions;
import org.sonar.core.util.Protobuf;
import org.sonar.db.DbTester;
import org.sonar.db.ce.CeActivityDto;
@@ -48,23 +49,24 @@ import org.sonar.server.ws.WsActionTester;
import org.sonar.test.JsonAssert;
import org.sonarqube.ws.MediaTypes;
import org.sonarqube.ws.WsCe;
+import org.sonarqube.ws.client.ce.CeWsParameters;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import static org.sonar.api.utils.DateUtils.formatDateTime;
import static org.sonar.db.component.ComponentTesting.newProjectDto;
import static org.sonarqube.ws.client.ce.CeWsParameters.PARAM_STATUS;
public class ActivityActionTest {
+ private static final long EXECUTED_AT = System2.INSTANCE.now();
@Rule
public ExpectedException expectedException = ExpectedException.none();
-
@Rule
public UserSessionRule userSession = UserSessionRule.standalone();
-
@Rule
public DbTester dbTester = DbTester.create(System2.INSTANCE);
@@ -72,7 +74,7 @@ public class ActivityActionTest {
CeLogging ceLogging = mock(CeLogging.class);
TaskFormatter formatter = new TaskFormatter(dbTester.getDbClient(), ceLogging, System2.INSTANCE);
- ActivityAction underTest = new ActivityAction(userSession, dbTester.getDbClient(), formatter, new CeTaskProcessor[]{mock(CeTaskProcessor.class)});
+ ActivityAction underTest = new ActivityAction(userSession, dbTester.getDbClient(), formatter, new CeTaskProcessor[] {mock(CeTaskProcessor.class)});
WsActionTester ws = new WsActionTester(underTest);
@Before
@@ -82,11 +84,12 @@ public class ActivityActionTest {
@Test
public void get_all_past_activity() {
- userSession.setGlobalPermissions(UserRole.ADMIN);
+ userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
insertActivity("T1", "PROJECT_1", CeActivityDto.Status.SUCCESS);
insertActivity("T2", "PROJECT_2", CeActivityDto.Status.FAILED);
TestResponse wsResponse = ws.newRequest()
+ .setParam(CeWsParameters.PARAM_MAX_EXECUTED_AT, formatDateTime(EXECUTED_AT + 2_000))
.setMediaType(MediaTypes.PROTOBUF)
.execute();
@@ -109,7 +112,7 @@ public class ActivityActionTest {
@Test
public void filter_by_status() {
- userSession.setGlobalPermissions(UserRole.ADMIN);
+ userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
insertActivity("T1", "PROJECT_1", CeActivityDto.Status.SUCCESS);
insertActivity("T2", "PROJECT_2", CeActivityDto.Status.FAILED);
insertQueue("T3", "PROJECT_1", CeQueueDto.Status.IN_PROGRESS);
@@ -126,8 +129,25 @@ public class ActivityActionTest {
}
@Test
+ public void filter_by_max_executed_at() {
+ userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+ insertActivity("T1", "PROJECT_1", CeActivityDto.Status.SUCCESS);
+ insertActivity("T2", "PROJECT_2", CeActivityDto.Status.FAILED);
+ insertQueue("T3", "PROJECT_1", CeQueueDto.Status.IN_PROGRESS);
+
+ TestResponse wsResponse = ws.newRequest()
+ .setParam("status", "FAILED,IN_PROGRESS,SUCCESS")
+ .setParam(CeWsParameters.PARAM_MAX_EXECUTED_AT, "2016-02-15")
+ .setMediaType(MediaTypes.PROTOBUF)
+ .execute();
+
+ WsCe.ActivityResponse activityResponse = Protobuf.read(wsResponse.getInputStream(), WsCe.ActivityResponse.parser());
+ assertThat(activityResponse.getTasksCount()).isEqualTo(0);
+ }
+
+ @Test
public void filter_on_current_activities() {
- userSession.setGlobalPermissions(UserRole.ADMIN);
+ userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
// T2 is the current activity (the most recent one)
insertActivity("T1", "PROJECT_1", CeActivityDto.Status.SUCCESS);
insertActivity("T2", "PROJECT_1", CeActivityDto.Status.FAILED);
@@ -145,7 +165,7 @@ public class ActivityActionTest {
@Test
public void paginate_results() {
- userSession.setGlobalPermissions(UserRole.ADMIN);
+ userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
insertActivity("T1", "PROJECT_1", CeActivityDto.Status.SUCCESS);
insertActivity("T2", "PROJECT_2", CeActivityDto.Status.FAILED);
insertQueue("T3", "PROJECT_1", CeQueueDto.Status.IN_PROGRESS);
@@ -202,7 +222,7 @@ public class ActivityActionTest {
componentDb.insertProjectAndSnapshot(newProjectDto().setName("eclipse").setUuid("P3"));
dbTester.commit();
componentDb.indexProjects();
- userSession.setGlobalPermissions(UserRole.ADMIN);
+ userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
insertActivity("T1", "P1", CeActivityDto.Status.SUCCESS);
insertActivity("T2", "P2", CeActivityDto.Status.SUCCESS);
insertActivity("T3", "P3", CeActivityDto.Status.SUCCESS);
@@ -239,8 +259,18 @@ public class ActivityActionTest {
}
@Test
+ public void fail_if_date_is_not_well_formatted() {
+ expectedException.expect(BadRequestException.class);
+ expectedException.expectMessage("Date 'ill-formatted-date' cannot be parsed as either a date or date+time");
+
+ ws.newRequest()
+ .setParam(CeWsParameters.PARAM_MAX_EXECUTED_AT, "ill-formatted-date")
+ .execute();
+ }
+
+ @Test
public void support_json_response() {
- userSession.setGlobalPermissions(UserRole.ADMIN);
+ userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
TestResponse wsResponse = ws.newRequest()
.setMediaType(MediaTypes.JSON)
.execute();
@@ -267,6 +297,7 @@ public class ActivityActionTest {
CeActivityDto activityDto = new CeActivityDto(queueDto);
activityDto.setStatus(status);
activityDto.setExecutionTimeMs(500L);
+ activityDto.setExecutedAt(EXECUTED_AT);
activityDto.setSnapshotId(123_456L);
dbTester.getDbClient().ceActivityDao().insert(dbTester.getSession(), activityDto);
dbTester.commit();