package org.apereo.cas.services; import org.apereo.cas.authentication.principal.Principal; import org.apereo.cas.authentication.principal.Service; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import static org.junit.Assert.*; /** * @author battags * @since 3.0.0 */ public class DefaultServicesManagerTests { private static final String TEST = "test"; private ServicesManager defaultServicesManager; private ServiceRegistryDao dao; @Before public void setUp() throws Exception { final List<RegisteredService> list = new ArrayList<>(); final RegexRegisteredService r = new RegexRegisteredService(); r.setId(2500); r.setServiceId("serviceId"); r.setName("serviceName"); r.setEvaluationOrder(1000); list.add(r); dao = new InMemoryServiceRegistry(list); this.defaultServicesManager = new DefaultServicesManager(dao); this.defaultServicesManager.load(); } @Test public void verifySaveAndGet() { final RegexRegisteredService r = new RegexRegisteredService(); r.setId(1000); r.setName(TEST); r.setServiceId(TEST); this.defaultServicesManager.save(r); assertNotNull(this.defaultServicesManager.findServiceBy(1000)); } @Test public void verifyMultiServicesBySameNameAndServiceId() { RegexRegisteredService r = new RegexRegisteredService(); r.setId(666); r.setName("testServiceName"); r.setServiceId("testServiceA"); this.defaultServicesManager.save(r); r = new RegexRegisteredService(); r.setId(999); r.setName("testServiceName"); r.setServiceId("testServiceA"); this.defaultServicesManager.save(r); /* Added 2 above, plus another that is added during @Setup */ assertEquals(3, this.defaultServicesManager.getAllServices().size()); } @Test public void verifySaveWithReturnedPersistedInstance() { final RegexRegisteredService r = new RegexRegisteredService(); r.setId(1000L); r.setName(TEST); r.setServiceId(TEST); final RegisteredService persistedRs = this.defaultServicesManager.save(r); assertNotNull(persistedRs); assertEquals(1000L, persistedRs.getId()); } @Test public void verifyDeleteAndGet() { final RegexRegisteredService r = new RegexRegisteredService(); r.setId(1000); r.setName(TEST); r.setServiceId(TEST); this.defaultServicesManager.save(r); assertEquals(r, this.defaultServicesManager.findServiceBy(r.getId())); this.defaultServicesManager.delete(r.getId()); assertNull(this.defaultServicesManager.findServiceBy(r.getId())); } @Test public void verifyDeleteNotExistentService() { assertNull(this.defaultServicesManager.delete(1500)); } @Test public void verifyMatchesExistingService() { final RegexRegisteredService r = new RegexRegisteredService(); r.setId(1000); r.setName(TEST); r.setServiceId(TEST); final Service service = new SimpleService(TEST); final Service service2 = new SimpleService("fdfa"); this.defaultServicesManager.save(r); assertTrue(this.defaultServicesManager.matchesExistingService(service)); assertEquals(r, this.defaultServicesManager.findServiceBy(service)); assertNull(this.defaultServicesManager.findServiceBy(service2)); } @Test public void verifyAllService() { final RegexRegisteredService r = new RegexRegisteredService(); r.setId(1000); r.setName(TEST); r.setServiceId(TEST); r.setEvaluationOrder(2); this.defaultServicesManager.save(r); assertEquals(2, this.defaultServicesManager.getAllServices().size()); assertTrue(this.defaultServicesManager.getAllServices().contains(r)); } @Test public void verifyRegexService() { final RegexRegisteredService r = new RegexRegisteredService(); r.setId(10000); r.setName("regex test"); r.setServiceId("^http://www.test.edu.+"); r.setEvaluationOrder(10000); this.defaultServicesManager.save(r); final SimpleService service = new SimpleService("HTTP://www.TEST.edu/param=hello"); assertEquals(r, this.defaultServicesManager.findServiceBy(service)); } @Test public void verifyEmptyServicesRegistry() { final SimpleService s = new SimpleService("http://www.google.com"); defaultServicesManager.getAllServices().forEach(svc -> defaultServicesManager.delete(svc.getId())); assertSame(0, this.defaultServicesManager.getAllServices().size()); assertNull(this.defaultServicesManager.findServiceBy(s)); assertNull(this.defaultServicesManager.findServiceBy(1000)); } @Test public void verifyEvaluationOrderOfServices() { final RegexRegisteredService r = new RegexRegisteredService(); r.setId(100); r.setName(TEST); r.setServiceId(TEST); r.setEvaluationOrder(200); final RegexRegisteredService r2 = new RegexRegisteredService(); r2.setId(101); r2.setName(TEST); r2.setServiceId(TEST); r2.setEvaluationOrder(80); final RegexRegisteredService r3 = new RegexRegisteredService(); r3.setId(102); r3.setName("Sample test service"); r3.setServiceId(TEST); r3.setEvaluationOrder(80); this.defaultServicesManager.save(r); this.defaultServicesManager.save(r3); this.defaultServicesManager.save(r2); final List<RegisteredService> allServices = new ArrayList<>(this.defaultServicesManager.getAllServices()); //We expect the 3 newly added services, plus the one added in setUp() assertEquals(4, allServices.size()); assertEquals(allServices.get(0).getId(), r3.getId()); assertEquals(allServices.get(1).getId(), r2.getId()); assertEquals(allServices.get(2).getId(), r.getId()); } @Test public void verifyServiceCanBeUpdated() throws Exception { final int serviceId = 2500; final String description = "desc"; final RegexRegisteredService service = new RegexRegisteredService(); service.setId(serviceId); service.setName("serviceName"); service.setServiceId("serviceId"); service.setEvaluationOrder(1000); defaultServicesManager.save(service); service.setDescription(description); defaultServicesManager.save(service); final Collection<RegisteredService> serviceRetrieved = defaultServicesManager.findServiceBy(RegexRegisteredService.class::isInstance); assertEquals(description, serviceRetrieved.toArray(new RegisteredService[]{})[0].getDescription()); } @Test public void verifyServiceIsUpdatedAfterALoad() throws Exception { final int serviceId = 2500; final String description = "desc"; final RegexRegisteredService service = new RegexRegisteredService(); service.setId(serviceId); service.setName("serviceName"); service.setServiceId("serviceId"); service.setEvaluationOrder(1000); dao.save(service); service.setDescription(description); dao.save(service); defaultServicesManager.load(); final Collection<RegisteredService> serviceRetrieved = defaultServicesManager.findServiceBy(RegexRegisteredService.class::isInstance); assertEquals(description, serviceRetrieved.toArray(new RegisteredService[]{})[0].getDescription()); } private static class SimpleService implements Service { /** * Comment for {@code serialVersionUID}. */ private static final long serialVersionUID = 6572142033945243669L; private final String id; protected SimpleService(final String id) { this.id = id; } @Override public Map<String, Object> getAttributes() { return null; } @Override public String getId() { return this.id; } @Override public void setPrincipal(final Principal principal) { // nothing to do } @Override public boolean matches(final Service service) { return true; } } }