diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2016-02-16 15:46:12 +0100 |
---|---|---|
committer | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2016-02-16 15:46:30 +0100 |
commit | 7d0f619f33a47ea1755e993df0e2084ba2a6f074 (patch) | |
tree | 6e7936131ca0984db45317079461a16a81cc7aff /server | |
parent | 4621ff0206176da5af9fc8c1c704a2ca5aded1ad (diff) | |
download | sonarqube-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.java | 28 | ||||
-rw-r--r-- | server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java | 49 |
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(); |