/* * 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.p.router; import com.sun.xml.ws.transport.http.HttpAdapter; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.ops4j.pax.exam.Configuration; import org.ops4j.pax.exam.Option; import org.ops4j.pax.exam.junit.PaxExam; import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; import org.ops4j.pax.exam.spi.reactors.PerClass; import org.ops4j.pax.exam.util.Filter; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; import ru.codeinside.gws.api.CryptoProvider; import ru.codeinside.gws.api.Declarant; import ru.codeinside.gws.api.InfoSystem; import ru.codeinside.gws.api.Packet; import ru.codeinside.gws.api.ReceiptContext; import ru.codeinside.gws.api.RequestContext; import ru.codeinside.gws.api.Revision; import ru.codeinside.gws.api.Server; import ru.codeinside.gws.api.ServerRequest; import ru.codeinside.gws.api.ServerResponse; import javax.inject.Inject; import javax.servlet.ServletContext; import javax.xml.namespace.QName; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Date; import java.util.Hashtable; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.ops4j.pax.exam.CoreOptions.junitBundles; import static org.ops4j.pax.exam.CoreOptions.mavenBundle; import static org.ops4j.pax.exam.CoreOptions.options; @RunWith(PaxExam.class) @ExamReactorStrategy(PerClass.class) // зависимые тесты public class GlassfishIntegrationTest { // на сборочном дикие тормоза @Inject @Filter(value = "osgi.web.contextpath=/smev", timeout = 180000L) private ServletContext servletContext; @Inject private CryptoProvider cryptoProvider; @Inject @Filter("component.name=mvvact") private Server server; @Inject private BundleContext bundleContext; ServiceRegistration<Declarant> declarantServiceRegistration; ServiceRegistration<Server> serverRegistration; { HttpAdapter.dump = true; } @Configuration public Option[] config() { Killer.killPortOwner(18080); return options( mavenBundle("ru.codeinside", "gws-p-registry-api", "1.0.1"), mavenBundle("ru.codeinside", "gws-p-registry-hc", "1.0.1"), mavenBundle("ru.codeinside", "gws-api", "1.0.11"), mavenBundle("ru.codeinside", "gws-wsdl", "1.1.0"), mavenBundle("ru.codeinside", "gws-core", "1.1.2"), mavenBundle("ru.codeinside", "gws-crypto-cryptopro", "1.0.4"), mavenBundle("ru.codeinside", "gws-s-oep-declarer", "1.0.5"), mavenBundle("ru.codeinside", "gws-p-adapter", "1.0.4"), mavenBundle("ru.codeinside", "gws-p-router", "1.0.6"), mavenBundle("ru.codeinside", "gws-xml-normalizer", "1.0.0"), mavenBundle("ru.codeinside", "gws-xml-signature-injector", "1.0.0"), junitBundles() ); } @Before public void before() { assertNotNull(cryptoProvider); assertNotNull(server); assertNotNull(servletContext); Declarant declarant = new Declarant() { @Override public ServerResponse processRequest(ServerRequest serverRequest, String name) { ServerResponse sresponse = new ServerResponse(); sresponse.action = new QName("http://mvv.oep.com/", "putData"); Packet p = new Packet(); sresponse.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 sresponse; } }; Server server1 = new Server() { @Override public Revision getRevision() { return Revision.rev120315; } @Override public URL getWsdlUrl() { return null; } @Override public ServerResponse processRequest(RequestContext requestContext) { return null; } @Override public ServerResponse processStatus(String statusMessage, ReceiptContext exchangeContext) { return null; } @Override public ServerResponse processResult(String resultMessage, ReceiptContext exchangeContext) { return null; } }; declarantServiceRegistration = bundleContext.registerService(Declarant.class, declarant, null); Hashtable<String, Object> p = new Hashtable<String, Object>(); p.put("component.name", "xyz"); serverRegistration = bundleContext.registerService(Server.class, server1, p); } @After public void after() { if (declarantServiceRegistration != null) { declarantServiceRegistration.unregister(); declarantServiceRegistration = null; } if (serverRegistration != null) { serverRegistration.unregister(); serverRegistration = null; } } @Test public void wsdlInfo() throws InterruptedException, IOException { // 1. Общий индекс HttpURLConnection con = (HttpURLConnection) (new URL("http://localhost:18080/smev").openConnection()); con.setDoInput(true); assert200(con); ByteArrayOutputStream bos = new ByteArrayOutputStream(); copy(con.getInputStream(), bos); String response = bos.toString("UTF8"); assertTrue(response, response.contains("mvvact")); assertTrue(response, response.contains("xyz")); // саморегистрация! // 2.Сервис con = (HttpURLConnection) (new URL("http://localhost:18080/smev/mvvact").openConnection()); con.setDoInput(true); assert200(con); bos = new ByteArrayOutputStream(); copy(con.getInputStream(), bos); response = bos.toString("UTF8"); assertTrue(response, response.contains("?wsdl")); // 3. Схема con = (HttpURLConnection) (new URL("http://localhost:18080/smev/mvvact/mvvact_schema1.xsd").openConnection()); con.setDoInput(true); assert200(con); bos = new ByteArrayOutputStream(); copy(con.getInputStream(), bos); response = bos.toString("UTF8"); assertTrue(response, response.contains("Include")); } @Test public void soap() throws InterruptedException, IOException { HttpURLConnection con = (HttpURLConnection) (new URL("http://localhost:18080/smev/mvvact").openConnection()); con.setConnectTimeout(30 * 1000); con.setReadTimeout(30 * 1000); con.setRequestMethod("POST"); con.setRequestProperty("Content-type", "text/xml; charset=utf-8"); con.setDoOutput(true); con.setDoInput(true); copy(getClass().getClassLoader().getResourceAsStream("soap/request-1.xml"), con.getOutputStream()); assert200(con); ByteArrayOutputStream bos = new ByteArrayOutputStream(); copy(con.getInputStream(), bos); String response = bos.toString("UTF8"); assertTrue(response, response.contains("http://smev.gosuslugi.ru/actors/smev")); } private void assert200(HttpURLConnection con) throws IOException { if (con.getResponseCode() != 200) { String response; try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); copy(con.getErrorStream(), bos); response = bos.toString("UTF8"); } catch (IOException e) { response = "NESTED ERROR:" + e.getMessage(); } fail("Code:" + con.getResponseCode() + ", error: " + response); } } private void copy(InputStream input, OutputStream output) throws IOException { byte[] buffer = new byte[1024]; int n; while (-1 != (n = input.read(buffer))) { output.write(buffer, 0, n); } input.close(); output.close(); } }