/* * 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. * You may obtain a copy of the License at * * 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.karaf.itest.util; import java.lang.reflect.Field; import com.github.tomakehurst.wiremock.WireMockServer; import org.junit.runner.notification.RunNotifier; import org.junit.runners.model.InitializationError; import org.ops4j.pax.exam.junit.PaxExam; import static com.github.tomakehurst.wiremock.client.WireMock.*; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.*; /** * Special extension to PaxExam JUNit runner to allow use of static server to return fixed responses to easily test * kie server client operations instead of relying on fully configured workbench instance to be available for the tests. * * Since actual test runs within Karaf, bootstrapping server as part of beforeClass won't work as that is already in Karaf and thus will require * lots of dependencies and bundles. */ public class PaxExamWithWireRestClientMock extends PaxExam { private WireMockServer wireMockServer; private Class<?> clazz; private Integer port; private String host; public PaxExamWithWireRestClientMock(Class<?> klass) throws InitializationError { super(klass); this.clazz = klass; port = (Integer) getFieldValue("PORT"); host = (String) getFieldValue("HOST"); } @Override public void run(RunNotifier notifier) { this.wireMockServer = new WireMockServer(wireMockConfig().bindAddress(host).port(port)); this.wireMockServer.start(); setupMockServer(); System.out.println("WireMock server started and bound to localhost:" + port); super.run(notifier); this.wireMockServer.stop(); } protected Object getFieldValue(String name) { try { Field f = clazz.getField(name); f.setAccessible(true); return f.get(null); } catch (Exception e) { return null; } } public void setupMockServer() { configureFor("localhost", port); stubFor(post(urlEqualTo("/jbpm-console/rest/execute")) .withHeader("Accept", equalTo("application/xml")) .willReturn(aResponse() .withStatus(200) .withHeader("Content-Type", "application/xml") .withBody("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<command-response>\n" + " <deployment-id>org.jbpm:Evaluation:1.0</deployment-id>\n" + " <ver>6.3.0.1</ver>\n" + " <process-instance index=\"0\">\n" + " <process-id>evaluation</process-id>\n" + " <id>40</id>\n" + " <state>1</state>\n" + " <parentProcessInstanceId>0</parentProcessInstanceId>\n" + " <command-name>StartProcessCommand</command-name>\n" + " </process-instance>\n" + "</command-response>"))); } }