package org.deegree.securityproxy.wps.responsefilter.capabilities; import static org.deegree.securityproxy.service.commons.responsefilter.AbstractResponseFilterManager.SERVICE_EXCEPTION_MSG; import static org.deegree.securityproxy.service.commons.responsefilter.capabilities.AbstractCapabilitiesResponseFilterManager.SUCCESSFUL_FILTERING_MESSAGE; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.xmlmatchers.XmlMatchers.isEquivalentTo; import static org.xmlmatchers.transform.XmlConverters.the; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.servlet.ServletOutputStream; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import org.deegree.securityproxy.authentication.ows.domain.LimitedOwsServiceVersion; import org.deegree.securityproxy.authentication.ows.raster.RasterPermission; import org.deegree.securityproxy.filter.StatusCodeResponseBodyWrapper; import org.deegree.securityproxy.request.OwsRequest; import org.deegree.securityproxy.request.OwsServiceVersion; import org.deegree.securityproxy.responsefilter.logging.ResponseFilterReport; import org.deegree.securityproxy.service.commons.responsefilter.capabilities.XmlFilter; import org.deegree.securityproxy.service.commons.responsefilter.capabilities.XmlModificationManagerCreator; import org.deegree.securityproxy.wps.request.WpsRequest; import org.junit.Test; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; /** * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz</a> * @author last edited by: $Author: lyn $ * * @version $Revision: $, $Date: $ */ public class WpsCapabilitiesResponseFilterManagerTest { @Test public void testFilterResponseShouldReturnFilterReport() throws Exception { StatusCodeResponseBodyWrapper response = mockStatusCodeResponseBodyWrapper(); WpsRequest wpsRequest = createWpsGetCapabilitiesRequest(); Authentication authentication = createAuthenticationWithKnownProcessIds(); ResponseFilterReport filterReport = createFilterManagerWithMocks().filterResponse( response, wpsRequest, authentication ); assertThat( filterReport, notNullValue() ); assertThat( filterReport.getMessage(), is( SUCCESSFUL_FILTERING_MESSAGE ) ); assertThat( filterReport.isFiltered(), is( true ) ); } @Test public void testFilterResponseWithExceptionShouldReturnFilterReport() throws Exception { ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream(); StatusCodeResponseBodyWrapper response = mockStatusCodeResponseBodyWrapper( filteredCapabilities, "../service_exception.xml" ); WpsRequest wpsRequest = createWpsGetCapabilitiesRequest(); Authentication authentication = createAuthenticationWithKnownProcessIds(); ResponseFilterReport filterReport = createFilterManager().filterResponse( response, wpsRequest, authentication ); assertThat( filterReport, notNullValue() ); assertThat( filterReport.getMessage(), is( SERVICE_EXCEPTION_MSG ) ); assertThat( filterReport.isFiltered(), is( false ) ); } @Test public void testFilterResponseWithAllPermissionShouldNotFilterResponse() throws Exception { ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream(); StatusCodeResponseBodyWrapper response = mockStatusCodeResponseBodyWrapper( filteredCapabilities, "wps_1_0_0.xml" ); WpsRequest wpsRequest = createWpsGetCapabilitiesRequest(); Authentication authentication = createAuthenticationWithAllProcessIds(); createFilterManager().filterResponse( response, wpsRequest, authentication ); assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "wps_1_0_0.xml" ) ) ); } @Test public void testFilterResponseWithApplicablePermissionShouldFilterResponse() throws Exception { ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream(); StatusCodeResponseBodyWrapper response = mockStatusCodeResponseBodyWrapper( filteredCapabilities, "wps_1_0_0.xml" ); WpsRequest wpsRequest = createWpsGetCapabilitiesRequest(); Authentication authentication = createAuthenticationWithKnownProcessIds(); createFilterManager().filterResponse( response, wpsRequest, authentication ); assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "wps_1_0_0-Filtered.xml" ) ) ); } @Test public void testFilterResponseWithoutApplicablePermissionShouldFilterAllProcesses() throws Exception { ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream(); StatusCodeResponseBodyWrapper response = mockStatusCodeResponseBodyWrapper( filteredCapabilities, "wps_1_0_0.xml" ); WpsRequest wpsRequest = createWpsGetCapabilitiesRequest(); Authentication authentication = createAuthenticationWithUnknownProcessIds(); createFilterManager().filterResponse( response, wpsRequest, authentication ); assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "wps_1_0_0-FilteredComplete.xml" ) ) ); } @Test public void testFilterResponseWithoutExecutePermissionShouldFilterAllProcesses() throws Exception { ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream(); StatusCodeResponseBodyWrapper response = mockStatusCodeResponseBodyWrapper( filteredCapabilities, "wps_1_0_0.xml" ); WpsRequest wpsRequest = createWpsGetCapabilitiesRequest(); Authentication authentication = createAuthenticationWithDescribeProcess(); createFilterManager().filterResponse( response, wpsRequest, authentication ); assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "wps_1_0_0-FilteredComplete.xml" ) ) ); } @Test public void testFilterResponseShouldReplaceDcpUrls() throws Exception { ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream(); StatusCodeResponseBodyWrapper response = mockStatusCodeResponseBodyWrapper( filteredCapabilities, "wps_1_0_0.xml" ); WpsRequest wpsRequest = createWpsGetCapabilitiesRequest(); Authentication authentication = createAuthenticationWithAllProcessIds(); createFilterManagerWithAttributeModifier().filterResponse( response, wpsRequest, authentication ); assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "wps_1_0_0-ReplacedDcpUrls.xml" ) ) ); } @Test public void testFilterResponseWithExceptionShouldReturnExceptionResponse() throws Exception { ByteArrayOutputStream filteredCapabilities = new ByteArrayOutputStream(); StatusCodeResponseBodyWrapper response = mockStatusCodeResponseBodyWrapper( filteredCapabilities, "../service_exception.xml" ); Authentication mockAuthentication = createAuthenticationWithKnownProcessIds(); createFilterManager().filterResponse( response, createWpsExecuteRequest(), mockAuthentication ); assertThat( asXml( filteredCapabilities ), isEquivalentTo( expectedXml( "../service_exception.xml" ) ) ); } @Test(expected = IllegalArgumentException.class) public void testFilterResponseWithUnsuppportedVersion() throws Exception { StatusCodeResponseBodyWrapper response = mockStatusCodeResponseBodyWrapper(); WpsRequest wpsRequest = createWpsGetCapabilitiesRequestWithVersion130(); Authentication authentication = createAuthenticationWithKnownProcessIds(); createFilterManagerWithMocks().filterResponse( response, wpsRequest, authentication ); } @Test public void testIsCorrectServiceTypeFromWpsExecuteRequest() throws Exception { WpsCapabilitiesResponseFilterManager filterManager = createFilterManagerWithMocks(); boolean correctServiceType = filterManager.isCorrectServiceType( createWpsExecuteRequest() ); assertThat( correctServiceType, is( true ) ); } @Test public void testIsCorrectServiceTypeFromMockedRequest() throws Exception { WpsCapabilitiesResponseFilterManager filterManager = createFilterManagerWithMocks(); boolean correctServiceType = filterManager.isCorrectServiceType( mock( OwsRequest.class ) ); assertThat( correctServiceType, is( false ) ); } @Test public void testIsCorrectRequestParameterFromWpsCapabilitiesRequest() throws Exception { WpsCapabilitiesResponseFilterManager filterManager = createFilterManagerWithMocks(); boolean correctServiceType = filterManager.isCorrectRequestParameter( createWpsGetCapabilitiesRequest() ); assertThat( correctServiceType, is( true ) ); } @Test public void testIsCorrectRequestParameterFromWpsExecuteRequest() throws Exception { WpsCapabilitiesResponseFilterManager filterManager = createFilterManagerWithMocks(); boolean correctServiceType = filterManager.isCorrectRequestParameter( createWpsExecuteRequest() ); assertThat( correctServiceType, is( false ) ); } @Test public void testIsCorrectRequestParameterFromMockedRequestRequest() throws Exception { WpsCapabilitiesResponseFilterManager filterManager = createFilterManagerWithMocks(); boolean correctServiceType = filterManager.isCorrectRequestParameter( mock( OwsRequest.class ) ); assertThat( correctServiceType, is( false ) ); } private WpsCapabilitiesResponseFilterManager createFilterManagerWithMocks() { XmlFilter capabilitiesFilter = mock( XmlFilter.class ); XmlModificationManagerCreator xmlModificationManagerCreator = new WpsCapabilitiesModificationManagerCreator(); return new WpsCapabilitiesResponseFilterManager( capabilitiesFilter, xmlModificationManagerCreator ); } private WpsCapabilitiesResponseFilterManager createFilterManager() { XmlFilter capabilitiesFilter = new XmlFilter(); XmlModificationManagerCreator xmlModificationManagerCreator = new WpsCapabilitiesModificationManagerCreator(); return new WpsCapabilitiesResponseFilterManager( capabilitiesFilter, xmlModificationManagerCreator ); } private WpsCapabilitiesResponseFilterManager createFilterManagerWithAttributeModifier() { XmlFilter capabilitiesFilter = new XmlFilter(); XmlModificationManagerCreator xmlModificationManagerCreator = new WpsCapabilitiesModificationManagerCreator( "http://getDcpUrl", "http://postDcpUrl" ); return new WpsCapabilitiesResponseFilterManager( capabilitiesFilter, xmlModificationManagerCreator ); } private WpsRequest createWpsExecuteRequest() { return new WpsRequest( "Execute", new OwsServiceVersion( "1.0.0" ), "WPS" ); } private WpsRequest createWpsGetCapabilitiesRequest() { return new WpsRequest( "GetCapabilities", new OwsServiceVersion( "1.0.0" ), "WPS" ); } private WpsRequest createWpsGetCapabilitiesRequestWithVersion130() { return new WpsRequest( "GetCapabilities", new OwsServiceVersion( "1.3.0" ), "WPS" ); } private StatusCodeResponseBodyWrapper mockStatusCodeResponseBodyWrapper() throws IOException { StatusCodeResponseBodyWrapper mockedServletResponse = mock( StatusCodeResponseBodyWrapper.class ); when( mockedServletResponse.getStatus() ).thenReturn( 200 ); when( mockedServletResponse.getBufferedStream() ).thenReturn( new ByteArrayInputStream( new byte[] {} ) ); when( mockedServletResponse.getOutputStream() ).thenReturn( mock( ServletOutputStream.class ) ); when( mockedServletResponse.getRealOutputStream() ).thenReturn( mock( ServletOutputStream.class ) ); return mockedServletResponse; } private StatusCodeResponseBodyWrapper mockStatusCodeResponseBodyWrapper( ByteArrayOutputStream filteredStream, String originalXmlFileName ) throws IOException { StatusCodeResponseBodyWrapper mockedServletResponse = mock( StatusCodeResponseBodyWrapper.class ); when( mockedServletResponse.getStatus() ).thenReturn( 200 ); when( mockedServletResponse.getBufferedStream() ).thenReturn( retrieveResourceAsStream( originalXmlFileName ), retrieveResourceAsStream( originalXmlFileName ) ); when( mockedServletResponse.getRealOutputStream() ).thenReturn( createStream( filteredStream ) ); doCallRealMethod().when( mockedServletResponse ).copyBufferedStreamToRealStream(); return mockedServletResponse; } private Authentication createAuthenticationWithDescribeProcess() { List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); authorities.add( createRasterPermission( "DescribeProcess", "Buffer" ) ); return mockAuthentication( authorities ); } private Authentication createAuthenticationWithUnknownProcessIds() { List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); authorities.add( createRasterPermission( "Execute", "UNKNOWN" ) ); return mockAuthentication( authorities ); } private Authentication createAuthenticationWithKnownProcessIds() { List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); authorities.add( createRasterPermission( "Execute", "st_vectormean" ) ); authorities.add( createRasterPermission( "Execute", "Union" ) ); return mockAuthentication( authorities ); } private Authentication createAuthenticationWithAllProcessIds() { List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); authorities.add( createRasterPermission( "Execute", "st_snappoints" ) ); authorities.add( createRasterPermission( "Execute", "st_groupnearfeatures" ) ); authorities.add( createRasterPermission( "Execute", "st_vectormean" ) ); authorities.add( createRasterPermission( "Execute", "st_boundingbox" ) ); authorities.add( createRasterPermission( "Execute", "Union" ) ); return mockAuthentication( authorities ); } private Authentication mockAuthentication( Collection<? extends GrantedAuthority> authorities ) { Authentication authenticationMock = mock( Authentication.class ); doReturn( authorities ).when( authenticationMock ).getAuthorities(); return authenticationMock; } private RasterPermission createRasterPermission( String operationType, String processId ) { return new RasterPermission( "wps", operationType, new LimitedOwsServiceVersion( "<= 1.0.0" ), processId, "serviceName", "internalServiceUrl", null ); } private InputStream retrieveResourceAsStream( String originalXmlFileName ) { return WpsCapabilitiesResponseFilterManagerTest.class.getResourceAsStream( originalXmlFileName ); } private Source expectedXml( String expectedFile ) { return new StreamSource( retrieveResourceAsStream( expectedFile ) ); } private Source asXml( ByteArrayOutputStream bufferingStream ) { byte[] byteArray = bufferingStream.toByteArray(); System.out.println( new String( byteArray ) ); return the( new StreamSource( new ByteArrayInputStream( byteArray ) ) ); } private ServletOutputStream createStream( final ByteArrayOutputStream bufferingStream ) { ServletOutputStream stream = new ServletOutputStream() { @Override public void write( int b ) throws IOException { bufferingStream.write( b ); } }; return stream; } }