/*
* JBoss, Home of Professional Open Source.
* Copyright 2014 Red Hat, Inc., and individual contributors
* as indicated by the @author tags.
*
* 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.jboss.modules;
import static org.jboss.modules.util.Util.readBytes;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.net.URL;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.jboss.modules.filter.PathFilter;
import org.jboss.modules.filter.PathFilters;
import org.junit.Before;
import org.junit.Test;
/**
* Abstract Test Case used as the base for all resource loader tests.
*
* @author John Bailey
*/
public abstract class AbstractResourceLoaderTestCase extends AbstractModuleTestCase {
protected ResourceLoader loader;
@Before
public void setupLoader() throws Exception {
loader = createLoader(PathFilters.acceptAll());
}
protected abstract ResourceLoader createLoader(final PathFilter exportFilter) throws Exception;
protected abstract void assertResource(final Resource resource, final String fileName) throws Exception;
@Test
public void testBasicResource() throws Exception {
Resource resource = loader.getResource("/test.txt");
assertNotNull(resource);
assertResource(resource, "test.txt");
resource = loader.getResource("/nested/nested.txt");
assertNotNull(resource);
assertResource(resource, "nested/nested.txt");
}
@Test
public void testMissingResource() throws Exception {
Resource resource = loader.getResource("/test-bogus.txt");
assertNull(resource);
}
@Test
public void testIndexPaths() throws Exception {
final Collection<String> paths = loader.getPaths();
assertFalse(paths.isEmpty());
assertTrue(paths.contains(""));
assertTrue(paths.contains("META-INF"));
assertTrue(paths.contains("nested"));
assertTrue(paths.contains("org"));
assertTrue(paths.contains("org/jboss"));
assertTrue(paths.contains("org/jboss/modules"));
assertTrue(paths.contains("org/jboss/modules/test"));
}
@Test
public void testGetClassSpec() throws Exception {
ClassSpec spec = loader.getClassSpec(Module.fileNameOfClass("org.jboss.modules.test.TestClass"));
assertNotNull(spec);
byte[] bytes = spec.getBytes();
final URL classResource = getClass().getClassLoader().getResource("org/jboss/modules/test/TestClass.class");
final byte[] expectedBytes = readBytes(classResource.openStream());
assertArrayEquals(expectedBytes, bytes);
}
@Test
public void testMissingClassSpec() throws Exception {
ClassSpec spec = loader.getClassSpec(Module.fileNameOfClass("org.jboss.modules.test.BogusClass"));
assertNull(spec);
}
@Test
public void testGetPackageSpec() throws Exception {
PackageSpec spec = loader.getPackageSpec("org.jboss.modules.test");
assertNotNull(spec);
assertEquals("JBoss Modules Test Classes", spec.getSpecTitle());
assertEquals("0.1", spec.getSpecVersion());
assertEquals("JBoss", spec.getSpecVendor());
assertEquals("org.jboss.modules.test", spec.getImplTitle());
assertEquals("1.0", spec.getImplVersion());
assertEquals("JBoss", spec.getImplVendor());
}
@Test
public void testMissingPackageSpec() throws Exception {
PackageSpec spec = loader.getPackageSpec("org.jboss.modules.bogus");
assertNotNull(spec);
assertEquals("MODULES-89", spec.getSpecTitle());
assertNull(spec.getSpecVersion());
assertNull(spec.getSpecVendor());
assertNull(spec.getImplTitle());
assertNull(spec.getImplVersion());
assertNull(spec.getImplVendor());
}
@Test
public void testIterateResourcesRootRecursive() throws Exception {
Set<String> expected = new HashSet<String>();
expected.add("test.txt");
expected.add("nested/nested.txt");
expected.add("org/jboss/modules/test/TestClass.class");
expected.add("META-INF/MANIFEST.MF");
assertEquals(expected, getResourceNames("/", true));
assertEquals(expected, getResourceNames("", true));
}
@Test
public void testIterateResourcesRoot() throws Exception {
Set<String> expected = new HashSet<String>();
expected.add("test.txt");
assertEquals(expected, getResourceNames("/", false));
assertEquals(expected, getResourceNames("", false));
}
@Test
public void testIterateResourcesNested() throws Exception {
Set<String> expected = new HashSet<String>();
expected.add("nested/nested.txt");
assertEquals(expected, getResourceNames("/nested", true));
assertEquals(expected, getResourceNames("/nested", false));
assertEquals(expected, getResourceNames("nested", true));
assertEquals(expected, getResourceNames("nested", false));
}
@Test
public void testIterateResourcesClasses() throws Exception {
Set<String> expected = new HashSet<String>();
expected.add("org/jboss/modules/test/TestClass.class");
assertEquals(expected, getResourceNames("/org/jboss/modules", true));
assertEquals(expected, getResourceNames("org/jboss/modules", true));
expected = Collections.<String>emptySet();
assertEquals(expected, getResourceNames("/org/jboss/modules", false));
assertEquals(expected, getResourceNames("org/jboss/modules", false));
}
private Set<String> getResourceNames(String startPath, boolean recursive) {
Set<String> result = new HashSet<String>();
IterableResourceLoader itloader = (IterableResourceLoader) loader;
Iterator<Resource> itres = itloader.iterateResources(startPath, recursive);
while(itres.hasNext()) {
result.add(itres.next().getName());
}
return result;
}
}