/* * Copyright 2012 JBoss Inc * * Licensed 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 org.artificer.test.server.atom.services; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.jboss.resteasy.client.ClientResponse; import org.jboss.resteasy.plugins.providers.atom.Entry; import org.jboss.resteasy.plugins.providers.atom.Feed; import org.jboss.resteasy.plugins.providers.multipart.InputPart; import org.jboss.resteasy.plugins.providers.multipart.MultipartInput; import org.junit.Assert; import org.junit.Test; import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactEnum; import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactType; import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.WsdlDocument; import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XmlDocument; import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.XsdDocument; import org.artificer.common.MediaType; import org.artificer.atom.ArtificerAtomUtils; import org.artificer.atom.archive.ArtificerArchive; import org.artificer.atom.beans.HttpResponseBean; import org.artificer.client.ClientRequest; import org.artificer.common.ArtificerModelUtils; import java.io.File; import java.io.InputStream; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; /** * Unit test for the {@link org.artificer.server.atom.services.BatchResource} class. * * TODO add a test for 409 Conflict (e.g. update an artifact that doesn't exist) * * @author eric.wittmann@redhat.com */ public class BatchResourceTest extends AbstractResourceTest { @Test public void testZipPackage() throws Exception { ArtificerArchive archive = null; InputStream xsd1ContentStream = null; InputStream xsd2ContentStream = null; File zipFile = null; InputStream zipStream = null; ClientRequest request = null; try { // Create a test s-ramp archive archive = new ArtificerArchive(); xsd1ContentStream = this.getClass().getResourceAsStream("/sample-files/xsd/PO.xsd"); BaseArtifactType metaData = new XsdDocument(); metaData.setArtifactType(BaseArtifactEnum.XSD_DOCUMENT); metaData.setName("PO.xsd"); archive.addEntry("schemas/PO.xsd", metaData, xsd1ContentStream); xsd2ContentStream = this.getClass().getResourceAsStream("/sample-files/xsd/XMLSchema.xsd"); metaData = new XsdDocument(); metaData.setArtifactType(BaseArtifactEnum.XSD_DOCUMENT); metaData.setName("XMLSchema.xsd"); metaData.setVersion("1.0"); archive.addEntry("schemas/XMLSchema.xsd", metaData, xsd2ContentStream); zipFile = archive.pack(); zipStream = FileUtils.openInputStream(zipFile); // Now POST the archive to the s-ramp repository (POST to /s-ramp as application/zip) request = clientRequest("/s-ramp"); request.body(MediaType.APPLICATION_ZIP, zipStream); ClientResponse<MultipartInput> clientResponse = request.post(MultipartInput.class); // Process the response - it should be multipart/mixed with each part being // itself an http response with a code, content-id, and an s-ramp atom entry // body MultipartInput response = clientResponse.getEntity(); List<InputPart> parts = response.getParts(); Map<String, BaseArtifactType> artyMap = new HashMap<String, BaseArtifactType>(); for (InputPart part : parts) { String id = part.getHeaders().getFirst("Content-ID"); HttpResponseBean rbean = part.getBody(HttpResponseBean.class, null); Assert.assertEquals(201, rbean.getCode()); Entry entry = (Entry) rbean.getBody(); BaseArtifactType artifact = ArtificerAtomUtils.unwrapSrampArtifact(entry); artyMap.put(id, artifact); } Assert.assertTrue(artyMap.keySet().contains("<schemas/PO.xsd@package>")); Assert.assertTrue(artyMap.keySet().contains("<schemas/XMLSchema.xsd@package>")); // Assertions for artifact 1 BaseArtifactType arty = artyMap.get("<schemas/PO.xsd@package>"); Assert.assertNotNull(arty); Assert.assertEquals("PO.xsd", arty.getName()); Assert.assertNull(arty.getVersion()); arty = artyMap.get("<schemas/XMLSchema.xsd@package>"); Assert.assertNotNull(arty); Assert.assertEquals("XMLSchema.xsd", arty.getName()); Assert.assertEquals("1.0", arty.getVersion()); } finally { IOUtils.closeQuietly(xsd1ContentStream); IOUtils.closeQuietly(xsd2ContentStream); ArtificerArchive.closeQuietly(archive); IOUtils.closeQuietly(zipStream); FileUtils.deleteQuietly(zipFile); } // Verify by querying // Do a query using GET with query params request = clientRequest("/s-ramp/xsd/XsdDocument"); ClientResponse<Feed> response = request.get(Feed.class); Feed feed = response.getEntity(); Assert.assertEquals(2, feed.getEntries().size()); Set<String> artyNames = new HashSet<String>(); for (Entry entry : feed.getEntries()) { artyNames.add(entry.getTitle()); } Assert.assertTrue(artyNames.contains("PO.xsd")); Assert.assertTrue(artyNames.contains("XMLSchema.xsd")); } /** * This also tests the zipPackage method of the {@link org.artificer.server.atom.services.BatchResource} class, but it is * more thorough. It tests adding new content, updating existing content, etc. */ @Test public void testZipPackage_Multi() throws Exception { ArtificerArchive archive = null; InputStream xsd1ContentStream = null; InputStream wsdlContentStream = null; File zipFile = null; InputStream zipStream = null; ClientRequest request = null; WsdlDocument wsdlDoc = createWsdlArtifact(); XmlDocument xmlDoc = createXmlArtifact(); String xsdUuid = null; String wsdlUuid = null; String xmlUuid = null; try { // Create a test s-ramp archive archive = new ArtificerArchive(); // A new XSD document xsd1ContentStream = this.getClass().getResourceAsStream("/sample-files/xsd/PO.xsd"); BaseArtifactType metaData = new XsdDocument(); metaData.setArtifactType(BaseArtifactEnum.XSD_DOCUMENT); metaData.setUuid(UUID.randomUUID().toString()); // will be ignored metaData.setName("PO.xsd"); archive.addEntry("schemas/PO.xsd", metaData, xsd1ContentStream); // Update an existing WSDL document (content and meta-data) wsdlContentStream = this.getClass().getResourceAsStream("/sample-files/wsdl/sample-updated.wsdl"); metaData = wsdlDoc; metaData.setVersion("2.0"); ArtificerModelUtils.setCustomProperty(metaData, "foo", "bar"); archive.addEntry("wsdl/sample.wsdl", metaData, wsdlContentStream); // Update an existing XML document (meta-data only) metaData = xmlDoc; metaData.setVersion("3.0"); ArtificerModelUtils.setCustomProperty(metaData, "far", "baz"); archive.addEntry("core/PO.xml", metaData, null); zipFile = archive.pack(); zipStream = FileUtils.openInputStream(zipFile); // Now POST the archive to the s-ramp repository (POST to /s-ramp as application/zip) request = clientRequest("/s-ramp"); request.body(MediaType.APPLICATION_ZIP, zipStream); ClientResponse<MultipartInput> clientResponse = request.post(MultipartInput.class); // Process the response - it should be multipart/mixed with each part being // itself an http response with a code, content-id, and an s-ramp atom entry // body MultipartInput response = clientResponse.getEntity(); List<InputPart> parts = response.getParts(); Map<String, HttpResponseBean> respMap = new HashMap<String, HttpResponseBean>(); for (InputPart part : parts) { String id = part.getHeaders().getFirst("Content-ID"); HttpResponseBean rbean = part.getBody(HttpResponseBean.class, null); respMap.put(id, rbean); } // Should be three responses. Assert.assertEquals(3, respMap.size()); Assert.assertTrue(respMap.keySet().contains("<schemas/PO.xsd@package>")); Assert.assertTrue(respMap.keySet().contains("<wsdl/sample.wsdl@package>")); Assert.assertTrue(respMap.keySet().contains("<core/PO.xml@package>")); // Assertions for artifact 1 (PO.xsd) HttpResponseBean httpResp = respMap.get("<schemas/PO.xsd@package>"); Assert.assertEquals(201, httpResp.getCode()); Assert.assertEquals("Created", httpResp.getStatus()); Entry entry = (Entry) httpResp.getBody(); BaseArtifactType artifact = ArtificerAtomUtils.unwrapSrampArtifact(entry); Assert.assertEquals("PO.xsd", artifact.getName()); Assert.assertNull(artifact.getVersion()); Long size = ((XsdDocument) artifact).getContentSize(); Assert.assertTrue(size >= 2376L); xsdUuid = artifact.getUuid(); // Assertions for artifact 2 (sample.wsdl) httpResp = respMap.get("<wsdl/sample.wsdl@package>"); Assert.assertEquals(200, httpResp.getCode()); Assert.assertEquals("OK", httpResp.getStatus()); entry = (Entry) httpResp.getBody(); artifact = ArtificerAtomUtils.unwrapSrampArtifact(entry); Assert.assertEquals("sample.wsdl", artifact.getName()); Assert.assertEquals("2.0", artifact.getVersion()); wsdlUuid = artifact.getUuid(); // Assertions for artifact 3 (PO.xml) httpResp = respMap.get("<core/PO.xml@package>"); Assert.assertEquals(200, httpResp.getCode()); Assert.assertEquals("OK", httpResp.getStatus()); entry = (Entry) httpResp.getBody(); artifact = ArtificerAtomUtils.unwrapSrampArtifact(entry); Assert.assertEquals("PO.xml", artifact.getName()); Assert.assertEquals("3.0", artifact.getVersion()); xmlUuid = artifact.getUuid(); } finally { IOUtils.closeQuietly(xsd1ContentStream); IOUtils.closeQuietly(wsdlContentStream); ArtificerArchive.closeQuietly(archive); IOUtils.closeQuietly(zipStream); FileUtils.deleteQuietly(zipFile); } // Verify by querying // Do a query using GET with query params Map<String, BaseArtifactType> artyMap = new HashMap<String, BaseArtifactType>(); request = clientRequest("/s-ramp/xsd/XsdDocument"); ClientResponse<Feed> response = request.get(Feed.class); Feed feed = response.getEntity(); Assert.assertEquals(1, feed.getEntries().size()); for (Entry entry : feed.getEntries()) { String uuid = entry.getId().toString().replace("urn:uuid:", ""); request = clientRequest("/s-ramp/xsd/XsdDocument/" + uuid); BaseArtifactType artifact = ArtificerAtomUtils.unwrapSrampArtifact(request.get(Entry.class).getEntity()); artyMap.put(artifact.getUuid(), artifact); } request = clientRequest("/s-ramp/wsdl/WsdlDocument"); response = request.get(Feed.class); feed = response.getEntity(); Assert.assertEquals(1, feed.getEntries().size()); for (Entry entry : feed.getEntries()) { String uuid = entry.getId().toString().replace("urn:uuid:", ""); request = clientRequest("/s-ramp/wsdl/WsdlDocument/" + uuid); BaseArtifactType artifact = ArtificerAtomUtils.unwrapSrampArtifact(request.get(Entry.class).getEntity()); artyMap.put(artifact.getUuid(), artifact); } request = clientRequest("/s-ramp/core/XmlDocument"); response = request.get(Feed.class); feed = response.getEntity(); Assert.assertEquals(1, feed.getEntries().size()); for (Entry entry : feed.getEntries()) { String uuid = entry.getId().toString().replace("urn:uuid:", ""); request = clientRequest("/s-ramp/core/XmlDocument/" + uuid); BaseArtifactType artifact = ArtificerAtomUtils.unwrapSrampArtifact(request.get(Entry.class).getEntity()); artyMap.put(artifact.getUuid(), artifact); } Assert.assertEquals(3, artyMap.size()); // Assertions for artifact 1 (PO.xsd) BaseArtifactType artifact = artyMap.get(xsdUuid); Assert.assertEquals("PO.xsd", artifact.getName()); Assert.assertNull(artifact.getVersion()); // Assertions for artifact 2 (sample.wsdl) artifact = artyMap.get(wsdlUuid); Assert.assertEquals("sample.wsdl", artifact.getName()); Assert.assertEquals("2.0", artifact.getVersion()); // Assertions for artifact 3 (PO.xml) artifact = artyMap.get(xmlUuid); Assert.assertEquals("PO.xml", artifact.getName()); Assert.assertEquals("3.0", artifact.getVersion()); } /** * Creates a WSDL artifact in the s-ramp repository. * @return the new artifact * @throws Exception */ private XmlDocument createXmlArtifact() throws Exception { String artifactFileName = "PO.xml"; InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/core/" + artifactFileName); try { ClientRequest request = clientRequest("/s-ramp/core/XmlDocument"); request.header("Slug", artifactFileName); request.body("application/xml", contentStream); ClientResponse<Entry> response = request.post(Entry.class); Entry entry = response.getEntity(); Assert.assertEquals(artifactFileName, entry.getTitle()); BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry); Assert.assertTrue(arty instanceof XmlDocument); XmlDocument doc = (XmlDocument) arty; Assert.assertEquals(artifactFileName, doc.getName()); Long size = doc.getContentSize(); Assert.assertTrue(size >= 825L); Assert.assertEquals("application/xml", doc.getContentType()); return doc; } finally { IOUtils.closeQuietly(contentStream); } } /** * Creates a WSDL artifact in the s-ramp repository. * @return the new artifact * @throws Exception */ private WsdlDocument createWsdlArtifact() throws Exception { String artifactFileName = "sample.wsdl"; InputStream contentStream = this.getClass().getResourceAsStream("/sample-files/wsdl/" + artifactFileName); try { ClientRequest request = clientRequest("/s-ramp/wsdl/WsdlDocument"); request.header("Slug", artifactFileName); request.body("application/xml", contentStream); ClientResponse<Entry> response = request.post(Entry.class); Entry entry = response.getEntity(); Assert.assertEquals(artifactFileName, entry.getTitle()); BaseArtifactType arty = ArtificerAtomUtils.unwrapSrampArtifact(entry); Assert.assertTrue(arty instanceof WsdlDocument); WsdlDocument doc = (WsdlDocument) arty; Assert.assertEquals(artifactFileName, doc.getName()); Assert.assertEquals("application/xml", doc.getContentType()); return doc; } finally { IOUtils.closeQuietly(contentStream); } } }