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;
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;
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;
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()) {
}
}
+ @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);
}
.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));
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;
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);
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
@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();
@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);
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);
@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);
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);
.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();
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();