blob: 3f252f8fe9576d23e82c59a5fd174bdd5ac0daf3 [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.karaf.features.internal;
import static org.easymock.EasyMock.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import junit.framework.TestCase;
import org.apache.felix.utils.manifest.Clause;
import org.apache.karaf.features.Feature;
import org.easymock.EasyMock;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkListener;
/**
* Test cases for {@link FeaturesServiceImpl}
*/
public class FeaturesServiceImplTest extends TestCase {
File dataFile;
protected void setUp() throws IOException {
dataFile = File.createTempFile("features", null, null);
}
public void testGetFeature() throws Exception {
final Map<String, Map<String, Feature>> features = new HashMap<String, Map<String,Feature>>();
Map<String, Feature> versions = new HashMap<String, Feature>();
FeatureImpl feature = new FeatureImpl("transaction");
versions.put("1.0.0", feature);
features.put("transaction", versions);
final FeaturesServiceImpl impl = new FeaturesServiceImpl() {
protected Map<String,Map<String,Feature>> getFeatures() throws Exception {
return features;
};
};
assertNotNull(impl.getFeature("transaction", FeatureImpl.DEFAULT_VERSION));
assertSame(feature, impl.getFeature("transaction", FeatureImpl.DEFAULT_VERSION));
}
public void testGetFeatureStripVersion() throws Exception {
final Map<String, Map<String, Feature>> features = new HashMap<String, Map<String,Feature>>();
Map<String, Feature> versions = new HashMap<String, Feature>();
FeatureImpl feature = new FeatureImpl("transaction");
versions.put("1.0.0", feature);
features.put("transaction", versions);
final FeaturesServiceImpl impl = new FeaturesServiceImpl() {
protected Map<String,Map<String,Feature>> getFeatures() throws Exception {
return features;
};
};
assertNotNull(impl.getFeature("transaction", " 1.0.0 "));
assertSame(feature, impl.getFeature("transaction", " 1.0.0 "));
}
public void testGetFeatureNotAvailable() throws Exception {
final Map<String, Map<String, Feature>> features = new HashMap<String, Map<String,Feature>>();
Map<String, Feature> versions = new HashMap<String, Feature>();
versions.put("1.0.0", new FeatureImpl("transaction"));
features.put("transaction", versions);
final FeaturesServiceImpl impl = new FeaturesServiceImpl() {
protected Map<String,Map<String,Feature>> getFeatures() throws Exception {
return features;
};
};
assertNull(impl.getFeature("activemq", FeatureImpl.DEFAULT_VERSION));
}
public void testGetFeatureHighestAvailable() throws Exception {
final Map<String, Map<String, Feature>> features = new HashMap<String, Map<String,Feature>>();
Map<String, Feature> versions = new HashMap<String, Feature>();
versions.put("1.0.0", new FeatureImpl("transaction", "1.0.0"));
versions.put("2.0.0", new FeatureImpl("transaction", "2.0.0"));
features.put("transaction", versions);
final FeaturesServiceImpl impl = new FeaturesServiceImpl() {
protected Map<String,Map<String,Feature>> getFeatures() throws Exception {
return features;
};
};
assertNotNull(impl.getFeature("transaction", FeatureImpl.DEFAULT_VERSION));
assertSame("2.0.0", impl.getFeature("transaction", FeatureImpl.DEFAULT_VERSION).getVersion());
}
public void testStartDoesNotFailWithOneInvalidUri() {
BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
bundleContext.addFrameworkListener(EasyMock.<FrameworkListener>anyObject());
bundleContext.removeFrameworkListener(EasyMock.<FrameworkListener>anyObject());
replay(bundleContext);
FeaturesServiceImpl service = new FeaturesServiceImpl();
service.setBundleContext(bundleContext);
try {
service.setUrls("mvn:inexistent/features/1.0/xml/features");
service.start();
} catch (Exception e) {
fail(String.format("Service should not throw start-up exception but log the error instead: %s", e));
}
}
/**
* This test checks KARAF-388 which allows you to specify version of boot feature.
*/
public void testStartDoesNotFailWithNonExistentVersion() {
BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
final Map<String, Map<String, Feature>> features = new HashMap<String, Map<String,Feature>>();
Map<String, Feature> versions = new HashMap<String, Feature>();
versions.put("1.0.0", new FeatureImpl("transaction", "1.0.0"));
versions.put("2.0.0", new FeatureImpl("transaction", "2.0.0"));
features.put("transaction", versions);
Map<String, Feature> versions2 = new HashMap<String, Feature>();
versions2.put("1.0.0", new FeatureImpl("ssh", "1.0.0"));
features.put("ssh", versions2);
final CountDownLatch latch = new CountDownLatch(2);
final FeaturesServiceImpl impl = new FeaturesServiceImpl() {
protected Map<String,Map<String,Feature>> getFeatures() throws Exception {
return features;
};
// override methods which refers to bundle context to avoid mocking everything
@Override
protected boolean loadState() {
return true;
}
@Override
protected void saveState() {
// this method will be invoked twice while features service is starting
latch.countDown();
}
};
impl.setBundleContext(bundleContext);
try {
Thread.currentThread().setContextClassLoader(new URLClassLoader(new URL[0]));
impl.setBoot("transaction;version=1.2,ssh;version=1.0.0");
impl.start();
// waiting for the features service installation thread to finish its work
latch.await(2, TimeUnit.SECONDS);
assertFalse("Feature transaction 1.0.0 should not be installed", impl.isInstalled(impl.getFeature("transaction", "1.0.0")));
assertFalse("Feature transaction 2.0.0 should not be installed", impl.isInstalled(impl.getFeature("transaction", "2.0.0")));
assertTrue("Feature ssh should be installed", impl.isInstalled(impl.getFeature("ssh", "1.0.0")));
} catch (Exception e) {
fail(String.format("Service should not throw start-up exception but log the error instead: %s", e));
}
}
public void testGetOptionalImportsOnly() {
FeaturesServiceImpl service = new FeaturesServiceImpl();
List<Clause> result = service.getOptionalImports("org.apache.karaf,org.apache.karaf.optional;resolution:=optional");
assertEquals("One optional import expected", 1, result.size());
assertEquals("org.apache.karaf.optional", result.get(0).getName());
result = service.getOptionalImports(null);
assertNotNull(result);
assertEquals("No optional imports expected", 0, result.size());
}
}