/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.openjpa.persistence.jest; import java.io.InputStream; import java.net.HttpURLConnection; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import junit.framework.TestCase; import com.meterware.httpunit.HttpException; import com.meterware.httpunit.HttpUnitOptions; import com.meterware.httpunit.WebResponse; import com.meterware.servletunit.ServletRunner; import com.meterware.servletunit.ServletUnitClient; /** * Tests JEST Servlet using <A href="http://httpunit.sourceforge.net/doc/servletunit-intro.html">ServletUnit</A>. * * Sets up a class-level Servlet Runner (an in-process Servlet Engine). * * Recognizes following JVM system property * <OL> * <LI><tt>jest.web.xml</tt> : web descriptor resource name looked up as a resource in the current * thread context. Defaults to <tt>WEB-INF/web.xml</tt> * <LI><tt>jest.base.uri</tt> : base uri for all request. Defaults to <tt>http://localhost/jest</tt> * * * @author Pinaki Poddar * */ public class TestJEST extends TestCase { private static ServletRunner container; private static String baseURI; private static String DEFAULT_WEB_XML = "WEB-INF/web.xml"; private static String DEFAULT_BASE_URI = "http://localhost/jest"; private static DocumentBuilder _xmlParser; private static XPathFactory _xpathFactory; /** * Sets up a class-wide Servlet Engine. */ protected void setUp() throws Exception { super.setUp(); if (container == null) { String resource = System.getProperty("jest.web.xml", DEFAULT_WEB_XML); System.err.println("Starting Servlet Container from " + resource); InputStream wdesc = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource); assertNotNull(resource + " not loadable at thread context classpath", wdesc); container = new ServletRunner(wdesc); assertNotNull("Servlet engine could not be started", container); baseURI = System.getProperty("jest.base.uri", DEFAULT_BASE_URI); System.err.println("Base URI " + baseURI); _xmlParser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); _xpathFactory = XPathFactory.newInstance(); } HttpUnitOptions.setExceptionsThrownOnErrorStatus(true); HttpUnitOptions.setScriptingEnabled(false); HttpUnitOptions.setExceptionsThrownOnScriptError(false); } public void testBadURL() throws Exception { assertError(HttpURLConnection.HTTP_NOT_FOUND, uri("some+bad+url")); } public void testDomain() throws Exception { WebResponse response = getResponse(uri("domain")); assertNotNull(response); System.err.println(response.getText()); assertEquals("text/xml", response.getContentType()); Document doc = _xmlParser.parse(response.getInputStream()); assertNotNull(doc); Node metamodel = getNode(doc, "/metamodel"); assertNotNull(metamodel); NodeList entities = getNodes(doc, "/metamodel/entity"); assertEquals(2, ((NodeList)entities).getLength()); } /** * Gets the response for the given URL. */ WebResponse getResponse(String url) { try { ServletUnitClient client = container.newClient(); return client.getResponse(url); } catch (Exception e) { e.printStackTrace(); fail("Failed to get response on " + url + ". Error: " + e.getMessage()); } return null; } /** * Create a URI string for the given path with the base URI prepended. */ protected String uri(String path) { return baseURI + '/' + path; } /** * Asserts that the given URL generates the given error code. * @param error HTTP error code * @param url URL string */ void assertError(int error, String url) throws Exception { ServletUnitClient client = container.newClient(); try { client.getResponse(url); fail("expected HTTP error " + error + " on " + url); } catch (HttpException e) { assertEquals("Unexpected HTTP Error code for " + url, error, e.getResponseCode()); } } NodeList getNodes(Document doc, String path) throws Exception { XPath xpath = _xpathFactory.newXPath(); Object nodes = xpath.compile(path).evaluate(doc, XPathConstants.NODESET); assertTrue(nodes instanceof NodeList); return (NodeList)nodes; } Node getNode(Document doc, String path) throws Exception { XPath xpath = _xpathFactory.newXPath(); Object node = xpath.compile(path).evaluate(doc, XPathConstants.NODE); assertTrue(node instanceof Node); return (Node)node; } }