diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 389361a..b691463 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -12,19 +12,19 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - - name: Set up JDK 8 - uses: actions/setup-java@v2 + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - java-version: '8' + java-version: '17' distribution: 'zulu' - name: Cache local Maven repository - uses: actions/cache@v2.1.6 + uses: actions/cache@v4 with: path: ~/.m2/ - key: ${{ runner.os }}-maven-${{ hashFiles('pom.xml') }} + key: ${{ runner.os }}-maven-${{ hashFiles('pom.xml') }} - name: Build with Maven run: mvn clean verify diff --git a/pom.xml b/pom.xml index bafdf14..7cd5196 100644 --- a/pom.xml +++ b/pom.xml @@ -34,19 +34,20 @@ UTF-8 - 1.7 - 1.7 - 1.7 + + 1.8 + 1.8 + 1.8 - 1.16.6 + 1.18.34 4.4.1 org.mockito - mockito-all - 1.9.5 + mockito-core + 4.11.0 test @@ -55,10 +56,12 @@ 4.12 test + org.projectlombok lombok ${lombok.version} + provided org.apache.commons @@ -94,26 +97,38 @@ + - javax.xml.soap - saaj-api - 1.3.5 + com.sun.xml.messaging.saaj + saaj-impl + 1.5.3 + org.slf4j - slf4j-log4j12 + slf4j-api 1.7.21 - - javax.xml.bind - jaxb-api - 2.2.7 + org.slf4j + slf4j-log4j12 + 1.7.21 + test + + - com.sun.xml.bind - jaxb-impl - 2.2.6 + org.glassfish.jaxb + jaxb-runtime + 2.3.9 @@ -137,7 +152,7 @@ org.apache.maven.plugins maven-source-plugin - 2.2.1 + 3.3.0 attach-sources @@ -151,7 +166,10 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.9.1 + 3.6.3 + + none + attach-javadocs diff --git a/src/test/java/br/ufsc/bridge/soap/http/SoapHttpClientTest.java b/src/test/java/br/ufsc/bridge/soap/http/SoapHttpClientTest.java index c1fb533..1e21117 100644 --- a/src/test/java/br/ufsc/bridge/soap/http/SoapHttpClientTest.java +++ b/src/test/java/br/ufsc/bridge/soap/http/SoapHttpClientTest.java @@ -24,7 +24,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.mockito.Matchers; +import org.mockito.ArgumentMatchers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -58,13 +58,13 @@ public class SoapHttpClientTest { @Before public void init() throws ClientProtocolException, IOException { - MockitoAnnotations.initMocks(this); + MockitoAnnotations.openMocks(this); this.headers = new Header[2]; this.headers[0] = new BasicHeader(HttpHeaders.CONTENT_TYPE, " application/soap+xml"); this.headers[1] = new BasicHeader("MIME-Version", "1.0"); - when(this.httpClient.execute(Matchers.any(HttpPost.class))).thenReturn(this.response); + when(this.httpClient.execute(ArgumentMatchers.any(HttpPost.class))).thenReturn(this.response); when(this.response.getStatusLine()).thenReturn(this.status); when(this.response.getEntity()).thenReturn(this.entity); @@ -159,7 +159,7 @@ public void responseClosedAndEntityConsumedOnOtherErrors() throws ClientProtocol @Test @SuppressWarnings("unchecked") public void ioExcpetion() throws ClientProtocolException, IOException, SoapHttpResponseException { - when(this.httpClient.execute(Matchers.any(HttpHost.class), Matchers.any(HttpPost.class))) + when(this.httpClient.execute(ArgumentMatchers.any(HttpHost.class), ArgumentMatchers.any(HttpPost.class))) .thenThrow(ConnectionClosedException.class, ConnectTimeoutException.class, ConnectException.class); diff --git a/src/test/java/br/ufsc/bridge/soap/http/SoapMessageBuilderTest.java b/src/test/java/br/ufsc/bridge/soap/http/SoapMessageBuilderTest.java new file mode 100644 index 0000000..a531e29 --- /dev/null +++ b/src/test/java/br/ufsc/bridge/soap/http/SoapMessageBuilderTest.java @@ -0,0 +1,75 @@ +package br.ufsc.bridge.soap.http; + +import java.io.ByteArrayInputStream; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.junit.Assert; +import org.junit.Test; +import org.w3c.dom.Document; + +import br.ufsc.bridge.soap.jaxb.JAXBMessageBuilder; +import br.ufsc.bridge.soap.string.StringMessageBuilder; +import br.ufsc.bridge.soap.xpath.XPathFactoryAssist; + +/** + * Exercita o caminho SAAJ (MessageFactory/SOAPFactory), que não é coberto pelos outros testes. + * Até o Java 8 a implementação SAAJ vinha embutida na JDK; a partir do Java 11 ela depende do + * saaj-impl declarado no pom, e a falha só aparece em runtime. Sem este teste o build fica verde + * mesmo com a lib incapaz de montar um envelope. + */ +public class SoapMessageBuilderTest { + + private static final String WSSE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; + + private static final String BODY = "42"; + + @XmlRootElement(name = "Ping", namespace = "urn:teste") + @XmlAccessorType(XmlAccessType.FIELD) + public static class Ping { + @XmlElement(namespace = "urn:teste") + private String valor = "42"; + } + + private XPathFactoryAssist envelope(byte[] message) throws Exception { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + Document document = factory.newDocumentBuilder().parse(new ByteArrayInputStream(message)); + return new XPathFactoryAssist(document); + } + + @Test + public void stringBuilderComCredencialGeraUsernameToken() throws Exception { + byte[] message = new StringMessageBuilder(new SoapCredential("usuario", "senha")).createMessage(BODY); + + XPathFactoryAssist x = this.envelope(message); + Assert.assertEquals(WSSE, x.getString("namespace-uri(//*[local-name()='Security'])")); + Assert.assertEquals("usuario", x.getString("//*[local-name()='Username']")); + Assert.assertEquals("senha", x.getString("//*[local-name()='Password']")); + Assert.assertEquals("UsernameToken-2", x.getString("//*[local-name()='UsernameToken']/@*[local-name()='Id']")); + Assert.assertEquals("42", x.getString("//*[local-name()='Body']//*[local-name()='valor']")); + } + + @Test + public void stringBuilderSemCredencialNaoGeraSecurity() throws Exception { + byte[] message = new StringMessageBuilder(null).createMessage(BODY); + + XPathFactoryAssist x = this.envelope(message); + Assert.assertEquals(Long.valueOf(0), x.count("//*[local-name()='Security']")); + Assert.assertEquals("42", x.getString("//*[local-name()='Body']//*[local-name()='valor']")); + } + + @Test + public void jaxbBuilderMarshallaOBody() throws Exception { + byte[] message = new JAXBMessageBuilder(new SoapCredential("usuario", "senha")).createMessage(new Ping()); + + XPathFactoryAssist x = this.envelope(message); + Assert.assertEquals("usuario", x.getString("//*[local-name()='Username']")); + Assert.assertEquals("urn:teste", x.getString("namespace-uri(//*[local-name()='Body']/*)")); + Assert.assertEquals("42", x.getString("//*[local-name()='Body']//*[local-name()='valor']")); + } +}