blob: e33a5237416d14a9060aef352d8bc5f9b8dcd736 [file] [log] [blame]
/*
* 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();
}
}