/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.platform.plugin.services.webservices.content;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.TransportInDescription;
import org.apache.axis2.description.TransportOutDescription;
import org.apache.axis2.engine.AxisConfiguration;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.platform.api.engine.IOutputHandler;
import org.pentaho.platform.api.engine.IParameterProvider;
import org.pentaho.platform.engine.core.output.SimpleOutputHandler;
import org.pentaho.platform.engine.core.solution.SimpleParameterProvider;
import org.pentaho.platform.engine.core.system.StandaloneSession;
import org.pentaho.platform.plugin.services.pluginmgr.servicemgr.AxisWebServiceManager;
import org.pentaho.platform.util.web.SimpleUrlFactory;
import org.pentaho.test.platform.plugin.services.webservices.MimeTypeListener;
import org.pentaho.test.platform.plugin.services.webservices.StubService;
import org.pentaho.test.platform.plugin.services.webservices.StubServiceSetup;
import org.pentaho.test.platform.plugin.services.webservices.StubTransportListener;
import org.pentaho.test.platform.plugin.services.webservices.StubTransportSender;
import com.mockrunner.mock.web.MockHttpServletRequest;
import com.mockrunner.mock.web.MockHttpServletResponse;
public class AxisServiceExecutorTest {
private static final String BASE_URL = "http://testhost:testport/testcontent";
private static final String DEAFULT_TRANSPOT_PROTOCOL = "http";
private static final String REMOTE_ADDRESS = "127.0.0.1";
private ByteArrayOutputStream out;
private AxisServiceExecutor contentGenerator;
@Before
public void setUp() throws Exception {
StandaloneSession session = new StandaloneSession( "test" );
StubServiceSetup serviceSetup = new StubServiceSetup();
serviceSetup.setSession( session );
AxisConfiguration axisCfg = serviceSetup.getAxisConfiguration();
ConfigurationContext configContext = new ConfigurationContext( axisCfg );
serviceSetup.loadServices();
TransportInDescription tIn = new TransportInDescription( DEAFULT_TRANSPOT_PROTOCOL );
StubTransportListener receiver = new StubTransportListener();
tIn.setReceiver( receiver );
axisCfg.addTransportIn( tIn );
TransportOutDescription tOut = new TransportOutDescription( DEAFULT_TRANSPOT_PROTOCOL );
StubTransportSender sender = new StubTransportSender();
tOut.setSender( sender );
axisCfg.addTransportOut( tOut );
AxisWebServiceManager.currentAxisConfiguration = axisCfg;
AxisWebServiceManager.currentAxisConfigContext = configContext;
out = new ByteArrayOutputStream();
IOutputHandler outputHandler = new SimpleOutputHandler( out, false );
outputHandler.setMimeTypeListener( new MimeTypeListener() );
contentGenerator = new AxisServiceExecutor();
contentGenerator.setOutputHandler( outputHandler );
contentGenerator.setMessagesList( new ArrayList<String>() );
contentGenerator.setSession( session );
contentGenerator.setUrlFactory( new SimpleUrlFactory( BASE_URL + "?" ) );
assertNotNull( "contentGenerator is null", contentGenerator );
assertNotNull( "Logger is null", contentGenerator.getLogger() );
}
@Test
public void testRunGet() throws Exception {
Map<String, IParameterProvider> parameterProviders = new HashMap<String, IParameterProvider>();
SimpleParameterProvider pathParams = new SimpleParameterProvider();
pathParams.setParameter( "path", "/StubService/getString" );
pathParams.setParameter( "remoteaddr", "http:test" );
parameterProviders.put( "path", pathParams );
contentGenerator.setParameterProviders( parameterProviders );
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.setMethod( "GET" );
request.setRequestURI( "/pentaho/content/ws-run/StubService/getString" );
request.setRequestURL( "http://localhost:8080/pentaho/content/ws-run/StubService/getString" );
request.setRemoteAddr( REMOTE_ADDRESS );
pathParams.setParameter( "httprequest", request );
pathParams.setParameter( "httpresponse", response );
try {
StubTransportSender.transportOutStr = null;
StubService.getStringCalled = false;
contentGenerator.createContent();
assertTrue( StubService.getStringCalled );
String content = StubTransportSender.transportOutStr;
assertEquals( "result are wrong",
"<ns:getStringResponse xmlns:ns=\"http://webservices.services.plugin.platform.test.pentaho.org\"><return>test"
+ " result</return></ns:getStringResponse>", content );
} catch ( Exception e ) {
assertTrue( "Exception occurred", false );
}
}
@Test
public void testRunGetWithParameter() throws Exception {
Map<String, IParameterProvider> parameterProviders = new HashMap<String, IParameterProvider>();
SimpleParameterProvider pathParams = new SimpleParameterProvider();
pathParams.setParameter( "path", "/StubService/setString?str=testinput" );
parameterProviders.put( "path", pathParams );
contentGenerator.setParameterProviders( parameterProviders );
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.setMethod( "GET" );
request.setRequestURI( "/pentaho/content/ws-run/StubService/setString" );
request.setRequestURL( "http://localhost:8080/pentaho/content/ws-run/StubService/getString" );
request.setRemoteAddr( REMOTE_ADDRESS );
request.setQueryString( "str=testinput" );
pathParams.setParameter( "httprequest", request );
pathParams.setParameter( "httpresponse", response );
try {
StubService.setStringCalled = false;
StubTransportSender.transportOutStr = null;
contentGenerator.createContent();
assertTrue( StubService.setStringCalled );
assertEquals( "testinput", StubService.str );
} catch ( Exception e ) {
assertTrue( "Exception occurred", false );
}
}
@Test
public void testRunGetThrowError() throws Exception {
Map<String, IParameterProvider> parameterProviders = new HashMap<String, IParameterProvider>();
SimpleParameterProvider pathParams = new SimpleParameterProvider();
pathParams.setParameter( "path", "/StubService/throwsError1" );
parameterProviders.put( "path", pathParams );
contentGenerator.setParameterProviders( parameterProviders );
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.setMethod( "GET" );
request.setRequestURI( "/pentaho/content/ws-run/StubService/throwsError1" );
request.setRequestURL( "http://localhost:8080/pentaho/content/ws-run/StubService/throwsError1" );
request.setRemoteAddr( REMOTE_ADDRESS );
pathParams.setParameter( "httprequest", request );
pathParams.setParameter( "httpresponse", response );
try {
StubService.throwsError1Called = false;
StubTransportSender.transportOutStr = null;
contentGenerator.createContent();
assertTrue( StubService.throwsError1Called );
String content = StubTransportSender.transportOutStr;
assertNull( "Content should be empty", content );
} catch ( Exception e ) {
assertTrue( "Exception occurred", false );
}
}
@Test
public void testRunGetErrorResponse() throws Exception {
Map<String, IParameterProvider> parameterProviders = new HashMap<String, IParameterProvider>();
SimpleParameterProvider pathParams = new SimpleParameterProvider();
pathParams.setParameter( "path", "/StubService/throwsError2" );
parameterProviders.put( "path", pathParams );
contentGenerator.setParameterProviders( parameterProviders );
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.setMethod( "GET" );
request.setRequestURI( "/pentaho/content/ws-run/StubService/throwsError2" );
request.setRequestURL( "http://localhost:8080/pentaho/content/ws-run/StubService/throwsError2" );
request.setRemoteAddr( REMOTE_ADDRESS );
pathParams.setParameter( "httprequest", request );
pathParams.setParameter( "httpresponse", response );
try {
StubService.throwsError2Called = false;
StubTransportSender.transportOutStr = null;
contentGenerator.createContent();
assertTrue( StubService.throwsError2Called );
String content = StubTransportSender.transportOutStr;
assertTrue( "results are wrong", content.contains( "soapenv:Fault" ) );
assertTrue( "results are wrong", content.contains( "test error 2" ) );
} catch ( Exception e ) {
assertTrue( "Exception occurred", false );
}
}
@Test
public void testRunGetAxisServletHooks() throws Exception {
Map<String, IParameterProvider> parameterProviders = new HashMap<String, IParameterProvider>();
SimpleParameterProvider pathParams = new SimpleParameterProvider();
pathParams.setParameter( "path", "/StubService/bogus" );
parameterProviders.put( "path", pathParams );
contentGenerator.setParameterProviders( parameterProviders );
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.setMethod( "GET" );
request.setRequestURI( "/pentaho/content/ws-run/StubService/bogus" );
request.setRequestURL( "http://localhost:8080/pentaho/content/ws-run/StubService/bogus" );
request.setRemoteAddr( REMOTE_ADDRESS );
pathParams.setParameter( "httprequest", request );
pathParams.setParameter( "httpresponse", response );
try {
StubTransportSender.transportOutStr = null;
contentGenerator.createContent();
String content = StubTransportSender.transportOutStr;
assertTrue( "results are wrong", content.contains( "soapenv:Fault" ) );
assertTrue( "results are wrong", content.contains( "AxisServletHooks" ) );
} catch ( Exception e ) {
assertTrue( "Exception occurred", false );
}
}
@Test
public void testRunPost() throws Exception {
Map<String, IParameterProvider> parameterProviders = new HashMap<String, IParameterProvider>();
SimpleParameterProvider pathParams = new SimpleParameterProvider();
pathParams.setParameter( "path", "/StubService" );
pathParams.setParameter( "remoteaddr", "http:test" );
parameterProviders.put( "path", pathParams );
contentGenerator.setParameterProviders( parameterProviders );
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.setMethod( "POST" );
request.setRequestURI( "/pentaho/content/ws-run/StubService" );
request.setRequestURL( "http://localhost:8080/pentaho/content/ws-run/StubService" );
request.setRemoteAddr( REMOTE_ADDRESS );
request.setContentType( "application/soap+xml; charset=UTF-8; action=\"urn:getString\"" );
String xml =
"<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv=\"http://www.w3"
+ ".org/2003/05/soap-envelope\"><soapenv:Body><ns2:getString xmlns:ns2=\"http://webservice.pentaho"
+ ".com\"></ns2:getString></soapenv:Body></soapenv:Envelope>";
request.setBodyContent( xml );
pathParams.setParameter( "httprequest", request );
pathParams.setParameter( "httpresponse", response );
try {
StubTransportSender.transportOutStr = null;
StubService.getStringCalled = false;
contentGenerator.createContent();
assertTrue( StubService.getStringCalled );
String content = StubTransportSender.transportOutStr;
assertEquals( "result are wrong",
"<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv=\"http://www.w3"
+ ".org/2003/05/soap-envelope\"><soapenv:Body><ns:getStringResponse xmlns:ns=\""
+ "http://webservices.services" + ".plugin.platform.test.pentaho.org\"><return>test "
+ "result</return></ns:getStringResponse></soapenv:Body></soapenv:Envelope>", content );
} catch ( Exception e ) {
assertTrue( "Exception occurred", false );
}
}
@Test
public void testRunPut() throws Exception {
Map<String, IParameterProvider> parameterProviders = new HashMap<String, IParameterProvider>();
SimpleParameterProvider pathParams = new SimpleParameterProvider();
pathParams.setParameter( "path", "/StubService" );
pathParams.setParameter( "remoteaddr", "http:test" );
parameterProviders.put( "path", pathParams );
contentGenerator.setParameterProviders( parameterProviders );
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
request.setMethod( "PUT" );
request.setRequestURI( "/pentaho/content/ws-run/StubService" );
request.setRequestURL( "http://localhost:8080/pentaho/content/ws-run/StubService" );
request.setRemoteAddr( REMOTE_ADDRESS );
request.setContentType( "application/soap+xml; charset=UTF-8; action=\"urn:getString\"" );
String xml =
"<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv=\"http://www.w3"
+ ".org/2003/05/soap-envelope\"><soapenv:Body><ns2:getString xmlns:ns2=\"http://webservice.pentaho"
+ ".com\"></ns2:getString></soapenv:Body></soapenv:Envelope>";
request.setBodyContent( xml );
pathParams.setParameter( "httprequest", request );
pathParams.setParameter( "httpresponse", response );
try {
StubTransportSender.transportOutStr = null;
StubService.getStringCalled = false;
contentGenerator.createContent();
assertTrue( StubService.getStringCalled );
String content = StubTransportSender.transportOutStr;
assertEquals( "result are wrong",
"<ns:getStringResponse xmlns:ns=\"http://webservices.services.plugin.platform.test.pentaho.org\"><return>test"
+ " result</return></ns:getStringResponse>", content );
} catch ( Exception e ) {
assertTrue( "Exception occurred", false );
}
}
}