package org.apereo.cas.ticket; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.apache.commons.io.FileUtils; import org.apereo.cas.authentication.Authentication; import org.apereo.cas.authentication.CoreAuthenticationTestUtils; import org.apereo.cas.authentication.principal.Service; import org.apereo.cas.services.RegisteredServiceTestUtils; import org.apereo.cas.ticket.support.MultiTimeUseOrTimeoutExpirationPolicy; import org.apereo.cas.ticket.support.NeverExpiresExpirationPolicy; import org.apereo.cas.util.DefaultUniqueTicketIdGenerator; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.io.File; import java.io.IOException; import static org.junit.Assert.*; /** * @author Scott Battaglia * @since 3.0.0 */ public class ServiceTicketImplTests { private static final String ST_ID = "stest1"; private static final File ST_JSON_FILE = new File(FileUtils.getTempDirectoryPath(), "st.json"); private static final String ID = "test"; @Rule public ExpectedException thrown = ExpectedException.none(); private final TicketGrantingTicketImpl tgt = new TicketGrantingTicketImpl(ID, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy()); private final UniqueTicketIdGenerator idGenerator = new DefaultUniqueTicketIdGenerator(); private ObjectMapper mapper; @Before public void setUp() throws Exception { // needed in order to serialize ZonedDateTime class mapper = Jackson2ObjectMapperBuilder.json() .featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE) .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) .build(); mapper.findAndRegisterModules(); } @Test public void verifySerializeToJson() throws IOException { final ServiceTicket stWritten = new ServiceTicketImpl(ST_ID, tgt, RegisteredServiceTestUtils.getService(), true, new NeverExpiresExpirationPolicy()); mapper.writeValue(ST_JSON_FILE, stWritten); final ServiceTicketImpl stRead = mapper.readValue(ST_JSON_FILE, ServiceTicketImpl.class); assertEquals(stWritten, stRead); } @Test public void verifyNoService() { this.thrown.expect(Exception.class); this.thrown.expectMessage("service cannot be null"); new ServiceTicketImpl(ST_ID, tgt, null, false, new NeverExpiresExpirationPolicy()); } @Test public void verifyNoTicket() { this.thrown.expect(Exception.class); this.thrown.expectMessage("ticket cannot be null"); new ServiceTicketImpl(ST_ID, null, CoreAuthenticationTestUtils.getService(), false, new NeverExpiresExpirationPolicy()); } @Test public void verifyIsFromNewLoginTrue() { final ServiceTicket s = new ServiceTicketImpl(ST_ID, tgt, CoreAuthenticationTestUtils.getService(), true, new NeverExpiresExpirationPolicy()); assertTrue(s.isFromNewLogin()); } @Test public void verifyIsFromNewLoginFalse() { ServiceTicket s = tgt.grantServiceTicket(ST_ID, CoreAuthenticationTestUtils.getService(), new NeverExpiresExpirationPolicy(), false, false); assertTrue(s.isFromNewLogin()); s = tgt.grantServiceTicket(ST_ID, CoreAuthenticationTestUtils.getService(), new NeverExpiresExpirationPolicy(), false, false); assertFalse(s.isFromNewLogin()); } @Test public void verifyGetService() { final Service simpleService = CoreAuthenticationTestUtils.getService(); final ServiceTicket s = new ServiceTicketImpl(ST_ID, tgt, simpleService, false, new NeverExpiresExpirationPolicy()); assertEquals(simpleService, s.getService()); } @Test public void verifyGetTicket() { final Service simpleService = CoreAuthenticationTestUtils.getService(); final ServiceTicket s = new ServiceTicketImpl(ST_ID, tgt, simpleService, false, new NeverExpiresExpirationPolicy()); assertEquals(tgt, s.getGrantingTicket()); } @Test public void verifyIsExpiredTrueBecauseOfRoot() { final TicketGrantingTicket t = new TicketGrantingTicketImpl(ID, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy()); final ServiceTicket s = t.grantServiceTicket(idGenerator.getNewTicketId(ServiceTicket.PREFIX), CoreAuthenticationTestUtils.getService(), new NeverExpiresExpirationPolicy(), false, true); t.markTicketExpired(); assertTrue(s.isExpired()); } @Test public void verifyIsExpiredFalse() { final TicketGrantingTicket t = new TicketGrantingTicketImpl(ID, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy()); final ServiceTicket s = t.grantServiceTicket(idGenerator.getNewTicketId(ServiceTicket.PREFIX), CoreAuthenticationTestUtils.getService(), new MultiTimeUseOrTimeoutExpirationPolicy(1, 5000), false, true); assertFalse(s.isExpired()); } @Test public void verifyTicketGrantingTicket() throws AbstractTicketException { final Authentication a = CoreAuthenticationTestUtils.getAuthentication(); final TicketGrantingTicket t = new TicketGrantingTicketImpl(ID, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy()); final ServiceTicket s = t.grantServiceTicket(idGenerator.getNewTicketId(ServiceTicket.PREFIX), CoreAuthenticationTestUtils.getService(), new MultiTimeUseOrTimeoutExpirationPolicy(1, 5000), false, true); final TicketGrantingTicket t1 = s.grantProxyGrantingTicket(idGenerator.getNewTicketId(TicketGrantingTicket.PREFIX), a, new NeverExpiresExpirationPolicy()); assertEquals(a, t1.getAuthentication()); } @Test public void verifyTicketGrantingTicketGrantedTwice() throws AbstractTicketException { final Authentication a = CoreAuthenticationTestUtils.getAuthentication(); final TicketGrantingTicket t = new TicketGrantingTicketImpl(ID, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy()); final ServiceTicket s = t.grantServiceTicket(idGenerator.getNewTicketId(ServiceTicket.PREFIX), CoreAuthenticationTestUtils.getService(), new MultiTimeUseOrTimeoutExpirationPolicy(1, 5000), false, true); s.grantProxyGrantingTicket(idGenerator.getNewTicketId(TicketGrantingTicket.PREFIX), a, new NeverExpiresExpirationPolicy()); this.thrown.expect(Exception.class); s.grantProxyGrantingTicket(idGenerator.getNewTicketId(TicketGrantingTicket.PREFIX), a, new NeverExpiresExpirationPolicy()); } }