package org.easysoa.registry;
import java.io.File;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.easysoa.registry.test.AbstractRegistryTest;
import org.easysoa.registry.types.InformationService;
import org.easysoa.registry.types.ids.SoaNodeId;
import org.junit.Assert;
import org.junit.Test;
import org.nuxeo.ecm.core.api.Blob;
import org.nuxeo.ecm.core.api.ClientException;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.DocumentRef;
import org.nuxeo.ecm.core.api.impl.blob.StreamingBlob;
import org.nuxeo.ecm.core.test.annotations.Granularity;
import org.nuxeo.ecm.core.test.annotations.RepositoryConfig;
import org.nuxeo.runtime.services.streaming.FileSource;
import org.nuxeo.runtime.services.streaming.StringSource;
import org.ow2.easywsdl.wsdl.WSDLFactory;
import org.ow2.easywsdl.wsdl.api.Description;
import org.ow2.easywsdl.wsdl.api.WSDLReader;
import com.google.inject.Inject;
/**
* Tests WSDL local download, parsing and metadata extraction.
*
* These are consecutive steps of a workflow so test methods must be run
* in their order of definition and Nuxeo repository state must be kept in between.
*
* @author mkalam-alami, mdutoo
*
*/
@RepositoryConfig(cleanup = Granularity.CLASS) // to keep repository state between test methods
public class WSDLParsingTest extends AbstractRegistryTest {
@SuppressWarnings("unused")
private static Logger logger = Logger.getLogger(WSDLParsingTest.class);
@Inject
DocumentService documentService;
private static DocumentRef serviceRef;
private static SoaNodeId serviceSoaId;
private static String digest;
@Test
public void parseWSDL() {
try {
// Parse WSDL
WSDLReader wsdlReader = WSDLFactory.newInstance().newWSDLReader();
File wsdlFile = new File("src/test/resources/PureAirFlowers.wsdl");
Assert.assertTrue("WSDL not found", wsdlFile.exists());
Description wsdl = wsdlReader.read(wsdlFile.toURI().toURL());
// Read some data
Assert.assertEquals("Unexpected binding name",
"PureAirFlowersServiceITFNAME",
wsdl.getInterfaces().get(0).getQName().getLocalPart());
Assert.assertEquals("Unexpected WSDL version",
"WSDL11",
wsdl.getVersion().name());
} catch (Exception e) {
Assert.fail("Failed to parse WSDL");
}
}
/**
* Reorders tests, so they can run on jdk7 (workaround for #134)
*
* This is a workaround required because Class.getDeclaredMethods() returns random ordered
* results since jdk7 : http://sourceforge.net/p/jumble/bugs/10/
* Long term fix is to upgrade to junit 4.11 (to be done by Nuxeo first) and use @FixMethodOrder :
* http://stackoverflow.com/questions/3693626/how-to-run-test-methods-in-spec-order-in-junit4
* @throws ClientException
* @throws IOException
*/
@Test
public void testAllReordered() throws ClientException, IOException {
testListenerCreate();
testListenerUploadFirstWsdl();
testListenerUploadSecondIdenticalWsdl();
testListenerUploadSecondIdenticalButDifferentNameWsdl();
testListenerUploadThirdDifferentWsdl();
testListenerUploadFourthDifferentWsdl();
testListenerUploadBadWsdl();
testListenerRemoveWsdl();
}
/**
* Actually testing the parsing listener, goes on in following tests
* @throws ClientException
* @throws IOException
*/
//@Test
public void testListenerCreate() throws ClientException, IOException {
serviceSoaId = new SoaNodeId(defaultSubprojectId, InformationService.DOCTYPE, "MyService");
DocumentModel serviceModel = documentService.newSoaNodeDocument(documentManager, serviceSoaId);
documentManager.createDocument(serviceModel);
documentManager.save();
serviceRef = serviceModel.getRef(); // storing ref to re-get clean (no contextData) document after
}
//@Test
public void testListenerUploadFirstWsdl() throws ClientException, IOException {
// getting clean document (with extracted metadata and no contextData guards) :
// NB. reusing previous serviceModel = documentManager.saveDocument() is not enough because it
// would have extracted metadata, but also contextData guards explicitly recopied
DocumentModel serviceModel = documentManager.getDocument(serviceRef);
// uploading first wsdl
StreamingBlob blob = new StreamingBlob(new FileSource(new File("src/test/resources/PrecomptePartenaireService.wsdl")));
blob.setMimeType("text/xml");
blob.setEncoding("UTF-8");
blob.setFilename("PrecomptePartenaireService.wsdl");
serviceModel.setPropertyValue("file:content", blob);
serviceModel = documentManager.saveDocument(serviceModel); // else if not re-assigned, no extracted metadatas for asserts below
documentManager.save();
// getting computed digest from SQLBlob
Blob existingBlob = (Blob) documentManager.getDocument(serviceModel.getRef()).getPropertyValue("file:content");
Assert.assertTrue("Content should contain " + "Precompte", existingBlob.getString().contains("Precompte"));
digest = existingBlob.getDigest();
Assert.assertEquals("Unexpected port type", "{http://www.axxx.com/dps/apv}PrecomptePartenaireService", serviceModel.getPropertyValue(InformationService.XPATH_WSDL_PORTTYPE_NAME));
Assert.assertTrue("Unexpected empty digest", digest != null && digest.length() != 0);
Assert.assertEquals("Unexpected filename", "PrecomptePartenaireService.wsdl", serviceModel.getPropertyValue(InformationService.XPATH_WSDL_FILE_NAME));
}
//@Test
public void testListenerUploadSecondIdenticalWsdl() throws ClientException, IOException {
// getting clean document (with extracted metadata and no contextData guards) :
// NB. reusing previous serviceModel = documentManager.saveDocument() is not enough because it
// would have extracted metadata, but also contextData guards explicitly recopied
DocumentModel serviceModel = documentManager.getDocument(serviceRef);
// uploading second, identical wsdl
StreamingBlob blob = new StreamingBlob(new FileSource(new File("src/test/resources/PrecomptePartenaireService.wsdl")));
blob.setMimeType("text/xml");
blob.setEncoding("UTF-8");
blob.setFilename("PrecomptePartenaireService.wsdl");// TODO or auto ?
serviceModel.setPropertyValue("file:content", blob);
serviceModel = documentManager.saveDocument(serviceModel); // else if not re-assigned, no extracted metadatas for asserts below
documentManager.save();
// getting computed digest from SQLBlob
Blob existingBlob = (Blob) documentManager.getDocument(serviceModel.getRef()).getPropertyValue("file:content");
Assert.assertTrue("Content should contain " + "Precompte", existingBlob.getString().contains("Precompte"));
Assert.assertEquals("Unexpected port type", "{http://www.axxx.com/dps/apv}PrecomptePartenaireService", serviceModel.getPropertyValue(InformationService.XPATH_WSDL_PORTTYPE_NAME));
Assert.assertEquals("Unexpected changed digest", digest, existingBlob.getDigest());
Assert.assertEquals("Unexpected filename", "PrecomptePartenaireService.wsdl", serviceModel.getPropertyValue(InformationService.XPATH_WSDL_FILE_NAME));
}
//@Test
public void testListenerUploadSecondIdenticalButDifferentNameWsdl() throws ClientException, IOException {
// getting clean document (with extracted metadata and no contextData guards) :
// NB. reusing previous serviceModel = documentManager.saveDocument() is not enough because it
// would have extracted metadata, but also contextData guards explicitly recopied
DocumentModel serviceModel = documentManager.getDocument(serviceRef);
// uploading second, identical wsdl but with different name
StreamingBlob blob = new StreamingBlob(new FileSource(new File("src/test/resources/PrecomptePartenaireService.wsdl")));
blob.setMimeType("text/xml");
blob.setEncoding("UTF-8");
blob.setFilename("PrecomptePartenaireService1.wsdl");// TODO or auto ?
serviceModel.setPropertyValue("file:content", blob);
serviceModel = documentManager.saveDocument(serviceModel); // else if not re-assigned, no extracted metadatas for asserts below
documentManager.save();
// getting computed digest from SQLBlob
Blob existingBlob = (Blob) documentManager.getDocument(serviceModel.getRef()).getPropertyValue("file:content");
Assert.assertTrue("Content should contain " + "Precompte", existingBlob.getString().contains("Precompte"));
Assert.assertEquals("Unexpected port type", "{http://www.axxx.com/dps/apv}PrecomptePartenaireService", serviceModel.getPropertyValue(InformationService.XPATH_WSDL_PORTTYPE_NAME));
Assert.assertEquals("Unexpected changed digest", digest, existingBlob.getDigest());
Assert.assertEquals("Unexpected filename", "PrecomptePartenaireService1.wsdl", serviceModel.getPropertyValue(InformationService.XPATH_WSDL_FILE_NAME));
}
//@Test
public void testListenerUploadThirdDifferentWsdl() throws ClientException, IOException {
// getting clean document (with extracted metadata and no contextData guards) :
// NB. reusing previous serviceModel = documentManager.saveDocument() is not enough because it
// would have extracted metadata, but also contextData guards explicitly recopied
DocumentModel serviceModel = documentManager.getDocument(serviceRef);
// uploading third, different wsdl
StreamingBlob blob = new StreamingBlob(new FileSource(new File("src/test/resources/PureAirFlowers.wsdl")));
blob.setMimeType("text/xml");
blob.setEncoding("UTF-8");
blob.setFilename("PureAirFlowers.wsdl");// TODO or auto ?
serviceModel.setPropertyValue("file:content", blob);
serviceModel = documentManager.saveDocument(serviceModel); // else if not re-assigned, no extracted metadatas for asserts below
documentManager.save();
// getting computed digest from SQLBlob
Blob existingBlob = (Blob) documentManager.getDocument(serviceModel.getRef()).getPropertyValue("file:content");
Assert.assertTrue("Content should contain " + "Flowers", existingBlob.getString().contains("Flowers"));
Assert.assertEquals("Unexpected port type", "{http://www.pureairflowers.com/servicesTGNS/}PureAirFlowersServiceITFNAME", serviceModel.getPropertyValue(InformationService.XPATH_WSDL_PORTTYPE_NAME));
Assert.assertNotSame("Unexpected identical digest", digest, existingBlob.getDigest());
Assert.assertEquals("Unexpected filename", "PureAirFlowers.wsdl", serviceModel.getPropertyValue(InformationService.XPATH_WSDL_FILE_NAME));
digest = existingBlob.getDigest();
}
//@Test
public void testListenerUploadFourthDifferentWsdl() throws ClientException, IOException {
// getting clean document (with extracted metadata and no contextData guards) :
// NB. reusing previous serviceModel = documentManager.saveDocument() is not enough because it
// would have extracted metadata, but also contextData guards explicitly recopied
DocumentModel serviceModel = documentManager.getDocument(serviceRef);
// uploading fourth, different wsdl
StreamingBlob blob = new StreamingBlob(new FileSource(new File("src/test/resources/PrecomptePartenaireService.wsdl")));
blob.setMimeType("text/xml");
blob.setEncoding("UTF-8");
blob.setFilename("PrecomptePartenaireService.wsdl");// TODO or auto ?
serviceModel.setPropertyValue("file:content", blob);
serviceModel = documentManager.saveDocument(serviceModel); // else if not re-assigned, no extracted metadatas for asserts below
documentManager.save();
// getting computed digest from SQLBlob
Blob existingBlob = (Blob) documentManager.getDocument(serviceModel.getRef()).getPropertyValue("file:content");
Assert.assertTrue("Content should contain " + "Precompte", existingBlob.getString().contains("Precompte"));
Assert.assertEquals("Unexpected port type", "{http://www.axxx.com/dps/apv}PrecomptePartenaireService", serviceModel.getPropertyValue(InformationService.XPATH_WSDL_PORTTYPE_NAME));
Assert.assertNotSame("Unexpected identical digest", digest, existingBlob.getDigest());
Assert.assertEquals("Unexpected filename", "PrecomptePartenaireService.wsdl", serviceModel.getPropertyValue(InformationService.XPATH_WSDL_FILE_NAME));
digest = existingBlob.getDigest();
}
//@Test
public void testListenerUploadBadWsdl() throws ClientException, IOException {
// getting clean document (with extracted metadata and no contextData guards) :
// NB. reusing previous serviceModel = documentManager.saveDocument() is not enough because it
// would have extracted metadata, but also contextData guards explicitly recopied
DocumentModel serviceModel = documentManager.getDocument(serviceRef);
// putting bad wsdl
String badContent = "not a wsdl";
/*File badWsdlFile = File.createTempFile("WSDLParsingTest", ".wsdl");
badWsdlFile.deleteOnExit();
FileWriter badWsdlWriter = new FileWriter(badWsdlFile);
badWsdlWriter.write(badContent);
badWsdlWriter.close();
blob = new StreamingBlob(new FileSource(badWsdlFile));*/
StreamingBlob blob = new StreamingBlob(new StringSource(badContent));
//blob = new StreamingBlob(new FileSource(new File("src/test/resources/PrecomptePartenaireService1.wsdl")));
blob.setMimeType("text/xml");
blob.setEncoding("UTF-8");
blob.setFilename("PrecomptePartenaireServiceBad.wsdl");// TODO or auto ?
serviceModel.setPropertyValue("file:content", blob);
serviceModel = documentManager.saveDocument(serviceModel); // else if not re-assigned, no extracted metadatas for asserts below
documentManager.save();
// getting computed digest from SQLBlob
Blob existingBlob = (Blob) documentManager.getDocument(serviceModel.getRef()).getPropertyValue("file:content");
Assert.assertTrue("Content should be " + badContent, existingBlob.getString().equals(badContent));
Assert.assertEquals("Unexpected not empty port type", null, serviceModel.getPropertyValue(InformationService.XPATH_WSDL_PORTTYPE_NAME));
Assert.assertNotSame("Unexpected identical digest", digest, existingBlob.getDigest());
Assert.assertEquals("Unexpected not empty filename", null, serviceModel.getPropertyValue(InformationService.XPATH_WSDL_FILE_NAME));
digest = existingBlob.getDigest();
}
//@Test
public void testListenerRemoveWsdl() throws ClientException, IOException {
// getting clean document (with extracted metadata and no contextData guards) :
// NB. reusing previous serviceModel = documentManager.saveDocument() is not enough because it
// would have extracted metadata, but also contextData guards explicitly recopied
DocumentModel serviceModel = documentManager.getDocument(serviceRef);
// removing wsdl
serviceModel.setPropertyValue("file:content", null);
serviceModel = documentManager.saveDocument(serviceModel); // else if not re-assigned, no extracted metadatas for asserts below
documentManager.save();
// getting computed digest from SQLBlob
Assert.assertNull("Unexpected not null content", documentManager.getDocument(serviceModel.getRef()).getPropertyValue("file:content"));
Assert.assertEquals("Unexpected not empty port type", null, serviceModel.getPropertyValue(InformationService.XPATH_WSDL_PORTTYPE_NAME));
Assert.assertEquals("Unexpected not empty filename", null, serviceModel.getPropertyValue(InformationService.XPATH_WSDL_FILE_NAME));
}
}