blob: 8bda8af2306d4b98d1742cb9a266e2143a771cb5 [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.felix.ipojo.runtime.core.test.declaration;
import org.apache.felix.ipojo.IPojoFactory;
import org.apache.felix.ipojo.extender.DeclarationBuilderService;
import org.apache.felix.ipojo.extender.DeclarationHandle;
import org.apache.felix.ipojo.extender.ExtensionDeclaration;
import org.apache.felix.ipojo.extender.builder.FactoryBuilder;
import org.apache.felix.ipojo.extender.builder.FactoryBuilderException;
import org.apache.felix.ipojo.metadata.Attribute;
import org.apache.felix.ipojo.metadata.Element;
import org.apache.felix.ipojo.runtime.core.test.services.HelloService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import static java.lang.String.format;
import static junit.framework.Assert.*;
public class TestDeclarationBuilderService extends Common {
private DeclarationBuilderService builder;
private DeclarationHandle handle;
@Before
public void setUp() {
builder = osgiHelper.getServiceObject(DeclarationBuilderService.class);
}
@After
public void tearDown() {
if (handle != null) {
handle.retract();
}
}
@Test
public void testAnonymousInstanceCreation() {
handle = builder.newInstance("org.apache.felix.ipojo.runtime.core.test.components.FrenchHelloService")
.build();
// When a service is registered, all events are fired synchronously, we
// can safely test the declaration binding
assertFalse(handle.getStatus().isBound());
handle.publish();
// This test has been already ssen as failed.
HelloService hs = osgiHelper.waitForService(HelloService.class, "(factory.name=org.apache.felix.ipojo.runtime" +
".core.test.components.FrenchHelloService)", 1000);
assertNotNull(hs);
System.out.println("Status: " + handle.getStatus().isBound());
assertTrue(handle.getStatus().isBound());
handle.retract();
assertFalse(handle.getStatus().isBound());
}
@Test
public void testNamedInstanceCreation() {
handle = builder.newInstance("org.apache.felix.ipojo.runtime.core.test.components.FrenchHelloService")
.name("bonjour-service")
.build();
handle.publish();
assertTrue(ipojoHelper.isServiceAvailableByName(HelloService.class.getName(), "bonjour-service"));
}
@Test
public void testConfiguredInstanceCreation() {
handle = builder.newInstance("org.apache.felix.ipojo.runtime.core.test.components.FrenchHelloService")
.name("bonjour-service")
.configure()
.property("message", "Salut")
.build();
handle.publish();
assertTrue(ipojoHelper.isServiceAvailableByName(HelloService.class.getName(), "bonjour-service"));
HelloService service = osgiHelper.getServiceObject(HelloService.class, format("(instance.name=%s)", "bonjour-service"));
assertEquals(service.hello("Guillaume"), "Salut Guillaume");
}
@Test
public void testVersionedTypeInstanceCreation() {
handle = builder.newInstance("hello-service")
.version("2.0")
.name("hello2")
.build();
handle.publish();
String filter = format("(instance.name=%s)", "hello2");
osgiHelper.waitForService(HelloService.class, filter, 1000);
HelloService service = osgiHelper.getServiceObject(HelloService.class, filter);
assertEquals(service.hello("Guillaume"), "Hello2 Guillaume");
}
@Test
public void testExtensionCreation() {
handle = builder.newExtension("test", new EmptyFactoryBuilder());
handle.publish();
osgiHelper.waitForService(ExtensionDeclaration.class, null, 1000);
}
@Test
public void testTypeCreation() throws Exception {
handle = builder.newType(germanComponent());
handle.publish();
DeclarationHandle instance = builder.newInstance("german-service")
.name("german-hello")
.build();
instance.publish();
System.out.println(instance.getStatus().getMessage());
String filter = format("(instance.name=%s)", "german-hello");
osgiHelper.waitForService(HelloService.class, filter, 1000);
HelloService service = osgiHelper.getServiceObject(HelloService.class, filter);
assertEquals(service.hello("Guillaume"), "Hallo Guillaume");
instance.retract();
}
/*
@Test
public void testTypeCreationFromAPI() throws Exception {
PrimitiveComponentType type = new PrimitiveComponentType()
.setClassName("org.apache.felix.ipojo.runtime.core.test.components.GermanHelloService")
.setComponentTypeName("german-service")
.addService(new Service());
Element description = type.getFactory().getComponentMetadata();
handle = builder.newType(description);
handle.publish();
DeclarationHandle instance = builder.newInstance("german-service")
.name("german-hello")
.build();
instance.publish();
String filter = format("(instance.name=%s)", "german-hello");
osgiHelper.waitForService(HelloService.class, filter, 1000);
HelloService service = osgiHelper.getServiceObject(HelloService.class, filter);
assertEquals(service.hello("Guillaume"), "Hallo Guillaume");
instance.retract();
}
*/
private Element germanComponent() {
Element component = new Element("component", null);
component.addAttribute(new Attribute("name", "german-service"));
component.addAttribute(new Attribute("classname", "org.apache.felix.ipojo.runtime.core.test.components.GermanHelloService"));
component.addElement(new Element("provides", null));
component.addElement(manipulation());
return component;
}
private Element manipulation() {
Element manipulation = new Element("manipulation", null);
manipulation.addAttribute(new Attribute("classname", "org.apache.felix.ipojo.runtime.core.test.components.GermanHelloService"));
manipulation.addAttribute(new Attribute("super", "java.lang.Object"));
Element itf = new Element("interface", null);
itf.addAttribute(new Attribute("name", "org.apache.felix.ipojo.runtime.core.test.services.HelloService"));
manipulation.addElement(itf);
Element method = new Element("method", null);
method.addAttribute(new Attribute("name", "hello"));
method.addAttribute(new Attribute("return", "java.lang.String"));
method.addAttribute(new Attribute("arguments", "{java.lang.String}"));
method.addAttribute(new Attribute("names", "{name}"));
manipulation.addElement(method);
return manipulation;
}
private static class EmptyFactoryBuilder implements FactoryBuilder {
@Override
public IPojoFactory build(final BundleContext bundleContext, final Element metadata) throws FactoryBuilderException {
return null;
}
}
}