package org.apereo.cas.ticket.registry;
import org.apereo.cas.authentication.Authentication;
import org.apereo.cas.authentication.CoreAuthenticationTestUtils;
import org.apereo.cas.authentication.principal.Service;
import org.apereo.cas.config.CasCoreAuthenticationConfiguration;
import org.apereo.cas.config.CasCoreAuthenticationHandlersConfiguration;
import org.apereo.cas.config.CasCoreAuthenticationMetadataConfiguration;
import org.apereo.cas.config.CasCoreAuthenticationPolicyConfiguration;
import org.apereo.cas.config.CasCoreAuthenticationPrincipalConfiguration;
import org.apereo.cas.config.CasCoreAuthenticationServiceSelectionStrategyConfiguration;
import org.apereo.cas.config.CasCoreAuthenticationSupportConfiguration;
import org.apereo.cas.config.CasCoreConfiguration;
import org.apereo.cas.config.CasCoreHttpConfiguration;
import org.apereo.cas.config.CasCoreServicesConfiguration;
import org.apereo.cas.config.CasCoreTicketCatalogConfiguration;
import org.apereo.cas.config.CasCoreTicketsConfiguration;
import org.apereo.cas.config.CasPersonDirectoryConfiguration;
import org.apereo.cas.config.HazelcastTicketRegistryTicketCatalogConfiguration;
import org.apereo.cas.config.support.EnvironmentConversionServiceInitializer;
import org.apereo.cas.logout.config.CasCoreLogoutConfiguration;
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.Ticket;
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.NeverExpiresExpirationPolicy;
import org.apereo.cas.util.SchedulingUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.PostConstruct;
import java.util.Collection;
import static org.junit.Assert.*;
/**
* Unit tests for {@link HazelcastTicketRegistry}.
*
* @author Dmitriy Kopylenko
* @since 4.1.0
*/
@RunWith(SpringRunner.class)
@ContextConfiguration(initializers = EnvironmentConversionServiceInitializer.class, locations = {"classpath:HazelcastTicketRegistryTests-context.xml"})
@SpringBootTest(classes = {
HazelcastTicketRegistryReplicationTests.HazelcastTestConfiguration.class,
RefreshAutoConfiguration.class,
CasCoreTicketsConfiguration.class,
CasCoreLogoutConfiguration.class,
CasCoreHttpConfiguration.class,
CasCoreServicesConfiguration.class,
CasCoreConfiguration.class,
CasCoreAuthenticationServiceSelectionStrategyConfiguration.class,
CasCoreAuthenticationConfiguration.class,
CasCoreAuthenticationPrincipalConfiguration.class,
CasCoreAuthenticationPolicyConfiguration.class,
CasCoreAuthenticationMetadataConfiguration.class,
CasCoreAuthenticationHandlersConfiguration.class,
CasCoreAuthenticationSupportConfiguration.class,
CasPersonDirectoryConfiguration.class,
HazelcastTicketRegistryTicketCatalogConfiguration.class,
CasCoreTicketCatalogConfiguration.class})
public class HazelcastTicketRegistryReplicationTests {
private static final String TGT_ID = "TGT";
private static final String ST_ID_1 = "ST1";
private static final String PGT_ID_1 = "PGT-1";
@Autowired
@Qualifier("hzTicketRegistry1")
private TicketRegistry hzTicketRegistry1;
@Autowired
@Qualifier("hzTicketRegistry2")
private TicketRegistry hzTicketRegistry2;
public void setHzTicketRegistry1(final HazelcastTicketRegistry hzTicketRegistry1) {
this.hzTicketRegistry1 = hzTicketRegistry1;
}
public void setHzTicketRegistry2(final HazelcastTicketRegistry hzTicketRegistry2) {
this.hzTicketRegistry2 = hzTicketRegistry2;
}
@TestConfiguration
public static class HazelcastTestConfiguration {
@Autowired
protected ApplicationContext applicationContext;
@PostConstruct
public void init() {
SchedulingUtils.prepScheduledAnnotationBeanPostProcessor(applicationContext);
}
}
@Test
public void retrieveCollectionOfTickets() {
Collection<Ticket> col = this.hzTicketRegistry1.getTickets();
col.forEach(ticket -> this.hzTicketRegistry1.deleteTicket(ticket.getId()));
col = hzTicketRegistry2.getTickets();
assertEquals(0, col.size());
final TicketGrantingTicket tgt = newTestTgt();
this.hzTicketRegistry1.addTicket(tgt);
this.hzTicketRegistry1.addTicket(newTestSt(tgt));
col = hzTicketRegistry2.getTickets();
assertEquals(2, col.size());
assertEquals(1, hzTicketRegistry2.serviceTicketCount());
assertEquals(1, hzTicketRegistry2.sessionCount());
}
@Test
public void basicOperationsAndClustering() throws Exception {
final TicketGrantingTicket tgt = newTestTgt();
this.hzTicketRegistry1.addTicket(tgt);
assertNotNull(this.hzTicketRegistry1.getTicket(tgt.getId()));
assertNotNull(this.hzTicketRegistry2.getTicket(tgt.getId()));
assertEquals(1, this.hzTicketRegistry2.deleteTicket(tgt.getId()));
assertEquals(0, this.hzTicketRegistry1.deleteTicket(tgt.getId()));
assertNull(this.hzTicketRegistry1.getTicket(tgt.getId()));
assertNull(this.hzTicketRegistry2.getTicket(tgt.getId()));
final ServiceTicket st = newTestSt(tgt);
this.hzTicketRegistry2.addTicket(st);
assertNotNull(this.hzTicketRegistry1.getTicket("ST-TEST"));
assertNotNull(this.hzTicketRegistry2.getTicket("ST-TEST"));
assertEquals(1, this.hzTicketRegistry1.deleteTicket("ST-TEST"));
assertNull(this.hzTicketRegistry1.getTicket("ST-TEST"));
assertNull(this.hzTicketRegistry2.getTicket("ST-TEST"));
}
@Test
public void verifyDeleteTicketWithChildren() throws Exception {
this.hzTicketRegistry1.addTicket(new TicketGrantingTicketImpl(TGT_ID, CoreAuthenticationTestUtils.getAuthentication(),
new NeverExpiresExpirationPolicy()));
final TicketGrantingTicket tgt = this.hzTicketRegistry1.getTicket(TGT_ID, TicketGrantingTicket.class);
final Service service = RegisteredServiceTestUtils.getService("TGT_DELETE_TEST");
final ServiceTicket st1 = tgt.grantServiceTicket(ST_ID_1, 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.hzTicketRegistry1.addTicket(st1);
this.hzTicketRegistry1.addTicket(st2);
this.hzTicketRegistry1.addTicket(st3);
this.hzTicketRegistry1.updateTicket(tgt);
assertNotNull(this.hzTicketRegistry1.getTicket(tgt.getId(), TicketGrantingTicket.class));
assertNotNull(this.hzTicketRegistry1.getTicket(ST_ID_1, ServiceTicket.class));
assertNotNull(this.hzTicketRegistry1.getTicket("ST2", ServiceTicket.class));
assertNotNull(this.hzTicketRegistry1.getTicket("ST3", ServiceTicket.class));
assertTrue("TGT and children were deleted", this.hzTicketRegistry1.deleteTicket(tgt.getId()) > 0);
assertNull(this.hzTicketRegistry1.getTicket(tgt.getId(), TicketGrantingTicket.class));
assertNull(this.hzTicketRegistry1.getTicket(ST_ID_1, ServiceTicket.class));
assertNull(this.hzTicketRegistry1.getTicket("ST2", ServiceTicket.class));
assertNull(this.hzTicketRegistry1.getTicket("ST3", ServiceTicket.class));
}
@Test
public void verifyDeleteTicketWithPGT() {
final Authentication a = CoreAuthenticationTestUtils.getAuthentication();
this.hzTicketRegistry1.addTicket(new TicketGrantingTicketImpl(TGT_ID, a, new NeverExpiresExpirationPolicy()));
final TicketGrantingTicket tgt = this.hzTicketRegistry1.getTicket(TGT_ID, TicketGrantingTicket.class);
final Service service = RegisteredServiceTestUtils.getService("TGT_DELETE_TEST");
final ServiceTicket st1 = tgt.grantServiceTicket(ST_ID_1, service, new NeverExpiresExpirationPolicy(), false, true);
this.hzTicketRegistry1.addTicket(st1);
assertNotNull(this.hzTicketRegistry1.getTicket(TGT_ID, TicketGrantingTicket.class));
assertNotNull(this.hzTicketRegistry1.getTicket(ST_ID_1, ServiceTicket.class));
final ProxyGrantingTicket pgt = st1.grantProxyGrantingTicket(PGT_ID_1, a, new NeverExpiresExpirationPolicy());
assertEquals(a, pgt.getAuthentication());
this.hzTicketRegistry1.addTicket(pgt);
this.hzTicketRegistry1.updateTicket(tgt);
assertSame(3, this.hzTicketRegistry1.deleteTicket(tgt.getId()));
assertNull(this.hzTicketRegistry1.getTicket(TGT_ID, TicketGrantingTicket.class));
assertNull(this.hzTicketRegistry1.getTicket(ST_ID_1, ServiceTicket.class));
assertNull(this.hzTicketRegistry1.getTicket(PGT_ID_1, ProxyGrantingTicket.class));
}
private static TicketGrantingTicket newTestTgt() {
return new MockTicketGrantingTicket("casuser");
}
private static ServiceTicket newTestSt(final TicketGrantingTicket tgt) {
return new MockServiceTicket("ST-TEST", RegisteredServiceTestUtils.getService(), tgt);
}
}