| /* |
| * 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 org.apache.sling.launchpad.base.impl; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.fail; |
| import static org.mockito.Mockito.when; |
| |
| import java.io.IOException; |
| import java.net.JarURLConnection; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.net.URLConnection; |
| import java.net.URLStreamHandler; |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Vector; |
| import java.util.jar.JarEntry; |
| import java.util.jar.JarFile; |
| |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.mockito.Matchers; |
| import org.mockito.Mockito; |
| |
| public class ClassLoaderResourceProviderChildrenTest { |
| |
| private ClassLoader classLoader; |
| private ClassLoaderResourceProvider provider; |
| private boolean throwExceptionOnOpenConnection = false; |
| |
| private static final String [] TEST_PATHS = { |
| "resources/install", |
| "resources/install/one.jar", |
| "resources/install/sub/two.jar", |
| "resources/install/sub/six.jar", |
| "resources/install.jackrabbit/three.jar", |
| "resources/install.jackrabbit/seven.jar", |
| "resources/install.oak/four.jar", |
| "resources/install.oak/sub/five.jar" |
| }; |
| |
| private ClassLoader mockClassLoader(String ... paths) throws MalformedURLException, IOException { |
| final ClassLoader cl = Mockito.mock(ClassLoader.class); |
| final JarURLConnection conn = Mockito.mock(JarURLConnection.class); |
| final URLStreamHandler handler = new URLStreamHandler() { |
| @Override |
| protected URLConnection openConnection(final URL url) throws IOException { |
| if(throwExceptionOnOpenConnection) { |
| throw new IOException("Throwing up for testing that"); |
| } |
| return conn; |
| } |
| }; |
| final JarFile f = Mockito.mock(JarFile.class); |
| final URL url = new URL("jar://some.jar", "localhost", 1234, "some.jar", handler); |
| |
| final Vector<JarEntry> entries = new Vector<JarEntry>(); |
| for(String path : paths) { |
| entries.add(new JarEntry(path)); |
| } |
| |
| when(cl.getResource(Matchers.contains("install"))).thenReturn(url); |
| when(conn.getJarFile()).thenReturn(f); |
| when(f.entries()).thenReturn(entries.elements()); |
| |
| return cl; |
| } |
| |
| private void assertChildren(ClassLoaderResourceProvider p, String path, String ... expected) { |
| final List<String> result = new ArrayList<String>(); |
| final Iterator<String> it = p.getChildren(path); |
| while(it.hasNext()) { |
| result.add(it.next()); |
| } |
| for(String exp : expected) { |
| if(!result.contains(exp)) { |
| fail(path + ": expected child is not present in result: " + exp + ", result=" + result); |
| } |
| } |
| assertEquals(path + ": expecting " + expected.length + " children, result=" + result, expected.length, result.size()); |
| } |
| |
| @Before |
| public void setup() throws MalformedURLException, IOException { |
| classLoader = mockClassLoader(TEST_PATHS); |
| provider = new ClassLoaderResourceProvider(classLoader); |
| } |
| |
| @Test |
| public void testInstall() { |
| assertChildren(provider, "resources/install", "resources/install/one.jar"); |
| } |
| |
| @Test |
| public void testInstallTrailingSlahs() { |
| assertChildren(provider, "resources/install/", "resources/install/one.jar"); |
| } |
| |
| @Test |
| public void testInstallSub() { |
| assertChildren(provider, |
| "resources/install/sub", |
| "resources/install/sub/two.jar", |
| "resources/install/sub/six.jar"); |
| } |
| |
| @Test |
| public void testInstallJackrabbit() { |
| assertChildren(provider, |
| "resources/install.jackrabbit", |
| "resources/install.jackrabbit/three.jar", |
| "resources/install.jackrabbit/seven.jar"); |
| } |
| |
| @Test |
| public void testInstallJackrabbitTrailingSlash() { |
| assertChildren(provider, |
| "resources/install.jackrabbit/", |
| "resources/install.jackrabbit/three.jar", |
| "resources/install.jackrabbit/seven.jar"); |
| } |
| |
| @Test |
| public void testInstallOak() { |
| assertChildren(provider, |
| "resources/install.oak", |
| "resources/install.oak/four.jar"); |
| } |
| |
| @Test |
| public void testNoResults() { |
| final Iterator<String> it = provider.getChildren("FOO"); |
| assertFalse("Expecting no children", it.hasNext()); |
| } |
| |
| @Test |
| public void testException() { |
| throwExceptionOnOpenConnection = true; |
| final Iterator<String> it = provider.getChildren("resources/install"); |
| assertFalse("Expecting no results with ignored IOException", it.hasNext()); |
| } |
| } |