/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gws.core.sproto; import com.sun.xml.ws.developer.SchemaValidation; import org.apache.commons.io.IOUtils; import org.junit.Assert; import org.junit.Test; import ru.codeinside.gws.api.CryptoProvider; import ru.codeinside.gws.api.InfoSystem; import ru.codeinside.gws.api.Packet; import ru.codeinside.gws.api.ServerRequest; import ru.codeinside.gws.api.ServerResponse; import ru.codeinside.gws.core.R; import ru.codeinside.gws.core.Support; import javax.annotation.Resource; import javax.xml.namespace.QName; import javax.xml.soap.SOAPMessage; import javax.xml.ws.BindingType; import javax.xml.ws.Endpoint; import javax.xml.ws.Provider; import javax.xml.ws.Service; import javax.xml.ws.ServiceMode; import javax.xml.ws.WebServiceContext; import javax.xml.ws.WebServiceProvider; import javax.xml.ws.soap.MTOM; import javax.xml.ws.soap.SOAPBinding; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.util.Date; import java.util.concurrent.atomic.AtomicReference; import static org.mockito.Mockito.mock; public class R120315_Metro_Test extends Assert { final static Support.PortDefinition mvvPort = Support.getServicePort("mvvact/wsdl/mvvact.wsdl"); @Test public void testRequestParsing() throws IOException { final URL addr = new URL("http://127.0.0.1:7771/"); final AtomicReference<ServerRequest> request = new AtomicReference<ServerRequest>(); Endpoint endpoint = Endpoint.publish("http://127.0.0.1:7771/", new Router(new Invoker() { @Override public SOAPMessage invoke(SOAPMessage in, WebServiceContext ctx) { CryptoProvider cryptoProvider = mock(CryptoProvider.class); R120315 r120315 = new R120315(cryptoProvider, null, null); request.set(r120315.processRequest(in, mvvPort.service, mvvPort.portDef)); ServerResponse response = new ServerResponse(); response.action = new QName("http://mvv.oep.com/", "putData"); Packet p = new Packet(); response.packet = p; p.exchangeType = "Test"; p.serviceCode = "111111111111"; p.requestIdRef = "111111111111"; p.originRequestIdRef = "111111111111"; p.caseNumber = "111111111111"; p.typeCode = Packet.Type.SERVICE; p.status = Packet.Status.PROCESS; p.recipient = p.sender = new InfoSystem("PNZR01581", "111111111"); p.date = new Date(); return r120315.processResponse(null, response, mvvPort.service, mvvPort.portDef, null); } })); try { assertTrue(endpoint.isPublished()); HttpURLConnection con = (HttpURLConnection) addr.openConnection(); con.setRequestProperty("Content-type", "text/xml; charset=utf-8"); con.setDoOutput(true); con.setDoInput(true); IOUtils.copy(R.getRequiredResourceStream("mvvact/putData/request.xml"), con.getOutputStream()); String result = IOUtils.toString(con.getInputStream(), "UTF8"); assertNotNull(result); ServerRequest req = request.get(); assertNull(req.routerPacket); assertEquals(new QName("http://mvv.oep.com/", "putData"), req.action); assertEquals("UniversalMVV", req.packet.serviceName); assertEquals(Packet.Type.SERVICE, req.packet.typeCode); assertEquals(Packet.Status.REQUEST, req.packet.status); assertEquals("Test", req.packet.exchangeType); assertEquals("111111111111", req.packet.requestIdRef); assertEquals("111111111111", req.packet.originRequestIdRef); assertEquals("111111111111", req.packet.serviceCode); assertEquals("111111111111", req.packet.caseNumber); assertNull(req.attachmens); assertNull(req.docRequestCode); } finally { endpoint.stop(); } } @Test public void testValidationIn() throws IOException { String portAddr = "http://127.0.0.1:7772/"; Endpoint endpoint = Endpoint.publish(portAddr, new Router(null)); try { assertTrue(endpoint.isPublished()); HttpURLConnection con = (HttpURLConnection) new URL(portAddr).openConnection(); con.setRequestProperty("Content-type", "text/xml; charset=utf-8"); con.setDoOutput(true); con.setDoInput(true); IOUtils.copy(R.getRequiredResourceStream("fss-request-1.xml"), con.getOutputStream()); assertEquals(500, con.getResponseCode()); String error = IOUtils.toString(con.getErrorStream(), "UTF8"); assertTrue(error.contains("Cannot find the declaration of element 'ws:request'")); } finally { endpoint.stop(); } } @Test public void testValidationOut() throws IOException { final AtomicReference<ServerRequest> request = new AtomicReference<ServerRequest>(); String portAddr = "http://127.0.0.1:7773/"; Endpoint endpoint = Endpoint.publish(portAddr, new Router(new Invoker() { @Override public SOAPMessage invoke(SOAPMessage in, WebServiceContext ctx) { CryptoProvider cryptoProvider = mock(CryptoProvider.class); R120315 r120315 = new R120315(cryptoProvider, null, null); request.set(r120315.processRequest(in, mvvPort.service, mvvPort.portDef)); try { return R.getSoapResource("fss-response-2.xml"); } catch (Exception e) { throw new RuntimeException(e); } } })); try { assertTrue(endpoint.isPublished()); HttpURLConnection con = (HttpURLConnection) new URL(portAddr).openConnection(); con.setRequestProperty("Content-type", "text/xml; charset=utf-8"); con.setDoOutput(true); con.setDoInput(true); IOUtils.copy(R.getRequiredResourceStream("mvvact/updateStatus/UpdateStatus_request.xml"), con.getOutputStream()); assertEquals(500, con.getResponseCode()); String error = IOUtils.toString(con.getErrorStream(), "UTF8"); assertTrue(error.contains("Cannot find the declaration of element 'ns3:requestResponse'")); ServerRequest req = request.get(); assertNull(req.routerPacket); assertEquals(new QName("http://mvv.oep.com/", "updateStatus"), req.action); assertNull(req.packet.serviceName); assertEquals(Packet.Type.SERVICE, req.packet.typeCode); assertEquals(Packet.Status.REQUEST, req.packet.status); assertEquals("Test", req.packet.exchangeType); assertEquals("11111111111", req.packet.requestIdRef); assertEquals("111111111111", req.packet.originRequestIdRef); assertEquals("1111111111", req.packet.serviceCode); assertEquals("1111111111111", req.packet.caseNumber); assertNull(req.attachmens); assertNull(req.docRequestCode); } finally { endpoint.stop(); } } @SchemaValidation(inbound = true, outbound = true) @ServiceMode(Service.Mode.MESSAGE) @MTOM @WebServiceProvider(targetNamespace = "http://mvv.oep.com/", serviceName = "MVVActService", portName = "MVVActPort", wsdlLocation = "mvvact/wsdl/mvvact.wsdl") @BindingType(value = SOAPBinding.SOAP11HTTP_MTOM_BINDING) public class Router implements Provider<SOAPMessage> { final Invoker invoker; @Resource WebServiceContext wsContext; Router(Invoker invoker) { this.invoker = invoker; } @Override public SOAPMessage invoke(SOAPMessage in) { return invoker.invoke(in, wsContext); } } }