/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jbpm.process.workitem.rest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import javax.ws.rs.ext.RuntimeDelegate;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
import org.drools.core.process.instance.impl.WorkItemImpl;
import org.jbpm.bpmn2.handler.WorkItemHandlerRuntimeException;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.kie.api.runtime.process.WorkItem;
import org.kie.api.runtime.process.WorkItemHandler;
import org.kie.api.runtime.process.WorkItemManager;
@RunWith(Parameterized.class)
public class RestWorkItemHandlerTest {
@Parameters(name="Http Client 4.3 api = {0}")
public static Collection<Object[]> parameters() {
Object[][] locking = new Object[][] {
{ true },
{ false },
};
return Arrays.asList(locking);
};
private final boolean httpClient43;
private final static String serverURL = "http://localhost:9998/test";
private static Server server;
public RestWorkItemHandlerTest(boolean httpClient43) {
this.httpClient43 = httpClient43;
}
@SuppressWarnings({ "rawtypes"})
@BeforeClass
public static void initialize() throws Exception {
SimpleRESTApplication application = new SimpleRESTApplication();
RuntimeDelegate delegate = RuntimeDelegate.getInstance();
JAXRSServerFactoryBean bean = delegate.createEndpoint(application, JAXRSServerFactoryBean.class);
bean.setProvider(new JAXBElementProvider());
bean.setAddress("http://localhost:9998" + bean.getAddress());
server = bean.create();
server.start();
}
@AfterClass
public static void destroy() throws Exception {
if (server != null) {
server.stop();
server.destroy();
}
}
@Before
public void setClientApiVersion() {
RESTWorkItemHandler.HTTP_CLIENT_API_43 = httpClient43;
}
@Test
public void testGETOperation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL);
workItem.setParameter( "Method", "GET" );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
String result = (String) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Hello from REST", result);
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testGETOperationWithCustomTimeout() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL);
workItem.setParameter( "Method", "GET" );
workItem.setParameter( "ConnectTimeout", "30000" );
workItem.setParameter( "ReadTimeout", "25000" );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
String result = (String) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Hello from REST", result);
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testGETOperationWithInvalidTimeout() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL);
workItem.setParameter( "Method", "GET" );
workItem.setParameter( "ConnectTimeout", "" );
workItem.setParameter( "ReadTimeout", "" );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
String result = (String) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Hello from REST", result);
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testGETOperationWithQueryParam() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"?param=test");
workItem.setParameter( "Method", "GET" );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
String result = (String) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Hello from REST test", result);
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testPOSTOperation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<person><age>25</age><name>Post john</name></person>";
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"/xml");
workItem.setParameter( "Method", "POST" );
workItem.setParameter( "ContentType", "application/xml" );
workItem.setParameter( "Content", "<person><name>john</name><age>25</age></person>" );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
String result = (String) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals(expected, result);
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testPOSTOperationWithPathParamAndNoContent() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"/john");
workItem.setParameter( "Method", "POST" );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
String result = (String) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Created resource with name john", result);
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testPUTOperation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<person><age>25</age><name>Put john</name></person>";
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"/xml");
workItem.setParameter( "Method", "PUT" );
workItem.setParameter( "ContentType", "application/xml" );
workItem.setParameter( "Content", "<person><name>john</name><age>25</age></person>" );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
String result = (String) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals(expected, result);
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testDELETEOperation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<person><age>-1</age><name>deleted john</name></person>";
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"/xml/john");
workItem.setParameter( "Method", "DELETE" );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
String result = (String) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals(expected, result);
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test(expected=IllegalArgumentException.class)
public void testUnsupportedOperation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"/xml/john");
workItem.setParameter( "Method", "HEAD" );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
}
@Test
public void testHandleErrorOnNotSuccessfulResponse() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"/notexisting");
workItem.setParameter( "Method", "GET" );
workItem.setParameter("HandleResponseErrors", "true");
WorkItemManager manager = new TestWorkItemManager(workItem);
try {
handler.executeWorkItem(workItem, manager);
fail("Should throw exception as it was instructed to do so");
} catch (WorkItemHandlerRuntimeException ex) {
RESTServiceException e = (RESTServiceException) ex.getCause().getCause();
assertEquals(405, e.getStatus());
assertEquals(serverURL+"/notexisting", e.getEndoint());
assertEquals("", e.getResponse());
}
}
@Test
public void testGETOperationWithXmlTrasformation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL + "/xml");
workItem.setParameter( "Method", "GET" );
workItem.setParameter( "ResultClass", Person.class.getName() );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
Person result = (Person) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Person Xml", result.getName());
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testGETOperationWithJsonTrasformation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL + "/json");
workItem.setParameter( "Method", "GET" );
workItem.setParameter( "ResultClass", Person.class.getName() );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
Person result = (Person) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Person Json", result.getName());
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testPOSTOperationWithXmlTransformation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"/xml");
workItem.setParameter( "Method", "POST" );
workItem.setParameter( "ContentType", "Application/XML;charset=utf-8" );
workItem.setParameter( "Content", "<person><name>john</name><age>25</age></person>" );
workItem.setParameter( "ResultClass", Person.class.getName() );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
Person result = (Person) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Post john", result.getName());
assertEquals(25, result.getAge().intValue());
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testPUTOperationWithXmlTransformation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"/xml");
workItem.setParameter( "Method", "PUT" );
workItem.setParameter( "ContentType", "Application/Xml;charset=utf-8" );
workItem.setParameter( "Content", "<person><name>john</name><age>25</age></person>" );
workItem.setParameter( "ResultClass", Person.class.getName() );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
Person result = (Person) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Put john", result.getName());
assertEquals(25, result.getAge().intValue());
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testPOSTOperationWithCompleteXmlTransformation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
Person request = new Person();
request.setAge(25);
request.setName("john");
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"/xml");
workItem.setParameter( "Method", "POST" );
workItem.setParameter( "ContentType", "application/xml" );
workItem.setParameter( "Content", request );
workItem.setParameter( "ResultClass", Person.class.getName() );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
Person result = (Person) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Post john", result.getName());
assertEquals(25, result.getAge().intValue());
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testGETOperationWithXmlCharsetTrasformation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL + "/xml-charset");
workItem.setParameter( "Method", "GET" );
workItem.setParameter( "ResultClass", Person.class.getName() );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
Person result = (Person) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Person Xml", result.getName());
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testGETOperationWithJsonCharsetTrasformation() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL + "/json-charset");
workItem.setParameter( "Method", "GET" );
workItem.setParameter( "ResultClass", Person.class.getName() );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
Person result = (Person) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals("Person Json", result.getName());
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testPUTOperationWithDefaultCharset() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
String nonAsciiData = "\u0418\u0432\u0430\u043d";
String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<person><age>25</age><name>Put ????</name></person>";
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"/xml-charset");
workItem.setParameter( "Method", "PUT" );
workItem.setParameter( "ContentType", "application/xml" );
workItem.setParameter( "Content", "<person><name>" + nonAsciiData + "</name><age>25</age></person>" );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
String result = (String) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals(expected, result);
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
@Test
public void testPUTOperationWithCharsetSpecified() {
RESTWorkItemHandler handler = new RESTWorkItemHandler();
String nonAsciiData = "\u0418\u0432\u0430\u043d";
String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<person><age>25</age><name>Put " + nonAsciiData + "</name></person>";
WorkItemImpl workItem = new WorkItemImpl();
workItem.setParameter( "Url", serverURL+"/xml-charset");
workItem.setParameter( "Method", "PUT" );
workItem.setParameter( "ContentType", "application/xml; charset=utf-8" );
workItem.setParameter( "Content", "<person><name>" + nonAsciiData + "</name><age>25</age></person>" );
WorkItemManager manager = new TestWorkItemManager(workItem);
handler.executeWorkItem(workItem, manager);
String result = (String) workItem.getResult("Result");
assertNotNull("result cannot be null", result);
assertEquals(expected, result);
int responseCode = (Integer) workItem.getResult("Status");
assertNotNull(responseCode);
assertEquals(200, responseCode);
String responseMsg = (String) workItem.getResult("StatusMsg");
assertNotNull(responseMsg);
assertEquals("request to endpoint " + workItem.getParameter("Url") +" successfully completed OK", responseMsg);
}
private class TestWorkItemManager implements WorkItemManager {
private WorkItem workItem;
TestWorkItemManager(WorkItem workItem) {
this.workItem = workItem;
}
@Override
public void completeWorkItem(long id, Map<String, Object> results) {
((WorkItemImpl)workItem).setResults(results);
}
@Override
public void abortWorkItem(long id) {
}
@Override
public void registerWorkItemHandler(String workItemName, WorkItemHandler handler) {
}
}
}