/*
* 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 WARRANTIESOR 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.aries.blueprint.itests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.ops4j.pax.exam.CoreOptions.composite;
import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Currency;
import org.apache.aries.blueprint.sample.Account;
import org.apache.aries.blueprint.sample.AccountFactory;
import org.apache.aries.blueprint.sample.Bar;
import org.apache.aries.blueprint.sample.Foo;
import org.apache.aries.itest.RichBundleContext;
import org.ops4j.pax.exam.CoreOptions;
import org.ops4j.pax.exam.Option;
import org.osgi.framework.Bundle;
import org.osgi.service.blueprint.container.BlueprintContainer;
public class Helper {
private static final String SAMPLE_SYM_NAME = "org.apache.aries.blueprint.sample";
public static BlueprintContainer getBlueprintContainerForBundle(RichBundleContext context, String symbolicName) {
return context.getService(BlueprintContainer.class, "(osgi.blueprint.container.symbolicname=" + symbolicName + ")");
}
public static BlueprintContainer getBlueprintContainerForBundle(RichBundleContext context, String symbolicName, long timeout) {
return context.getService(BlueprintContainer.class, "(osgi.blueprint.container.symbolicname=" + symbolicName + ")", timeout);
}
public static Option blueprintBundles() {
return blueprintBundles(true);
}
public static Option debug(int port) {
return CoreOptions.vmOption("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=" + port);
}
public static Option blueprintBundles(boolean startBlueprint) {
return composite(
mvnBundle("org.ow2.asm", "asm-debug-all"),
mvnBundle("org.apache.felix", "org.apache.felix.configadmin"),
mvnBundle("org.ops4j.pax.url", "pax-url-aether"),
mvnBundle("org.apache.aries.testsupport", "org.apache.aries.testsupport.unit"),
mvnBundle("org.apache.aries.proxy", "org.apache.aries.proxy"),
mvnBundle("org.apache.commons", "commons-jexl"),
mvnBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.jexl.evaluator"),
mvnBundle("org.apache.xbean", "xbean-asm5-shaded"),
mvnBundle("org.apache.xbean", "xbean-bundleutils"),
mvnBundle("org.apache.xbean", "xbean-finder"),
mvnBundle("org.apache.aries.quiesce", "org.apache.aries.quiesce.api", startBlueprint),
mvnBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.api", startBlueprint),
mvnBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.core", startBlueprint),
mvnBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.cm", startBlueprint)
);
}
public static Option mvnBundle(String groupId, String artifactId) {
return mavenBundle(groupId, artifactId).versionAsInProject();
}
public static Option mvnBundle(String groupId, String artifactId, boolean start) {
return mavenBundle(groupId, artifactId).versionAsInProject().start(start);
}
public static void testBlueprintContainer(RichBundleContext context, Bundle bundle) throws Exception {
BlueprintContainer blueprintContainer = getBlueprintContainerForBundle(context, SAMPLE_SYM_NAME);
assertNotNull(blueprintContainer);
Bar bar = getInstance(blueprintContainer, "bar", Bar.class);
checkBar(bar);
Foo foo = getInstance(blueprintContainer, "foo", Foo.class);
checkFoo(bar, foo);
Foo fooService = context.getService(Foo.class);
assertNotNull(fooService);
checkFoo(bar, fooService);
// TODO Does not work
//assertEquals(obj, foo);
Account account = getInstance(blueprintContainer, "accountOne", Account.class);
assertEquals(1, account.getAccountNumber());
Account account2 = getInstance(blueprintContainer, "accountTwo", Account.class);
assertEquals(2, account2.getAccountNumber());
Account account3 = getInstance(blueprintContainer, "accountThree", Account.class);
assertEquals(3, account3.getAccountNumber());
AccountFactory accountFactory = getInstance(blueprintContainer, "accountFactory", AccountFactory.class);
assertEquals("account factory", accountFactory.getFactoryName());
bundle.stop();
Thread.sleep(1000);
try {
blueprintContainer = getBlueprintContainerForBundle(context, SAMPLE_SYM_NAME, 1);
fail("BlueprintContainer should have been unregistered");
} catch (Exception e) {
// Expected, as the module container should have been unregistered
}
assertTrue(foo.isInitialized());
assertTrue(foo.isDestroyed());
}
private static void checkBar(Bar bar) {
assertNotNull(bar.getContext());
assertEquals("Hello FooBar", bar.getValue());
assertNotNull(bar.getList());
assertEquals(2, bar.getList().size());
assertEquals("a list element", bar.getList().get(0));
assertEquals(Integer.valueOf(5), bar.getList().get(1));
}
private static void checkFoo(Bar bar, Foo foo) throws ParseException {
assertEquals(5, foo.getA());
assertEquals(10, foo.getB());
assertSame(bar, foo.getBar());
assertEquals(Currency.getInstance("PLN"), foo.getCurrency());
assertEquals(new SimpleDateFormat("yyyy.MM.dd").parse("2009.04.17"),
foo.getDate());
assertTrue(foo.isInitialized());
assertFalse(foo.isDestroyed());
}
@SuppressWarnings("unchecked")
private static <T>T getInstance(BlueprintContainer container, String name, Class<T> clazz) {
Object obj = container.getComponentInstance(name);
assertNotNull(obj);
assertEquals(clazz, obj.getClass());
return (T) obj;
}
}