/* * 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.kie.server.integrationtests.shared.basetests; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import javax.jms.ConnectionFactory; import javax.jms.Queue; import javax.naming.InitialContext; import org.assertj.core.api.Assertions; import org.assertj.core.api.ThrowableAssert; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.kie.api.command.KieCommands; import org.kie.api.runtime.KieContainer; import org.kie.server.api.exception.KieServicesException; import org.kie.server.api.exception.KieServicesHttpException; import org.kie.server.api.marshalling.MarshallingFormat; import org.kie.server.client.KieServicesClient; import org.kie.server.client.KieServicesConfiguration; import org.kie.server.client.KieServicesFactory; import org.kie.server.integrationtests.config.TestConfig; @RunWith(Parameterized.class) public abstract class RestJmsSharedBaseIntegrationTest extends KieServerBaseIntegrationTest { @Parameterized.Parameters(name = "{index}: {0} {1}") public static Collection<Object[]> data() { KieServicesConfiguration restConfiguration = createKieServicesRestConfiguration(); Collection<Object[]> parameterData = new ArrayList<Object[]>(Arrays.asList(new Object[][] { {MarshallingFormat.JAXB, restConfiguration}, {MarshallingFormat.JSON, restConfiguration}, {MarshallingFormat.XSTREAM, restConfiguration} } )); if (TestConfig.getRemotingUrl() != null && !TestConfig.skipJMS()) { KieServicesConfiguration jmsConfiguration = createKieServicesJmsConfiguration(); parameterData.addAll(Arrays.asList(new Object[][] { {MarshallingFormat.JAXB, jmsConfiguration}, {MarshallingFormat.JSON, jmsConfiguration}, {MarshallingFormat.XSTREAM, jmsConfiguration} }) ); } return parameterData; } @Parameterized.Parameter(0) public MarshallingFormat marshallingFormat; @Parameterized.Parameter(1) public KieServicesConfiguration configuration; protected static KieCommands commandsFactory; protected static KieContainer kieContainer; protected static final String PERSON_CLASS_NAME = "org.jbpm.data.Person"; @Override protected KieServicesClient createDefaultClient() throws Exception { addExtraCustomClasses(extraClasses); if (TestConfig.isLocalServer()) { configuration = KieServicesFactory.newRestConfiguration(TestConfig.getKieServerHttpUrl(), null, null); } return createDefaultClient(configuration, marshallingFormat); } /** * Instantiate custom object. * * @param objectClassIdentifier Object class identifier - usually class name. * @param constructorParameters Object's constructor parameters. * @return Instantiated object. */ protected Object createInstance(String objectClassIdentifier, Object... constructorParameters) { Class<?>[] parameterClasses = new Class[constructorParameters.length]; for(int i = 0; i < constructorParameters.length; i++) { parameterClasses[i] = constructorParameters[i].getClass(); } try { Class<?> clazz = extraClasses.get(objectClassIdentifier); if (clazz != null) { Object object = clazz.getConstructor(parameterClasses).newInstance(constructorParameters); return object; } } catch (Exception e) { throw new RuntimeException("Unable to create object due " + e.getMessage(), e); } throw new RuntimeException("Instantiated class isn't defined in extraClasses set. Please define it first."); } protected Object createPersonInstance(String name) { return createInstance(PERSON_CLASS_NAME, name); } /** * Change user used by client. * * @param username Name of user, default user taken from TestConfig in case of null parameter. */ protected void changeUser(String username) throws Exception { if(username == null) { username = TestConfig.getUsername(); } configuration.setUserName(username); client = createDefaultClient(); } protected Object valueOf(Object object, String fieldName) { try { Field field = object.getClass().getDeclaredField(fieldName); field.setAccessible(true); return field.get(object); } catch (Exception e) { return null; } } protected void setValue(Object object, String fieldName, Object newValue) { try { Field field = object.getClass().getDeclaredField(fieldName); field.setAccessible(true); field.set(object, newValue); } catch (Exception e) { throw new RuntimeException(String.format("Unable to set value to field %s in object %s due " + e.getMessage(), fieldName, object), e); } } protected static KieServicesConfiguration createKieServicesJmsConfiguration() { try { InitialContext context = TestConfig.getInitialRemoteContext(); Queue requestQueue = (Queue) context.lookup(TestConfig.getRequestQueueJndi()); Queue responseQueue = (Queue) context.lookup(TestConfig.getResponseQueueJndi()); ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup(TestConfig.getConnectionFactory()); KieServicesConfiguration jmsConfiguration = KieServicesFactory.newJMSConfiguration( connectionFactory, requestQueue, responseQueue, TestConfig.getUsername(), TestConfig.getPassword()); return jmsConfiguration; } catch (Exception e) { throw new RuntimeException("Failed to create JMS client configuration!", e); } } protected static KieServicesConfiguration createKieServicesRestConfiguration() { return KieServicesFactory.newRestConfiguration(TestConfig.getKieServerHttpUrl(), TestConfig.getUsername(), TestConfig.getPassword()); } protected void assertClientException(ThrowableAssert.ThrowingCallable callable, int expectedHttpCode, String message) { assertClientException(callable, expectedHttpCode, message, message); } protected void assertClientException(ThrowableAssert.ThrowingCallable callable, int expectedHttpCode, String restMessage, String jmsMessage) { if(configuration.isRest()) { Assertions.assertThatThrownBy(callable) .isInstanceOf(KieServicesHttpException.class) .hasFieldOrPropertyWithValue("httpCode", expectedHttpCode) .hasMessageContaining(restMessage); } else { Assertions.assertThatThrownBy(callable) .isInstanceOf(KieServicesException.class) .hasMessageContaining(jmsMessage); } } }