package org.apereo.cas.ticket.registry;
import org.apereo.cas.AbstractMemcachedTests;
import org.apereo.cas.authentication.Authentication;
import org.apereo.cas.authentication.CoreAuthenticationTestUtils;
import org.apereo.cas.authentication.principal.Service;
import org.apereo.cas.mock.MockServiceTicket;
import org.apereo.cas.mock.MockTicketGrantingTicket;
import org.apereo.cas.services.RegisteredServiceTestUtils;
import org.apereo.cas.ticket.ServiceTicket;
import org.apereo.cas.ticket.TicketGrantingTicket;
import org.apereo.cas.ticket.TicketGrantingTicketImpl;
import org.apereo.cas.ticket.proxy.ProxyGrantingTicket;
import org.apereo.cas.ticket.support.AlwaysExpiresExpirationPolicy;
import org.apereo.cas.ticket.support.NeverExpiresExpirationPolicy;
import org.junit.Assume;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import static org.junit.Assert.*;
/**
* Unit test for MemCacheTicketRegistry class.
*
* @author Middleware Services
* @since 3.0.0
*/
@RunWith(Parameterized.class)
public class MemCacheTicketRegistryTests extends AbstractMemcachedTests {
private static final Logger LOGGER = LoggerFactory.getLogger(MemCacheTicketRegistryTests.class);
private static final String TGT_ID = "TGT";
private static final String ST_1_ID = "ST1";
private static final String PGT_1_ID = "PGT-1";
private MemCacheTicketRegistry registry;
private final String registryBean;
public MemCacheTicketRegistryTests(final String beanName) {
registryBean = beanName;
}
@Parameterized.Parameters
public static Collection<Object> getTestParameters() throws Exception {
return Arrays.asList(new Object[]{"testCase1"}, new Object[]{"testCase2"});
}
@Before
public void setUp() throws IOException {
final boolean environmentOk = isMemcachedListening();
if (!environmentOk) {
LOGGER.warn("Aborting test since no memcached server is available on localhost.");
}
Assume.assumeTrue(environmentOk);
final ApplicationContext context = new ClassPathXmlApplicationContext("/ticketRegistry-test.xml");
registry = context.getBean(registryBean, MemCacheTicketRegistry.class);
}
@Test
public void verifyWriteGetDelete() throws Exception {
final String id = "ST-1234567890ABCDEFGHIJKL123-crud";
final ServiceTicket ticket = new MockServiceTicket(id, RegisteredServiceTestUtils.getService(),
new MockTicketGrantingTicket("test"));
registry.addTicket(ticket);
final ServiceTicket ticketFromRegistry = (ServiceTicket) registry.getTicket(id);
assertNotNull(ticketFromRegistry);
assertEquals(id, ticketFromRegistry.getId());
registry.deleteTicket(id);
assertNull(registry.getTicket(id));
}
@Test
public void verifyExpiration() throws Exception {
final String id = "ST-1234567890ABCDEFGHIJKL-exp1";
final MockServiceTicket ticket = new MockServiceTicket(id, RegisteredServiceTestUtils.getService(), new MockTicketGrantingTicket("test"));
ticket.setExpiration(new AlwaysExpiresExpirationPolicy());
registry.addTicket(ticket);
Thread.sleep(1500);
assertNull(registry.getTicket(id, ServiceTicket.class));
}
@Test
public void verifyDeleteTicketWithChildren() throws Exception {
this.registry.addTicket(new TicketGrantingTicketImpl(TGT_ID, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy()));
final TicketGrantingTicket tgt = this.registry.getTicket(TGT_ID, TicketGrantingTicket.class);
final Service service = RegisteredServiceTestUtils.getService("TGT_DELETE_TEST");
final ServiceTicket st1 = tgt.grantServiceTicket(ST_1_ID, service, new NeverExpiresExpirationPolicy(), false, false);
final ServiceTicket st2 = tgt.grantServiceTicket("ST2", service, new NeverExpiresExpirationPolicy(), false, false);
final ServiceTicket st3 = tgt.grantServiceTicket("ST3", service, new NeverExpiresExpirationPolicy(), false, false);
this.registry.addTicket(st1);
this.registry.addTicket(st2);
this.registry.addTicket(st3);
this.registry.updateTicket(tgt);
assertNotNull(this.registry.getTicket(TGT_ID, TicketGrantingTicket.class));
assertNotNull(this.registry.getTicket(ST_1_ID, ServiceTicket.class));
assertNotNull(this.registry.getTicket("ST2", ServiceTicket.class));
assertNotNull(this.registry.getTicket("ST3", ServiceTicket.class));
this.registry.deleteTicket(tgt.getId());
assertNull(this.registry.getTicket(TGT_ID, TicketGrantingTicket.class));
assertNull(this.registry.getTicket(ST_1_ID, ServiceTicket.class));
assertNull(this.registry.getTicket("ST2", ServiceTicket.class));
assertNull(this.registry.getTicket("ST3", ServiceTicket.class));
}
@Test
public void verifyDeleteTicketWithPGT() {
final Authentication a = CoreAuthenticationTestUtils.getAuthentication();
this.registry.addTicket(new TicketGrantingTicketImpl(TGT_ID, a, new NeverExpiresExpirationPolicy()));
final TicketGrantingTicket tgt = this.registry.getTicket(TGT_ID, TicketGrantingTicket.class);
final Service service = RegisteredServiceTestUtils.getService("TGT_DELETE_TEST");
final ServiceTicket st1 = tgt.grantServiceTicket(ST_1_ID, service, new NeverExpiresExpirationPolicy(), false, true);
this.registry.addTicket(st1);
this.registry.updateTicket(tgt);
assertNotNull(this.registry.getTicket(TGT_ID, TicketGrantingTicket.class));
assertNotNull(this.registry.getTicket(ST_1_ID, ServiceTicket.class));
final ProxyGrantingTicket pgt = st1.grantProxyGrantingTicket(PGT_1_ID, a, new NeverExpiresExpirationPolicy());
this.registry.addTicket(pgt);
this.registry.updateTicket(tgt);
this.registry.updateTicket(st1);
assertEquals(pgt.getGrantingTicket(), tgt);
assertNotNull(this.registry.getTicket(PGT_1_ID, ProxyGrantingTicket.class));
assertEquals(a, pgt.getAuthentication());
assertNotNull(this.registry.getTicket(ST_1_ID, ServiceTicket.class));
assertTrue(this.registry.deleteTicket(tgt.getId()) > 0);
assertNull(this.registry.getTicket(TGT_ID, TicketGrantingTicket.class));
assertNull(this.registry.getTicket(ST_1_ID, ServiceTicket.class));
assertNull(this.registry.getTicket(PGT_1_ID, ProxyGrantingTicket.class));
}
}