]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-7187 WS api/ce/activity parse date and date time parameters
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Tue, 16 Feb 2016 14:46:12 +0000 (15:46 +0100)
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Tue, 16 Feb 2016 14:46:30 +0000 (15:46 +0100)
server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActivityAction.java
server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActivityActionTest.java

index 0ca8d174c46c384100b390b28d6303f5bced4082..a75efc58f58fa4eb31d518ba1249d177ff6921bf 100644 (file)
@@ -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));
index 44385edf3bd6e28eae990cce585b2b09e04c4e7e..d6b0b310c654db1e2f75bef706f41bdf7003869b 100644 (file)
@@ -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);
@@ -125,9 +128,26 @@ public class ActivityActionTest {
     assertThat(activityResponse.getTasks(1).getId()).isEqualTo("T2");
   }
 
+  @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);
@@ -238,9 +258,19 @@ public class ActivityActionTest {
       .execute();
   }
 
+  @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();