| /* |
| * 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.installer.impl; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertTrue; |
| import static org.junit.Assert.fail; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.InputStream; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import org.apache.sling.installer.api.InstallableResource; |
| import org.apache.sling.installer.api.OsgiInstaller; |
| import org.apache.sling.launchpad.api.LaunchpadContentProvider; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.mockito.Matchers; |
| import org.mockito.Mockito; |
| import org.mockito.invocation.InvocationOnMock; |
| import org.mockito.stubbing.Answer; |
| |
| public class LaunchpadConfigInstallerTest { |
| |
| private OsgiInstaller installer; |
| private Set<String> registered; |
| private boolean getChildrenReturnsNull; |
| private boolean checkResourceTypes; |
| |
| final Set<String> NO_RUN_MODES = new HashSet<String>(); |
| |
| final LaunchpadContentProvider provider = new LaunchpadContentProvider() { |
| |
| private final Map<String, String> CHILDREN = new HashMap<String, String>(); |
| |
| { |
| CHILDREN.put("resources", |
| "config,bundles,install/,install.dev,install.dev.test,install.test.dev,install.dev.test.another,install.another"); |
| CHILDREN.put("config", "A.cfg,B.config,C.somefile,D.properties,dev,cfgModeB"); |
| CHILDREN.put("dev", "cfgDev.properties"); |
| CHILDREN.put("cfgModeB", "cfgB.properties"); |
| CHILDREN.put("install", "install.cfg,install/5/"); |
| CHILDREN.put("install/5", "fiveA.cfg,fiveB.properties"); |
| CHILDREN.put("install.dev", "mars.config,april.properties"); |
| CHILDREN.put("install.dev.test", "devtest.cfg/"); |
| CHILDREN.put("install.test.dev", "testdev.cfg"); |
| CHILDREN.put("install.dev.test.another", "anotherNo.cfg"); |
| CHILDREN.put("install.another", "anotherYes.cfg"); |
| CHILDREN.put("bundles", "foo.jar,bar.jar,wii.jar"); |
| } |
| |
| public Iterator<String> getChildren(String path) { |
| if(getChildrenReturnsNull) { |
| // simulate old-style provider |
| return null; |
| } |
| final List<String> result = new ArrayList<String>(); |
| final String kids = CHILDREN.get(path); |
| if(kids != null) { |
| for(String r : kids.split(",")) { |
| result.add(r); |
| } |
| } |
| return result.iterator(); |
| } |
| |
| public URL getResource(String path) { |
| try { |
| return new URL("file://" + path); |
| } catch(MalformedURLException mfe) { |
| fail("Invalid URL " + mfe); |
| } |
| return null; |
| } |
| |
| public InputStream getResourceAsStream(String path) { |
| return new ByteArrayInputStream(path.getBytes()); |
| } |
| }; |
| |
| private void assertRegistered(String ...resources) { |
| final List<String> expected = Arrays.asList(resources); |
| for(String r : expected) { |
| assertTrue("Expecting " + r + " to be registered (" + registered + ")", registered.contains(r)); |
| } |
| final int delta = registered.size() - resources.length; |
| if(delta != 0) { |
| final List<String> unexpected = new ArrayList<String>(); |
| for(String r : registered) { |
| if(!expected.contains(r)) { |
| unexpected.add(r); |
| } |
| |
| } |
| fail("Expected resources don't match registered, unexpected=" + unexpected); |
| } |
| } |
| |
| @Before |
| public void setup() { |
| installer = Mockito.mock(OsgiInstaller.class); |
| registered = new HashSet<String>(); |
| getChildrenReturnsNull = false; |
| checkResourceTypes = false; |
| |
| final Answer<Void> rCollector = new Answer<Void>() { |
| public Void answer(InvocationOnMock invocation) throws Throwable { |
| assertEquals("launchpad", invocation.getArguments()[0]); |
| final InstallableResource [] resources = (InstallableResource[])invocation.getArguments()[1]; |
| for(InstallableResource r : resources) { |
| String value = r.getId(); |
| final Object hint = r.getDictionary() == null ? null : r.getDictionary().get(InstallableResource.INSTALLATION_HINT); |
| if(hint != null) { |
| value += "-H" + hint; |
| } |
| value += "-P" + r.getPriority(); |
| if(checkResourceTypes) { |
| value += "-T" + r.getType(); |
| } |
| registered.add(value); |
| } |
| return null; |
| } |
| }; |
| Mockito.doAnswer(rCollector).when(installer).registerResources(Matchers.anyString(), Matchers.any(InstallableResource[].class)); |
| } |
| |
| @Test |
| public void testNoRunModes() { |
| LaunchpadConfigInstaller.install(installer, provider, NO_RUN_MODES); |
| assertRegistered("A.cfg-P50", "B.config-P50", "C.somefile-P50", "D.properties-P50","install.cfg-P50", |
| "fiveA.cfg-H5-P50","fiveB.properties-H5-P50"); |
| } |
| |
| @Test |
| public void testAnotherMode() { |
| final Set<String> runModes = new HashSet<String>(); |
| runModes.add("another"); |
| LaunchpadConfigInstaller.install(installer, provider, runModes); |
| assertRegistered( |
| "A.cfg-P50", "B.config-P50", "C.somefile-P50", "D.properties-P50","install.cfg-P50", |
| "fiveA.cfg-H5-P50","fiveB.properties-H5-P50", |
| "anotherYes.cfg-P55"); |
| } |
| |
| @Test |
| public void testDevRunMode() { |
| checkResourceTypes = true; |
| final Set<String> runModes = new HashSet<String>(); |
| runModes.add("dev"); |
| LaunchpadConfigInstaller.install(installer, provider, runModes); |
| assertRegistered( |
| "A.cfg-P50-Tproperties", "B.config-P50-Tproperties", "C.somefile-P50-Tproperties", |
| "D.properties-P50-Tproperties","install.cfg-P50-Tfile", |
| "fiveA.cfg-H5-P50-Tfile","fiveB.properties-H5-P50-Tfile", |
| "cfgDev.properties-P55-Tproperties", |
| "mars.config-P55-Tfile", "april.properties-P55-Tfile"); |
| } |
| |
| @Test |
| public void testDevTestRunModes() { |
| final Set<String> runModes = new HashSet<String>(); |
| runModes.add("dev"); |
| runModes.add("test"); |
| LaunchpadConfigInstaller.install(installer, provider, runModes); |
| assertRegistered( |
| "A.cfg-P50", "B.config-P50", "C.somefile-P50", "D.properties-P50","install.cfg-P50", |
| "cfgDev.properties-P55", |
| "fiveA.cfg-H5-P50","fiveB.properties-H5-P50", |
| "mars.config-P55", "april.properties-P55", |
| "devtest.cfg-P60", "testdev.cfg-P60"); |
| } |
| |
| @Test |
| public void testOldStyle() { |
| getChildrenReturnsNull = true; |
| LaunchpadConfigInstaller.install(installer, provider, NO_RUN_MODES); |
| assertRegistered(); |
| } |
| } |