package org.jboss.test.gravia.repository; /* * #%L * Gravia :: Repository * %% * Copyright (C) 2012 - 2014 JBoss by Red Hat * %% * 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. * #L% */ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.InputStream; import java.io.PrintWriter; import java.net.URL; import java.util.Collection; import java.util.List; import org.jboss.gravia.Constants; import org.jboss.gravia.repository.DefaultRepositoryStorage; import org.jboss.gravia.repository.Repository; import org.jboss.gravia.repository.RepositoryReader; import org.jboss.gravia.repository.RepositoryStorage; import org.jboss.gravia.repository.spi.RepositoryContentHelper; import org.jboss.gravia.resource.Capability; import org.jboss.gravia.resource.ContentCapability; import org.jboss.gravia.resource.ContentNamespace; import org.jboss.gravia.resource.DefaultRequirementBuilder; import org.jboss.gravia.resource.IdentityNamespace; import org.jboss.gravia.resource.IdentityRequirementBuilder; import org.jboss.gravia.resource.ManifestBuilder; import org.jboss.gravia.resource.Requirement; import org.jboss.gravia.resource.Resource; import org.jboss.gravia.resource.ResourceContent; import org.jboss.gravia.runtime.spi.PropertiesProvider; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.Asset; import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; /** * Test the {@link DefaultRepositoryStorage} * * @author thomas.diesler@jboss.com * @since 16-Jan-2012 */ public class PersistentRepositoryStorageTestCase extends AbstractRepositoryTest { private File storageDir; private RepositoryStorage storage; private Repository repository; private PropertiesProvider propertyProvider; private File resAjar; private File resAtxt; @Before public void setUp() throws Exception { storageDir = new File("./target/repository/" + System.currentTimeMillis()).getCanonicalFile(); repository = Mockito.mock(Repository.class); Mockito.when(repository.getName()).thenReturn("MockedRepo"); propertyProvider = Mockito.mock(PropertiesProvider.class); Mockito.when(propertyProvider.getProperty(Constants.PROPERTY_REPOSITORY_STORAGE_DIR)).thenReturn(storageDir.getPath()); Mockito.when(propertyProvider.getProperty(Constants.PROPERTY_REPOSITORY_STORAGE_FILE, DefaultRepositoryStorage.REPOSITORY_XML_NAME)).thenReturn(DefaultRepositoryStorage.REPOSITORY_XML_NAME); storage = new DefaultRepositoryStorage(propertyProvider, repository); // Write the bundle to the location referenced by repository-testA.xml resAjar = new File("./target/resA.jar"); getResourceA().as(ZipExporter.class).exportTo(resAjar, true); // Write some text to the location referenced by repository-testB.xml resAtxt = new File("./target/resA.txt"); PrintWriter bw = new PrintWriter(new FileWriter(resAtxt)); bw.print("some text"); bw.close(); } @After public void tearDown() { deleteRecursive(storageDir); resAjar.delete(); resAtxt.delete(); } @Test public void testAddResourceFromXML() throws Exception { RepositoryReader reader = getRepositoryReader("xml/repository-testA.xml"); Resource resource = storage.addResource(reader.nextResource()); verifyResource(resource); verifyProviders(storage); } @Test public void testAddResourceWithMultipleContent() throws Exception { // Add a resource from XML RepositoryReader reader = getRepositoryReader("xml/repository-testB.xml"); storage.addResource(reader.nextResource()); Requirement req = new DefaultRequirementBuilder(IdentityNamespace.IDENTITY_NAMESPACE, "resA").getRequirement(); Collection<Capability> providers = storage.findProviders(req); Assert.assertNotNull(providers); Assert.assertEquals(1, providers.size()); Capability cap = providers.iterator().next(); Assert.assertEquals("resA", cap.getAttribute(IdentityNamespace.IDENTITY_NAMESPACE)); Resource resource = cap.getResource(); verifyDefaultContent(resource); InputStream input = resource.adapt(ResourceContent.class).getContent(); String digest = RepositoryContentHelper.getDigest(input); Assert.assertNotNull("RepositoryContent not null", input); input.close(); List<Capability> ccaps = resource.getCapabilities(ContentNamespace.CONTENT_NAMESPACE); Assert.assertEquals(2, ccaps.size()); ContentCapability ccap = ccaps.get(0).adapt(ContentCapability.class); Assert.assertEquals(digest, ccap.getDigest()); Assert.assertEquals("application/java-archive", ccap.getMimeType()); Assert.assertTrue(0 < ccap.getSize()); File contentFile = new File(ccap.getContentURL().getPath()).getCanonicalFile(); Assert.assertTrue("File exists: " + contentFile, contentFile.exists()); Assert.assertTrue("Path starts with: " + storageDir.getPath(), contentFile.getPath().startsWith(storageDir.getPath())); ccap = ccaps.get(1).adapt(ContentCapability.class); Assert.assertFalse(digest.equals(ccap.getDigest())); Assert.assertEquals("text/plain", ccap.getMimeType()); Assert.assertEquals(new Long("some text".length()), ccap.getSize()); contentFile = new File(ccap.getContentURL().getPath()).getCanonicalFile(); Assert.assertTrue("File exists: " + contentFile, contentFile.exists()); Assert.assertTrue("Path starts with: " + storageDir.getPath(), contentFile.getPath().startsWith(storageDir.getPath())); BufferedReader br = new BufferedReader(new FileReader(contentFile)); Assert.assertEquals("some text", br.readLine()); br.close(); } @Test public void testFileStorageRestart() throws Exception { RepositoryReader reader = getRepositoryReader("xml/repository-testA.xml"); Resource resource = storage.addResource(reader.nextResource()); verifyResource(resource); verifyProviders(storage); RepositoryStorage other = new DefaultRepositoryStorage(propertyProvider, repository); verifyProviders(other); } @Test public void testCustomNamespace() throws Exception { // Add a resource from XML RepositoryReader reader = getRepositoryReader("xml/repository-testA.xml"); Resource resource = storage.addResource(reader.nextResource()); verifyResource(resource); verifyProviders(storage); List<Capability> allcaps = resource.getCapabilities(null); Assert.assertEquals(3, allcaps.size()); Requirement req = new DefaultRequirementBuilder("custom.namespace", "custom.value").getRequirement(); Collection<Capability> providers = storage.findProviders(req); Assert.assertEquals("One provider", 1, providers.size()); req = new DefaultRequirementBuilder("custom.namespace", "bogus").getRequirement(); providers = storage.findProviders(req); Assert.assertEquals("No provider", 0, providers.size()); } private void verifyResource(Resource resource) throws Exception { verifyDefaultContent(resource); Assert.assertEquals(3, resource.getCapabilities(null).size()); } private void verifyDefaultContent(Resource resource) throws Exception { InputStream input = resource.adapt(ResourceContent.class).getContent(); String digest = RepositoryContentHelper.getDigest(input); Assert.assertNotNull("RepositoryContent not null", input); input.close(); Capability cap = resource.getCapabilities(ContentNamespace.CONTENT_NAMESPACE).get(0); ContentCapability ccap = cap.adapt(ContentCapability.class); Assert.assertEquals(digest, ccap.getDigest()); Assert.assertEquals(digest, cap.getAttribute(ContentNamespace.CONTENT_NAMESPACE)); Assert.assertEquals("application/java-archive", ccap.getMimeType()); Assert.assertEquals("application/java-archive", cap.getAttribute(ContentNamespace.CAPABILITY_MIME_ATTRIBUTE)); Assert.assertTrue(0 < ccap.getSize()); Assert.assertTrue(0 < (Long) cap.getAttribute(ContentNamespace.CAPABILITY_SIZE_ATTRIBUTE)); URL contentURL = (URL) ccap.getAttribute(ContentNamespace.CAPABILITY_URL_ATTRIBUTE); File contentFile = new File(contentURL.getPath()).getCanonicalFile(); Assert.assertTrue("File exists: " + contentFile, contentFile.exists()); Assert.assertTrue("Path starts with: " + storageDir.getPath(), contentFile.getPath().startsWith(storageDir.getPath())); } private void verifyProviders(RepositoryStorage storage) throws Exception { Requirement req = new IdentityRequirementBuilder("resA", "[1.0,2.0)").getRequirement(); Collection<Capability> providers = storage.findProviders(req); Assert.assertNotNull(providers); Assert.assertEquals(1, providers.size()); Capability cap = providers.iterator().next(); Assert.assertEquals("resA", cap.getAttribute(IdentityNamespace.IDENTITY_NAMESPACE)); verifyResource(cap.getResource()); } private JavaArchive getResourceA() { final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "resA"); archive.setManifest(new Asset() { @Override public InputStream openStream() { ManifestBuilder builder = new ManifestBuilder(); builder.addIdentityCapability("resA", "1.0.0"); builder.addIdentityRequirement("resB", "[1.0,2.0)"); builder.addGenericCapabilities("custom.namespace;custom.namespace=custom.value"); return builder.openStream(); } }); return archive; } }