package at.gv.egiz.eaaf.core.impl.idp.auth.controller; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.RandomStringUtils; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.util.SerializationUtils; import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants; import at.gv.egiz.eaaf.core.api.data.EaafConstants; import at.gv.egiz.eaaf.core.api.data.ExceptionContainer; import at.gv.egiz.eaaf.core.api.gui.GroupDefinition; import at.gv.egiz.eaaf.core.api.gui.ModifyableGuiBuilderConfiguration; import at.gv.egiz.eaaf.core.api.idp.IConfiguration; import at.gv.egiz.eaaf.core.api.storage.ITransactionStorage; import at.gv.egiz.eaaf.core.api.utils.IPendingRequestIdGenerationStrategy; import at.gv.egiz.eaaf.core.exceptions.EaafException; import at.gv.egiz.eaaf.core.impl.gui.AbstractGuiFormBuilderConfiguration; import at.gv.egiz.eaaf.core.impl.idp.auth.dummy.DummyDefaultErrorService; import at.gv.egiz.eaaf.core.impl.idp.auth.services.IErrorService.ActionType; import at.gv.egiz.eaaf.core.impl.idp.auth.services.IErrorService.LogLevel; import at.gv.egiz.eaaf.core.impl.idp.controller.ProtocolFinalizationController; import at.gv.egiz.eaaf.core.impl.idp.module.gui.DummyGuiBuilderConfigurationFactory; import at.gv.egiz.eaaf.core.impl.idp.module.gui.DummyGuiFormBuilder; import at.gv.egiz.eaaf.core.impl.idp.module.test.DummySpConfiguration; import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"/SpringTest-context_eaaf_core.xml", "/SpringTest-context_eaaf_auth.xml"}) public class ProtocolFinalizationControllerTest { @Autowired IConfiguration config; @Autowired ProtocolFinalizationController controller; @Autowired DummyGuiBuilderConfigurationFactory guiConfigFactory; @Autowired DummyGuiFormBuilder guiBuilder; @Autowired IPendingRequestIdGenerationStrategy requestIdValidationStragegy; @Autowired ITransactionStorage storage; @Autowired DummyDefaultErrorService errorService; /** * jUnit test initializer. */ @Before public void initialize() { errorService.setErrorIdTokenForRedirect(null); errorService.setLogLevel(LogLevel.WARN); errorService.setTicketType(ActionType.NO_TICKET); } @Test public void performErrorRedirectNoToken() throws EaafException, IOException { MockHttpServletRequest httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); httpReq.addHeader("Accept", "application/json"); MockHttpServletResponse httpResp = new MockHttpServletResponse(); guiConfigFactory.setErrorGuiConfig( new DummyGuiBuilderConfig("https://localhost/authhandler", "jUnitView", "/junitSubmit")); // perform test controller.errorRedirect(httpReq, httpResp); //validate state assertNotNull("No gui builder request", guiBuilder.getConfig()); assertFalse("No GUI form infos", guiBuilder.getConfig().getViewParameters().isEmpty()); assertTrue("No GUI form infos", guiBuilder.getConfig().getViewParameters().containsKey("msg")); Map params = ((Map) guiBuilder.getConfig().getViewParameters().get("msg")); assertFalse("No GUI form infos", params.isEmpty()); assertEquals("wrong intErrorCode", "auth.26", params.get("errorCode")); assertTrue("wrong extErrorCode", ((String) params.get("extErrorCode")).contains("auth.26")); assertFalse("GUI sp redirect", guiBuilder.getConfig().getViewParameters() .containsKey(DummyDefaultErrorService.JUNIT_EL_SPREDIRECT)); } @Test public void performErrorRedirect() throws EaafException, IOException { MockHttpServletRequest httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); httpReq.addHeader("Accept", "application/json"); MockHttpServletResponse httpResp = new MockHttpServletResponse(); guiConfigFactory.setErrorGuiConfig( new DummyGuiBuilderConfig("https://localhost/authhandler", "jUnitView", "/junitSubmit")); String token = requestIdValidationStragegy.generateExternalPendingRequestId(); httpReq.setParameter(EaafConstants.PARAM_HTTP_ERROR_CODE, token); TestRequestImpl protocolRequest = new TestRequestImpl(); Map spConfig = new HashMap<>(); spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, RandomStringUtils.randomAlphabetic(10)); protocolRequest.setSpConfig(new DummySpConfiguration(spConfig, config)); Throwable throwable = new EaafException("internal.00"); final ExceptionContainer exceptionContainer = new ExceptionContainer(protocolRequest, throwable); final byte[] serialized = SerializationUtils.serialize(exceptionContainer); storage.put(token, serialized, -1); // perform test controller.errorRedirect(httpReq, httpResp); //validate state assertNull("Exception not removed from cache", storage.get( requestIdValidationStragegy.getPendingRequestIdWithOutChecks(token))); assertNotNull("No gui builder request", guiBuilder.getConfig()); assertFalse("No GUI form infos", guiBuilder.getConfig().getViewParameters().isEmpty()); assertTrue("No GUI form infos", guiBuilder.getConfig().getViewParameters().containsKey("msg")); Map params = ((Map) guiBuilder.getConfig().getViewParameters().get("msg")); assertFalse("No GUI form infos", params.isEmpty()); assertEquals("wrong intErrorCode", "internal.00", params.get("errorCode")); assertTrue("wrong extErrorCode", ((String) params.get("extErrorCode")).contains("internal.00")); assertFalse("GUI sp redirect", guiBuilder.getConfig().getViewParameters() .containsKey(DummyDefaultErrorService.JUNIT_EL_SPREDIRECT)); } @Test public void performErrorHandlingNoToken() throws EaafException, IOException { MockHttpServletRequest httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); httpReq.addHeader("Accept", "application/json"); MockHttpServletResponse httpResp = new MockHttpServletResponse(); guiConfigFactory.setErrorGuiConfig( new DummyGuiBuilderConfig("https://localhost/authhandler", "jUnitView", "/junitSubmit")); // perform test controller.errorHandling(httpReq, httpResp); //validate state assertNotNull("No gui builder request", guiBuilder.getConfig()); assertFalse("No GUI form infos", guiBuilder.getConfig().getViewParameters().isEmpty()); assertTrue("No GUI form infos", guiBuilder.getConfig().getViewParameters().containsKey("msg")); Map params = ((Map) guiBuilder.getConfig().getViewParameters().get("msg")); assertFalse("No GUI form infos", params.isEmpty()); assertEquals("wrong intErrorCode", "auth.26", params.get("errorCode")); assertTrue("wrong extErrorCode", ((String) params.get("extErrorCode")).contains("auth.26")); assertFalse("GUI sp redirect", guiBuilder.getConfig().getViewParameters() .containsKey(DummyDefaultErrorService.JUNIT_EL_SPREDIRECT)); } @Test public void performErrorHandlingWithToken() throws EaafException, IOException { MockHttpServletRequest httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); httpReq.addHeader("Accept", "application/json"); MockHttpServletResponse httpResp = new MockHttpServletResponse(); guiConfigFactory.setErrorGuiConfig( new DummyGuiBuilderConfig("https://localhost/authhandler", "jUnitView", "/junitSubmit")); String token = requestIdValidationStragegy.generateExternalPendingRequestId(); httpReq.setParameter(EaafConstants.PARAM_HTTP_ERROR_CODE, token); TestRequestImpl protocolRequest = new TestRequestImpl(); Map spConfig = new HashMap<>(); spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, RandomStringUtils.randomAlphabetic(10)); protocolRequest.setSpConfig(new DummySpConfiguration(spConfig, config)); Throwable throwable = new EaafException("internal.00"); final ExceptionContainer exceptionContainer = new ExceptionContainer(protocolRequest, throwable); final byte[] serialized = SerializationUtils.serialize(exceptionContainer); storage.put(token, serialized, -1); // perform test controller.errorHandling(httpReq, httpResp); //validate state assertNull("Exception not removed from cache", storage.get( requestIdValidationStragegy.getPendingRequestIdWithOutChecks(token))); assertNotNull("No gui builder request", guiBuilder.getConfig()); assertFalse("No GUI form infos", guiBuilder.getConfig().getViewParameters().isEmpty()); assertTrue("No GUI form infos", guiBuilder.getConfig().getViewParameters().containsKey("msg")); Map params = ((Map) guiBuilder.getConfig().getViewParameters().get("msg")); assertFalse("No GUI form infos", params.isEmpty()); assertEquals("wrong intErrorCode", "internal.00", params.get("errorCode")); assertTrue("wrong extErrorCode", ((String) params.get("extErrorCode")).contains("internal.00")); assertFalse("GUI sp redirect", guiBuilder.getConfig().getViewParameters() .containsKey(DummyDefaultErrorService.JUNIT_EL_SPREDIRECT)); } @Test public void performErrorHandlingWithTokenAndRedirect() throws EaafException, IOException { MockHttpServletRequest httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); httpReq.addHeader("Accept", "application/json"); MockHttpServletResponse httpResp = new MockHttpServletResponse(); guiConfigFactory.setErrorGuiConfig( new DummyGuiBuilderConfig("https://localhost/authhandler", "jUnitView", "/junitSubmit")); String token = requestIdValidationStragegy.generateExternalPendingRequestId(); httpReq.setParameter(EaafConstants.PARAM_HTTP_ERROR_CODE, token); TestRequestImpl protocolRequest = new TestRequestImpl(); Map spConfig = new HashMap<>(); spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, RandomStringUtils.randomAlphabetic(10)); protocolRequest.setSpConfig(new DummySpConfiguration(spConfig, config)); protocolRequest.setTransactionId(RandomStringUtils.randomAlphanumeric(10)); Throwable throwable = new EaafException("internal.00"); final ExceptionContainer exceptionContainer = new ExceptionContainer(protocolRequest, throwable); final byte[] serialized = SerializationUtils.serialize(exceptionContainer); storage.put(token, serialized, -1); String secondErrorTicket = requestIdValidationStragegy.generateExternalPendingRequestId(); errorService.setErrorIdTokenForRedirect(secondErrorTicket); errorService.setTicketType(ActionType.TICKET); // perform test controller.errorHandling(httpReq, httpResp); //validate state assertNull("Exception not removed from cache", storage.get( requestIdValidationStragegy.getPendingRequestIdWithOutChecks(token))); assertNotNull("No gui builder request", guiBuilder.getConfig()); assertFalse("No GUI form infos", guiBuilder.getConfig().getViewParameters().isEmpty()); assertTrue("No GUI form infos", guiBuilder.getConfig().getViewParameters().containsKey("msg")); Map params = ((Map) guiBuilder.getConfig().getViewParameters().get("msg")); assertFalse("No GUI form infos", params.isEmpty()); assertEquals("wrong intErrorCode", "internal.00", params.get("errorCode")); assertTrue("wrong extErrorCode", ((String) params.get("extErrorCode")).contains("internal.00")); byte[] secondErrorSerialized = storage.get( requestIdValidationStragegy.getPendingRequestIdWithOutChecks(secondErrorTicket), byte[].class); assertNotNull("Exception not removed from cache", secondErrorSerialized); ExceptionContainer secondError = (ExceptionContainer) SerializationUtils.deserialize(secondErrorSerialized); assertEquals("wrong pengingReq", protocolRequest.getUniqueTransactionIdentifier(), secondError.getPendingRequest().getUniqueTransactionIdentifier()); assertEquals("wrong exception", throwable.getMessage(), secondError.getExceptionThrown().getMessage()); assertTrue("GUI sp redirect", guiBuilder.getConfig().getViewParameters() .containsKey(DummyDefaultErrorService.JUNIT_EL_SPREDIRECT)); } @Test public void performErrorHandlingWithoutTokenAndRedirect() throws EaafException, IOException { MockHttpServletRequest httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler"); httpReq.addHeader("Accept", "application/json"); MockHttpServletResponse httpResp = new MockHttpServletResponse(); guiConfigFactory.setErrorGuiConfig( new DummyGuiBuilderConfig("https://localhost/authhandler", "jUnitView", "/junitSubmit")); String token = requestIdValidationStragegy.generateExternalPendingRequestId(); httpReq.setParameter(EaafConstants.PARAM_HTTP_ERROR_CODE, token); TestRequestImpl protocolRequest = new TestRequestImpl(); Map spConfig = new HashMap<>(); spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, RandomStringUtils.randomAlphabetic(10)); protocolRequest.setSpConfig(new DummySpConfiguration(spConfig, config)); protocolRequest.setTransactionId(RandomStringUtils.randomAlphanumeric(10)); Throwable throwable = new EaafException("internal.00"); final ExceptionContainer exceptionContainer = new ExceptionContainer(protocolRequest, throwable); final byte[] serialized = SerializationUtils.serialize(exceptionContainer); storage.put(token, serialized, -1); String secondErrorTicket = requestIdValidationStragegy.generateExternalPendingRequestId(); errorService.setErrorIdTokenForRedirect(secondErrorTicket); errorService.setTicketType(ActionType.ERRORPAGE); // perform test controller.errorHandling(httpReq, httpResp); //validate state assertNull("Exception not removed from cache", storage.get( requestIdValidationStragegy.getPendingRequestIdWithOutChecks(token))); assertNotNull("No gui builder request", guiBuilder.getConfig()); assertFalse("No GUI form infos", guiBuilder.getConfig().getViewParameters().isEmpty()); assertTrue("No GUI form infos", guiBuilder.getConfig().getViewParameters().containsKey("msg")); Map params = ((Map) guiBuilder.getConfig().getViewParameters().get("msg")); assertFalse("No GUI form infos", params.isEmpty()); assertEquals("wrong intErrorCode", "internal.00", params.get("errorCode")); assertTrue("wrong extErrorCode", ((String) params.get("extErrorCode")).contains("internal.00")); byte[] secondErrorSerialized = storage.get( requestIdValidationStragegy.getPendingRequestIdWithOutChecks(secondErrorTicket), byte[].class); assertNotNull("Exception not removed from cache", secondErrorSerialized); ExceptionContainer secondError = (ExceptionContainer) SerializationUtils.deserialize(secondErrorSerialized); assertEquals("wrong pengingReq", protocolRequest.getUniqueTransactionIdentifier(), secondError.getPendingRequest().getUniqueTransactionIdentifier()); assertEquals("wrong exception", throwable.getMessage(), secondError.getExceptionThrown().getMessage()); assertTrue("GUI sp redirect", guiBuilder.getConfig().getViewParameters() .containsKey(DummyDefaultErrorService.JUNIT_EL_SPREDIRECT)); } private class DummyGuiBuilderConfig extends AbstractGuiFormBuilderConfiguration implements ModifyableGuiBuilderConfiguration { /** * DummyGuiBuilderConfiguration. * * @param authUrl AuthUrl * @param viewName viewName * @param formSubmitEndpoint submit endpoint */ DummyGuiBuilderConfig(String authUrl, String viewName, String formSubmitEndpoint) { super(authUrl, viewName, formSubmitEndpoint); } @Override public String getDefaultContentType() { return null; } @Override protected void putSpecificViewParameters() { } @Override protected GroupDefinition getFromGroup() { return null; } @Override public void putCustomParameterWithOutEscaption(GroupDefinition group, String key, Object value) { setViewParameter(group, key, value); } @Override public void putCustomParameter(GroupDefinition group, String key, String value) { setViewParameter(group, key, value); } }; }