package com.hubspot.singularity.data; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.catchThrowable; import javax.ws.rs.WebApplicationException; import org.junit.Assert; import org.junit.Test; import com.google.common.base.Optional; import com.google.inject.Inject; import com.hubspot.deploy.HealthcheckOptions; import com.hubspot.deploy.HealthcheckOptionsBuilder; import com.hubspot.singularity.RequestType; import com.hubspot.singularity.SingularityDeploy; import com.hubspot.singularity.SingularityRequest; import com.hubspot.singularity.SingularityRequestBuilder; import com.hubspot.singularity.SingularityTestBaseNoDb; public class ValidatorTest extends SingularityTestBaseNoDb { @Inject private SingularityValidator validator; /** * Standard cron: day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0) * Quartz: 1-7 or SUN-SAT */ @Test public void testCronExpressionHandlesDayIndexing() { Assert.assertEquals("0 0 12 ? * SUN", validator.getQuartzScheduleFromCronSchedule("0 12 * * 7")); Assert.assertEquals("0 0 12 ? * SAT", validator.getQuartzScheduleFromCronSchedule("0 12 * * 6")); Assert.assertEquals("0 0 12 ? * SUN", validator.getQuartzScheduleFromCronSchedule("0 12 * * 0")); Assert.assertEquals("0 0 12 ? * SUN-FRI", validator.getQuartzScheduleFromCronSchedule("0 12 * * 0-5")); Assert.assertEquals("0 0 12 ? * SUN,MON,TUE,WED", validator.getQuartzScheduleFromCronSchedule("0 12 * * 0,1,2,3")); Assert.assertEquals("0 0 12 ? * MON,TUE,WED", validator.getQuartzScheduleFromCronSchedule("0 12 * * MON,TUE,WED")); Assert.assertEquals("0 0 12 ? * MON-WED", validator.getQuartzScheduleFromCronSchedule("0 12 * * MON-WED")); } @Test(expected = WebApplicationException.class) public void itForbidsBracketCharactersInDeployIds() throws Exception { final String badDeployId = "deployKey[["; SingularityDeploy singularityDeploy = SingularityDeploy.newBuilder(badDeployId, badDeployId).build(); SingularityRequest singularityRequest = new SingularityRequestBuilder(badDeployId, RequestType.SERVICE).build(); validator.checkDeploy(singularityRequest, singularityDeploy); } @Test public void itForbidsQuotesInDeployIds() throws Exception { final String badDeployId = "deployKey'"; SingularityDeploy singularityDeploy = SingularityDeploy.newBuilder(badDeployId, badDeployId).build(); SingularityRequest singularityRequest = new SingularityRequestBuilder(badDeployId, RequestType.SERVICE).build(); WebApplicationException exn = (WebApplicationException) catchThrowable(() -> validator.checkDeploy(singularityRequest, singularityDeploy)); assertThat((String) exn.getResponse().getEntity()) .contains("[a-zA-Z0-9_]"); } @Test public void itForbidsHealthCheckStartupDelaysLongerThanKillWait() { // Default kill wait time is 10 minutes (600 seconds) HealthcheckOptions healthCheck = new HealthcheckOptionsBuilder("/") .setPortNumber(Optional.of(8080L)) .setStartupDelaySeconds(Optional.of(10000)) .build(); SingularityDeploy deploy = SingularityDeploy .newBuilder("1234567", "1234567") .setHealthcheck(Optional.of(healthCheck)) .build(); SingularityRequest request = new SingularityRequestBuilder("1234567", RequestType.SERVICE).build(); WebApplicationException exn = (WebApplicationException) catchThrowable(() -> validator.checkDeploy(request, deploy)); assertThat((String) exn.getResponse().getEntity()) .contains("Health check startup delay"); } }