You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pp...@apache.org on 2023/04/20 09:04:18 UTC

[camel-quarkus] 05/05: Test that WSDLs served in JVM and native modes are the same #4746

This is an automated email from the ASF dual-hosted git repository.

ppalaga pushed a commit to branch 2.13.x
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit c77563ff4257be0af980c73430a210c366ee96fb
Author: Peter Palaga <pp...@redhat.com>
AuthorDate: Wed Apr 19 20:24:11 2023 +0200

    Test that WSDLs served in JVM and native modes are the same #4746
---
 .../component/cxf/soap/server/it/Java2wsIT.java    |  24 ++++
 .../component/cxf/soap/server/it/Java2wsTest.java  | 126 +++++++++++++++++++++
 2 files changed, 150 insertions(+)

diff --git a/integration-test-groups/cxf-soap/cxf-soap-server/src/test/java/org/apache/camel/quarkus/component/cxf/soap/server/it/Java2wsIT.java b/integration-test-groups/cxf-soap/cxf-soap-server/src/test/java/org/apache/camel/quarkus/component/cxf/soap/server/it/Java2wsIT.java
new file mode 100644
index 0000000000..7c8d7ae1f7
--- /dev/null
+++ b/integration-test-groups/cxf-soap/cxf-soap-server/src/test/java/org/apache/camel/quarkus/component/cxf/soap/server/it/Java2wsIT.java
@@ -0,0 +1,24 @@
+/*
+ * 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 io.quarkiverse.cxf.it.server;
+
+import io.quarkus.test.junit.QuarkusIntegrationTest;
+
+@QuarkusIntegrationTest
+public class Java2wsIT extends Java2wsTest {
+
+}
diff --git a/integration-test-groups/cxf-soap/cxf-soap-server/src/test/java/org/apache/camel/quarkus/component/cxf/soap/server/it/Java2wsTest.java b/integration-test-groups/cxf-soap/cxf-soap-server/src/test/java/org/apache/camel/quarkus/component/cxf/soap/server/it/Java2wsTest.java
new file mode 100644
index 0000000000..e2ff935ef5
--- /dev/null
+++ b/integration-test-groups/cxf-soap/cxf-soap-server/src/test/java/org/apache/camel/quarkus/component/cxf/soap/server/it/Java2wsTest.java
@@ -0,0 +1,126 @@
+/*
+ * 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 io.quarkiverse.cxf.it.server;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+@QuarkusTest
+public class Java2wsTest {
+
+    @Test
+    public void java2WsCodeFirstService()
+            throws IOException, ParserConfigurationException, SAXException, TransformerException {
+        String servedWsdl = RestAssured.given()
+                .get("/soapservice/codefirst?wsdl")
+                .then()
+                .statusCode(200)
+                .extract().body().asString();
+        servedWsdl = normalizeNsPrefixes(servedWsdl);
+        Path generatedPath = Paths.get("target/Java2wsTest/CodeFirstService-from-java2ws.wsdl");
+        try (InputStream in = Files.newInputStream(generatedPath)) {
+            final String java2WsGeneratedWsdl = new String(in.readAllBytes(), StandardCharsets.UTF_8);
+
+            /* We have to compare on DOM level so that different order of XML attributes, etc. does not make the test fail */
+            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+            dbf.setNamespaceAware(true);
+            dbf.setCoalescing(true);
+            dbf.setIgnoringElementContentWhitespace(true);
+            dbf.setIgnoringComments(true);
+            DocumentBuilder db = dbf.newDocumentBuilder();
+
+            final Document generatedDoc = parse(db, java2WsGeneratedWsdl);
+            final Document servedDoc = parse(db, servedWsdl);
+
+            boolean equal = generatedDoc.isEqualNode(servedDoc);
+            String mode = this.getClass().getSimpleName().endsWith("IT") ? "native" : "jvm";
+            Path servedPath = Paths.get("target/Java2wsTest/CodeFirstService-served-normalized-" + mode + ".wsdl")
+                    .toAbsolutePath();
+            Path generatedNormalizedPath = Paths.get("target/Java2wsTest/CodeFirstService-from-java2ws-normalized.wsdl")
+                    .toAbsolutePath();
+            save(servedDoc, servedPath);
+            save(generatedDoc, generatedNormalizedPath);
+            if (!equal) {
+                Assertions.fail(
+                        "The WSDL generated by java2ws and the WSDL served by the application are not equal XML documents. You may want to compare "
+                                + generatedNormalizedPath + " vs. " + servedPath);
+            }
+
+        }
+    }
+
+    protected String normalizeNsPrefixes(String servedWsdl) {
+        /*
+         * ns1 does not seem to be used anywhere in the WSDL document so it should be fine to remove it.
+         * At the same time it is the only difference against the document produced by java2ws which is also fine
+         */
+        return servedWsdl.replace("xmlns:ns1=\"http://schemas.xmlsoap.org/soap/http\"", "");
+    }
+
+    static void save(Document doc, Path path) throws TransformerException, IOException {
+        Files.createDirectories(path.getParent());
+        Transformer t = TransformerFactory.newDefaultInstance().newTransformer();
+        t.transform(new DOMSource(doc), new StreamResult(path.toFile()));
+    }
+
+    static Document parse(DocumentBuilder db, String wsdlDoc) throws SAXException, IOException {
+        Document doc = db.parse(new InputSource(new StringReader(wsdlDoc)));
+
+        /*
+         * There is some default :9090 location in the generated WSDL so we remove the whole address node from both
+         */
+        NodeList adrNodes = doc.getElementsByTagNameNS("http://schemas.xmlsoap.org/wsdl/soap/", "address");
+        List<Node> adrNodesList = new ArrayList<>();
+        for (int i = 0; i < adrNodes.getLength(); i++) {
+            adrNodesList.add(adrNodes.item(i));
+        }
+        for (Node node : adrNodesList) {
+            node.getParentNode().removeChild(node);
+        }
+        doc.normalizeDocument();
+        return doc;
+    }
+
+}