package org.apereo.cas.ticket.registry; import org.apereo.cas.authentication.CoreAuthenticationTestUtils; import org.apereo.cas.authentication.principal.Service; import org.apereo.cas.services.RegisteredServiceTestUtils; import org.apereo.cas.ticket.ServiceTicket; import org.apereo.cas.ticket.Ticket; import org.apereo.cas.ticket.TicketGrantingTicket; import org.apereo.cas.ticket.TicketGrantingTicketImpl; import org.apereo.cas.ticket.support.NeverExpiresExpirationPolicy; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.Collection; import static org.junit.Assert.*; /** * @author Scott Battaglia * @since 3.0.0 */ public abstract class AbstractTicketRegistryTests { private static final int TICKETS_IN_REGISTRY = 10; private static final String EXCEPTION_CAUGHT_NONE_EXPECTED = "Exception caught. None expected."; private static final String CAUGHT_AN_EXCEPTION_BUT_WAS_NOT_EXPECTED = "Caught an exception. But no exception should have been thrown: "; private TicketRegistry ticketRegistry; @Before public void setUp() throws Exception { this.ticketRegistry = this.getNewTicketRegistry(); if (ticketRegistry != null) { this.ticketRegistry.deleteAll(); } } /** * Abstract method to retrieve a new ticket registry. Implementing classes * return the TicketRegistry they wish to test. * * @return the TicketRegistry we wish to test * @throws Exception the exception */ public abstract TicketRegistry getNewTicketRegistry() throws Exception; /** * Method to add a TicketGrantingTicket to the ticket cache. This should add * the ticket and return. Failure upon any exception. */ @Test public void verifyAddTicketToCache() { try { this.ticketRegistry.addTicket(new TicketGrantingTicketImpl(TicketGrantingTicket.PREFIX, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy())); } catch (final Exception e) { fail(EXCEPTION_CAUGHT_NONE_EXPECTED); } } @Test public void verifyGetNullTicket() { try { this.ticketRegistry.getTicket(null, TicketGrantingTicket.class); } catch (final Exception e) { fail(EXCEPTION_CAUGHT_NONE_EXPECTED); } } @Test public void verifyGetNonExistingTicket() { try { this.ticketRegistry.getTicket("FALALALALALAL", TicketGrantingTicket.class); } catch (final Exception e) { fail(EXCEPTION_CAUGHT_NONE_EXPECTED); } } @Test public void verifyGetExistingTicketWithProperClass() { try { this.ticketRegistry.addTicket(new TicketGrantingTicketImpl(TicketGrantingTicket.PREFIX, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy())); this.ticketRegistry.getTicket(TicketGrantingTicket.PREFIX, TicketGrantingTicket.class); } catch (final Exception e) { fail(EXCEPTION_CAUGHT_NONE_EXPECTED); } } @Test public void verifyGetExistingTicketWithImproperClass() { try { this.ticketRegistry.addTicket(new TicketGrantingTicketImpl(TicketGrantingTicket.PREFIX, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy())); this.ticketRegistry.getTicket(TicketGrantingTicket.PREFIX, ServiceTicket.class); } catch (final ClassCastException e) { return; } fail("ClassCastException expected."); } @Test public void verifyGetNullTicketWithoutClass() { try { this.ticketRegistry.getTicket(null); } catch (final Exception e) { fail(EXCEPTION_CAUGHT_NONE_EXPECTED); } } @Test public void verifyGetNonExistingTicketWithoutClass() { try { this.ticketRegistry.getTicket("FALALALALALAL"); } catch (final Exception e) { fail(EXCEPTION_CAUGHT_NONE_EXPECTED); } } @Test public void verifyGetExistingTicket() { try { this.ticketRegistry.addTicket(new TicketGrantingTicketImpl(TicketGrantingTicket.PREFIX, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy())); this.ticketRegistry.getTicket(TicketGrantingTicket.PREFIX); } catch (final Exception e) { fail(CAUGHT_AN_EXCEPTION_BUT_WAS_NOT_EXPECTED + e.getMessage()); } } @Test public void verifyDeleteAllExistingTickets() { try { for (int i = 0; i < TICKETS_IN_REGISTRY; i++) { this.ticketRegistry.addTicket(new TicketGrantingTicketImpl(TicketGrantingTicket.PREFIX + i, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy())); } assertEquals(TICKETS_IN_REGISTRY, this.ticketRegistry.deleteAll()); } catch (final Exception e) { fail(CAUGHT_AN_EXCEPTION_BUT_WAS_NOT_EXPECTED + e.getMessage()); } } @Test public void verifyDeleteExistingTicket() { try { this.ticketRegistry.addTicket(new TicketGrantingTicketImpl(TicketGrantingTicket.PREFIX, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy())); assertSame(1, this.ticketRegistry.deleteTicket(TicketGrantingTicket.PREFIX)); } catch (final Exception e) { fail(CAUGHT_AN_EXCEPTION_BUT_WAS_NOT_EXPECTED + e.getMessage()); } } @Test public void verifyDeleteNonExistingTicket() { try { this.ticketRegistry.addTicket(new TicketGrantingTicketImpl(TicketGrantingTicket.PREFIX, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy())); assertSame(0, this.ticketRegistry.deleteTicket(TicketGrantingTicket.PREFIX + "1")); } catch (final Exception e) { fail(EXCEPTION_CAUGHT_NONE_EXPECTED); } } @Test public void verifyDeleteNullTicket() { try { this.ticketRegistry.addTicket(new TicketGrantingTicketImpl(TicketGrantingTicket.PREFIX, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy())); assertFalse("Ticket was deleted.", this.ticketRegistry.deleteTicket(null) == 1); } catch (final Exception e) { fail(EXCEPTION_CAUGHT_NONE_EXPECTED); } } @Test public void verifyGetTicketsIsZero() { try { assertEquals("The size of the empty registry is not zero.", 0, this.ticketRegistry.getTickets().size()); } catch (final Exception e) { fail(EXCEPTION_CAUGHT_NONE_EXPECTED); } } @Test public void verifyGetTicketsFromRegistryEqualToTicketsAdded() { final Collection<Ticket> tickets = new ArrayList<>(); for (int i = 0; i < TICKETS_IN_REGISTRY; i++) { final TicketGrantingTicket ticketGrantingTicket = new TicketGrantingTicketImpl(TicketGrantingTicket.PREFIX + i, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy()); final ServiceTicket st = ticketGrantingTicket.grantServiceTicket("ST" + i, RegisteredServiceTestUtils.getService(), new NeverExpiresExpirationPolicy(), false, true); tickets.add(ticketGrantingTicket); tickets.add(st); this.ticketRegistry.addTicket(ticketGrantingTicket); this.ticketRegistry.addTicket(st); } try { final Collection<Ticket> ticketRegistryTickets = this.ticketRegistry.getTickets(); assertEquals("The size of the registry is not the same as the collection.", tickets.size(), ticketRegistryTickets.size()); tickets.stream().filter(ticket -> !ticketRegistryTickets.contains(ticket)) .forEach(ticket -> fail("Ticket was added to registry but was not found in retrieval of collection of all tickets.")); } catch (final Exception e) { fail(EXCEPTION_CAUGHT_NONE_EXPECTED); } } @Test public void verifyDeleteTicketWithChildren() { try { this.ticketRegistry.addTicket(new TicketGrantingTicketImpl(TicketGrantingTicket.PREFIX + "1", CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy())); final TicketGrantingTicket tgt = this.ticketRegistry.getTicket(TicketGrantingTicket.PREFIX + "1", TicketGrantingTicket.class); final Service service = RegisteredServiceTestUtils.getService("TGT_DELETE_TEST"); final ServiceTicket st1 = tgt.grantServiceTicket( "ST11", service, new NeverExpiresExpirationPolicy(), false, false); final ServiceTicket st2 = tgt.grantServiceTicket( "ST21", service, new NeverExpiresExpirationPolicy(), false, false); final ServiceTicket st3 = tgt.grantServiceTicket( "ST31", service, new NeverExpiresExpirationPolicy(), false, false); this.ticketRegistry.addTicket(st1); this.ticketRegistry.addTicket(st2); this.ticketRegistry.addTicket(st3); assertNotNull(this.ticketRegistry.getTicket(TicketGrantingTicket.PREFIX + "1", TicketGrantingTicket.class)); assertNotNull(this.ticketRegistry.getTicket("ST11", ServiceTicket.class)); assertNotNull(this.ticketRegistry.getTicket("ST21", ServiceTicket.class)); assertNotNull(this.ticketRegistry.getTicket("ST31", ServiceTicket.class)); this.ticketRegistry.updateTicket(tgt); assertSame(4, this.ticketRegistry.deleteTicket(tgt.getId())); assertNull(this.ticketRegistry.getTicket(TicketGrantingTicket.PREFIX + "1", TicketGrantingTicket.class)); assertNull(this.ticketRegistry.getTicket("ST11", ServiceTicket.class)); assertNull(this.ticketRegistry.getTicket("ST21", ServiceTicket.class)); assertNull(this.ticketRegistry.getTicket("ST31", ServiceTicket.class)); } catch (final Exception e) { fail(CAUGHT_AN_EXCEPTION_BUT_WAS_NOT_EXPECTED + e.getMessage()); } } }