Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Proof of concept jUnit test to trigger NetKernel module XUnit tests and assert test status
dependencies {
compile group: 'urn.org.netkernel', name: 'mod.hds', version: '[1.1.1,)'
testCompile (
[group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.2'],
[group: 'junit', name: 'junit', version: '4.7+'],
[group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3']
)
}
package;
import static org.hamcrest.CoreMatchers.equalTo;
import java.io.IOException;
import java.io.StringReader;
import java.util.Optional;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class NetKernelRemoteXUnitTests {
@Rule
public ErrorCollector collector = new ErrorCollector();
/**
* Example jUnit test that runs all NetKernel xUnit tests configured for a given Module.
*
* The url passed to the runNetKernelXUnitTests method has to point to a running NetKernel instance accessible to the jUnit executable.
* Should be of the form: <NK Backend fulcrum address>/test/exec/xml/test:<module uri>
*
* @throws Exception
*
*/
@Test
public void runXUnitTests() throws Exception {
// SETUP
// EXECUTE
// Code from: http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientWithResponseHandler.java
String response = runNetKernelXUnitTests("http://localhost:1060/test/exec/xml/test:urn:mymodule", false)
.orElseThrow(IllegalStateException::new);
// VERIFY
assertTestsHavePassed(response);
}
protected Optional<String> runNetKernelXUnitTests(String url, boolean suppressConsoleOutput) {
String responseBody = null;
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
HttpGet httpget = new HttpGet(url);
if (!suppressConsoleOutput) System.out.println("Executing request " + httpget.getRequestLine());
// Create a custom response handler
ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
@Override
public String handleResponse(
final HttpResponse response) throws ClientProtocolException, IOException {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
throw new ClientProtocolException("Unexpected response status: " + status);
}
}
};
responseBody = httpclient.execute(httpget, responseHandler);
if (!suppressConsoleOutput) {
System.out.println("----------------------------------------");
System.out.println(responseBody);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
httpclient.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return Optional.of(responseBody);
}
protected void assertTestsHavePassed(String responseBody) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(responseBody)));
//see: https://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/package-summary.html
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "/testlist/test";
NodeList testNodes = (NodeList) xpath.evaluate(expression, document, XPathConstants.NODESET);
for (int i = 0; i < testNodes.getLength(); i++) {
Node testNode = testNodes.item(i);
String testStatus = testNode.getAttributes().getNamedItem("testStatus").getNodeValue();
Node testNameNode = testNode.getAttributes().getNamedItem("name");
String failureMessage = "Test FAILED: " + ((testNameNode != null) ? testNameNode.getNodeValue() : "#" + (i+1));
collector.checkThat(failureMessage, testStatus, equalTo("success"));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment