/** * 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.cxf.systest.servlet; import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.Set; import javax.jws.WebService; import javax.wsdl.factory.WSDLFactory; import javax.wsdl.xml.WSDLReader; import javax.xml.ws.Endpoint; import javax.xml.ws.soap.SOAPBinding; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import com.meterware.httpunit.GetMethodWebRequest; import com.meterware.httpunit.PostMethodWebRequest; import com.meterware.httpunit.WebLink; import com.meterware.httpunit.WebRequest; import com.meterware.httpunit.WebResponse; import com.meterware.servletunit.ServletUnitClient; import org.apache.cxf.Bus; import org.apache.cxf.BusException; import org.apache.cxf.BusFactory; import org.apache.cxf.staxutils.StaxUtils; import org.apache.hello_world_soap_http.BaseGreeterImpl; import org.junit.Before; import org.junit.Test; public class CXFServletTest extends AbstractServletTest { @Before public void setUp() throws Exception { BusFactory.setDefaultBus(null); BusFactory.setThreadDefaultBus(null); super.setUp(); } @Override protected Bus createBus() throws BusException { return null; } @Test public void testPostInvokeServices() throws Exception { invoke(StandardCharsets.UTF_8.name()); invoke("iso-8859-1"); } private void invoke(String encoding) throws Exception { WebRequest req = new PostMethodWebRequest(CONTEXT_URL + "/services/greeter", getClass().getResourceAsStream("GreeterMessage.xml"), "text/xml; charset=" + encoding); ServletUnitClient client = newClient(); WebResponse response = client.getResponse(req); client.setExceptionsThrownOnErrorStatus(false); assertEquals("text/xml", response.getContentType()); assertTrue(encoding.equalsIgnoreCase(response.getCharacterSet())); Document doc = StaxUtils.read(response.getInputStream()); assertNotNull(doc); addNamespace("h", "http://apache.org/hello_world_soap_http/types"); assertValid("/s:Envelope/s:Body", doc); assertValid("//h:sayHiResponse", doc); } @Test public void testGetServiceList() throws Exception { ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(false); WebResponse res = client.getResponse(CONTEXT_URL + "/services"); WebLink[] links = res.getLinks(); assertEquals("Wrong number of service links", 6, links.length); Set<String> links2 = new HashSet<>(); for (WebLink l : links) { links2.add(l.getURLString()); } assertTrue(links2.contains(CONTEXT_URL + "/services/greeter?wsdl")); assertTrue(links2.contains(CONTEXT_URL + "/services/greeter2?wsdl")); assertTrue(links2.contains("http://cxf.apache.org/MyGreeter?wsdl")); assertEquals("text/html", res.getContentType()); res = client.getResponse(CONTEXT_URL + "/services/"); links = res.getLinks(); links2.clear(); for (WebLink l : links) { links2.add(l.getURLString()); } assertEquals("Wrong number of service links", 6, links.length); assertTrue(links2.contains(CONTEXT_URL + "/services/greeter?wsdl")); assertTrue(links2.contains(CONTEXT_URL + "/services/greeter2?wsdl")); assertTrue(links2.contains("http://cxf.apache.org/MyGreeter?wsdl")); assertEquals("text/html", res.getContentType()); // Ensure that the Bus is available for people doing an Endpoint.publish() or similar. assertNotNull(BusFactory.getDefaultBus(false)); } @Test public void testGetUnformatServiceList() throws Exception { ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(false); WebResponse res = client.getResponse(CONTEXT_URL + "/services?formatted=false"); assertTrue(res.getText().contains("http://localhost/mycontext/services/greeter3")); assertTrue(res.getText().contains("http://localhost/mycontext/services/greeter2")); assertTrue(res.getText().contains("http://localhost/mycontext/services/greeter")); } @Test public void testServiceListWithLoopAddress() throws Exception { ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(false); WebResponse res = client.getResponse(CONTEXT_URL + "/services"); assertTrue(res.getText().contains("http://localhost/mycontext/services/greeter3")); assertTrue(res.getText().contains("http://localhost/mycontext/services/greeter2")); assertTrue(res.getText().contains("http://localhost/mycontext/services/greeter")); WebRequest req = new GetMethodQueryWebRequest(CONTEXT_URL + "/services/greeter?wsdl"); res = client.getResponse(req); req = new GetMethodQueryWebRequest(CONTEXT_URL + "/services/greeter2?wsdl"); res = client.getResponse(req); req = new GetMethodQueryWebRequest(CONTEXT_URL + "/services/greeter3?wsdl"); res = client.getResponse(req); String loopAddr = "http://127.0.0.1/mycontext"; res = client.getResponse(loopAddr + "/services"); assertFalse(res.getText().contains( "http://127.0.0.1/mycontext/serviceshttp://localhost/mycontext/services/greeter")); } @Test public void testGetWSDL() throws Exception { ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(true); WebRequest req = new GetMethodQueryWebRequest(CONTEXT_URL + "/services/greeter?wsdl"); WebResponse res = client.getResponse(req); assertEquals(200, res.getResponseCode()); assertEquals("text/xml", res.getContentType()); Document doc = StaxUtils.read(res.getInputStream()); assertNotNull(doc); assertValid("//wsdl:operation[@name='greetMe']", doc); assertValid("//wsdlsoap:address[@location='" + CONTEXT_URL + "/services/greeter']", doc); } @Test public void testGetWSDLWithMultiplePublishedEndpointUrl() throws Exception { ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(true); WebRequest req = new GetMethodQueryWebRequest(CONTEXT_URL + "/services/greeter5?wsdl"); WebResponse res = client.getResponse(req); assertEquals(200, res.getResponseCode()); assertEquals("text/xml", res.getContentType()); Document doc = StaxUtils.read(res.getInputStream()); assertNotNull(doc); WSDLReader wsdlReader = WSDLFactory.newInstance().newWSDLReader(); wsdlReader.setFeature("javax.wsdl.verbose", false); assertValid("//wsdl:service[@name='SOAPService']/wsdl:port[@name='SoapPort']/wsdlsoap:address[@location='" + "http://cxf.apache.org/publishedEndpointUrl1']", doc); assertValid("//wsdl:service[@name='SOAPService']/wsdl:port[@name='SoapPort1']/wsdlsoap:address[@location='" + "http://cxf.apache.org/publishedEndpointUrl2']", doc); } @Test public void testGetWSDLWithIncludes() throws Exception { ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(true); WebRequest req = new GetMethodQueryWebRequest(CONTEXT_URL + "/services/greeter3?wsdl"); WebResponse res = client.getResponse(req); assertEquals(200, res.getResponseCode()); assertEquals("text/xml", res.getContentType()); Document doc = StaxUtils.read(res.getInputStream()); assertNotNull(doc); assertXPathEquals("//xsd:include/@schemaLocation", "http://localhost/mycontext/services/greeter3?xsd=hello_world_includes2.xsd", doc.getDocumentElement()); req = new GetMethodQueryWebRequest(CONTEXT_URL + "/services/greeter3?xsd=hello_world_includes2.xsd"); res = client.getResponse(req); assertEquals(200, res.getResponseCode()); assertEquals("text/xml", res.getContentType()); doc = StaxUtils.read(res.getInputStream()); assertNotNull(doc); assertValid("//xsd:complexType[@name='ErrorCode']", doc); } @Test public void testGetWSDLWithXMLBinding() throws Exception { ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(true); WebRequest req = new GetMethodQueryWebRequest(CONTEXT_URL + "/services/greeter2?wsdl"); WebResponse res = client.getResponse(req); assertEquals(200, res.getResponseCode()); assertEquals("text/xml", res.getContentType()); Document doc = StaxUtils.read(res.getInputStream()); assertNotNull(doc); addNamespace("http", "http://schemas.xmlsoap.org/wsdl/http/"); assertValid("//wsdl:operation[@name='greetMe']", doc); NodeList addresses = assertValid("//http:address/@location", doc); boolean found = true; for (int i = 0; i < addresses.getLength(); i++) { String address = addresses.item(i).getLocalName(); if (address.startsWith("http://localhost") && address.endsWith("/services/greeter2")) { found = true; break; } } assertTrue(found); } @Test public void testInvalidServiceUrl() throws Exception { ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(false); WebResponse res = client.getResponse(CONTEXT_URL + "/services/NoSuchService"); assertEquals(404, res.getResponseCode()); assertEquals("text/html", res.getContentType()); } @Test public void testServiceWsdlNotFound() throws Exception { WebRequest req = new GetMethodWebRequest(CONTEXT_URL + "/services/NoSuchService?wsdl"); expectErrorCode(req, 404, "Response code 404 required for invalid WSDL url."); } @Test public void testGetImportedXSD() throws Exception { ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(true); WebRequest req = new GetMethodQueryWebRequest(CONTEXT_URL + "/services/greeter?wsdl"); WebResponse res = client.getResponse(req); assertEquals(200, res.getResponseCode()); String text = res.getText(); assertEquals("text/xml", res.getContentType()); assertTrue(text.contains(CONTEXT_URL + "/services/greeter?wsdl=test_import.xsd")); req = new GetMethodQueryWebRequest(CONTEXT_URL + "/services/greeter?wsdl=test_import.xsd"); res = client.getResponse(req); assertEquals(200, res.getResponseCode()); text = res.getText(); assertEquals("text/xml", res.getContentType()); assertTrue("the xsd should contain the completType SimpleStruct", text.contains("<complexType name=\"SimpleStruct\">")); } @Test public void testGetBinding() throws Exception { Endpoint ep = Endpoint.create("http://schemas.xmlsoap.org/wsdl/soap/http", new HelloImpl()); assertTrue(ep.getBinding() instanceof SOAPBinding); } @WebService(name = "Hello", portName = "HelloPort", serviceName = "HelloService", targetNamespace = "http://cxf.apache.org/hello") public static class HelloImpl { public String hello(String name) { return "Hello " + name; } } @WebService(serviceName = "SOAPService", portName = "SoapPort", endpointInterface = "org.apache.hello_world_soap_http.Greeter", targetNamespace = "http://apache.org/hello_world_soap_http") public static class NoWsdlGreeter extends BaseGreeterImpl { } }