blob: 5a1dd8673faf041ce3bed01f0af3f7fd59e840fe [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.scr.impl.metadata;
import junit.framework.TestCase;
import org.apache.felix.scr.impl.MockLogger;
import org.apache.felix.scr.impl.metadata.ComponentMetadata;
import org.apache.felix.scr.impl.metadata.ReferenceMetadata;
import org.apache.felix.scr.impl.metadata.ServiceMetadata;
import org.apache.felix.scr.impl.metadata.XmlHandler;
import org.osgi.service.component.ComponentException;
public class ComponentMetadataTest extends TestCase
{
private MockLogger logger = new MockLogger();
// test various combinations of component metadata with respect to
// -- immediate: true, false, unset
// -- factory: set, unset
// -- service: set, unset
// -- servicefactory: true, false, unset
public void testImmediate()
{
// immediate is default true if no service element is defined
final ComponentMetadata cm0 = createComponentMetadata( null, null );
cm0.validate( logger );
assertTrue( "Component without service must be immediate", cm0.isImmediate() );
// immediate is explicit true
final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
cm1.validate( logger );
assertTrue( "Component must be immediate", cm1.isImmediate() );
// immediate is explicit true
final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
cm2.setService( createServiceMetadata( null ) );
cm2.validate( logger );
assertTrue( "Component must be immediate", cm2.isImmediate() );
// immediate is explicit true
final ComponentMetadata cm3 = createComponentMetadata( Boolean.TRUE, null );
cm3.setService( createServiceMetadata( Boolean.FALSE ) );
cm3.validate( logger );
assertTrue( "Component must be immediate", cm3.isImmediate() );
// validation failure of immediate with service factory
final ComponentMetadata cm4 = createComponentMetadata( Boolean.TRUE, null );
cm4.setService( createServiceMetadata( Boolean.TRUE ) );
try
{
cm4.validate( logger );
fail( "Expect validation failure for immediate service factory" );
}
catch ( ComponentException ce )
{
// expect
}
}
public void testDelayed()
{
// immediate is default false if service element is defined
final ComponentMetadata cm0 = createComponentMetadata( null, null );
cm0.setService( createServiceMetadata( null ) );
cm0.validate( logger );
assertFalse( "Component with service must be delayed", cm0.isImmediate() );
// immediate is default false if service element is defined
final ComponentMetadata cm1 = createComponentMetadata( null, null );
cm1.setService( createServiceMetadata( Boolean.TRUE ) );
cm1.validate( logger );
assertFalse( "Component with service must be delayed", cm1.isImmediate() );
// immediate is default false if service element is defined
final ComponentMetadata cm2 = createComponentMetadata( null, null );
cm2.setService( createServiceMetadata( Boolean.FALSE ) );
cm2.validate( logger );
assertFalse( "Component with service must be delayed", cm2.isImmediate() );
// immediate is false if service element is defined
final ComponentMetadata cm3 = createComponentMetadata( Boolean.FALSE, null );
cm3.setService( createServiceMetadata( null ) );
cm3.validate( logger );
assertFalse( "Component with service must be delayed", cm3.isImmediate() );
// immediate is false if service element is defined
final ComponentMetadata cm4 = createComponentMetadata( Boolean.FALSE, null );
cm4.setService( createServiceMetadata( Boolean.TRUE ) );
cm4.validate( logger );
assertFalse( "Component with service must be delayed", cm4.isImmediate() );
// immediate is false if service element is defined
final ComponentMetadata cm5 = createComponentMetadata( Boolean.FALSE, null );
cm5.setService( createServiceMetadata( Boolean.FALSE ) );
cm5.validate( logger );
assertFalse( "Component with service must be delayed", cm5.isImmediate() );
// explicit delayed fails when there is no service
final ComponentMetadata cm6 = createComponentMetadata( Boolean.FALSE, null );
try
{
cm6.validate( logger );
fail( "Expect validation failure for delayed component without service" );
}
catch ( ComponentException ce )
{
// expect
}
}
public void testFactory()
{
// immediate is default false if factory is defined
final ComponentMetadata cm0 = createComponentMetadata( null, "factory" );
cm0.validate( logger );
assertFalse( "Component with factory must be delayed", cm0.isImmediate() );
// immediate is false if factory is defined
final ComponentMetadata cm1 = createComponentMetadata( Boolean.FALSE, "factory" );
cm1.validate( logger );
assertFalse( "Component with factory must be delayed", cm1.isImmediate() );
// immediate is default false if factory is defined
final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, "factory" );
try
{
cm2.validate( logger );
fail( "Expect validation failure for immediate factory component" );
}
catch ( ComponentException ce )
{
// expect
}
// immediate is default false if factory is defined
final ComponentMetadata cm10 = createComponentMetadata( null, "factory" );
cm10.setService( createServiceMetadata( null ) );
cm10.validate( logger );
assertFalse( "Component with factory must be delayed", cm10.isImmediate() );
// immediate is false if factory is defined
final ComponentMetadata cm11 = createComponentMetadata( Boolean.FALSE, "factory" );
cm11.setService( createServiceMetadata( null ) );
cm11.validate( logger );
assertFalse( "Component with factory must be delayed", cm11.isImmediate() );
// immediate is default false if factory is defined
final ComponentMetadata cm12 = createComponentMetadata( Boolean.TRUE, "factory" );
cm12.setService( createServiceMetadata( null ) );
try
{
cm12.validate( logger );
fail( "Expect validation failure for immediate factory component" );
}
catch ( ComponentException ce )
{
// expect
}
// immediate is default false if factory is defined
final ComponentMetadata cm20 = createComponentMetadata( null, "factory" );
cm20.setService( createServiceMetadata( Boolean.FALSE ) );
cm20.validate( logger );
assertFalse( "Component with factory must be delayed", cm20.isImmediate() );
// immediate is false if factory is defined
final ComponentMetadata cm21 = createComponentMetadata( Boolean.FALSE, "factory" );
cm21.setService( createServiceMetadata( Boolean.FALSE ) );
cm21.validate( logger );
assertFalse( "Component with factory must be delayed", cm21.isImmediate() );
// immediate is default false if factory is defined
final ComponentMetadata cm22 = createComponentMetadata( Boolean.TRUE, "factory" );
cm22.setService( createServiceMetadata( Boolean.FALSE ) );
try
{
cm22.validate( logger );
fail( "Expect validation failure for immediate factory component" );
}
catch ( ComponentException ce )
{
// expect
}
// immediate is default false if factory is defined
final ComponentMetadata cm30 = createComponentMetadata( null, "factory" );
cm30.setService( createServiceMetadata( Boolean.TRUE ) );
try
{
cm30.validate( logger );
fail( "Expect validation failure for factory component with service factory" );
}
catch ( ComponentException ce )
{
// expect
}
// immediate is false if factory is defined
final ComponentMetadata cm31 = createComponentMetadata( Boolean.FALSE, "factory" );
cm31.setService( createServiceMetadata( Boolean.TRUE ) );
try
{
cm31.validate( logger );
fail( "Expect validation failure for factory component with service factory" );
}
catch ( ComponentException ce )
{
// expect
}
// immediate is default false if factory is defined
final ComponentMetadata cm32 = createComponentMetadata( Boolean.TRUE, "factory" );
cm32.setService( createServiceMetadata( Boolean.TRUE ) );
try
{
cm32.validate( logger );
fail( "Expect validation failure for immediate factory component with service factory" );
}
catch ( ComponentException ce )
{
// expect
}
}
public void test_component_no_name_ds10()
{
final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
cm1.setName( null );
try
{
cm1.validate( logger );
fail( "Expected validation failure for DS 1.0 component without name" );
}
catch ( ComponentException ce )
{
// expected
}
}
public void test_component_no_name_ds11()
{
final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null );
cm1.setName( null );
cm1.validate( logger );
assertEquals( "Expected name to equal implementation class name", cm1.getImplementationClassName(), cm1
.getName() );
}
public void test_component_activate_ds10()
{
final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
cm1.validate( logger );
assertEquals( "Activate method name", "activate", cm1.getActivate() );
assertFalse( "Activate method expected to not be declared", cm1.isActivateDeclared() );
final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
cm2.setActivate( "someMethod" );
cm2.validate( logger );
assertEquals( "Activate method name", "activate", cm2.getActivate() );
assertFalse( "Activate method expected to not be declared", cm2.isActivateDeclared() );
}
public void test_component_activate_ds11()
{
final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null );
cm1.validate( logger );
assertEquals( "Activate method name", "activate", cm1.getActivate() );
assertFalse( "Activate method expected to not be declared", cm1.isActivateDeclared() );
final ComponentMetadata cm2 = createComponentMetadata11( Boolean.TRUE, null );
cm2.setActivate( "someMethod" );
cm2.validate( logger );
assertEquals( "Activate method name", "someMethod", cm2.getActivate() );
assertTrue( "Activate method expected to be declared", cm2.isActivateDeclared() );
}
public void test_component_deactivate_ds10()
{
final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
cm1.validate( logger );
assertEquals( "Deactivate method name", "deactivate", cm1.getDeactivate() );
assertFalse( "Deactivate method expected to not be declared", cm1.isDeactivateDeclared() );
final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
cm2.setDeactivate( "someMethod" );
cm2.validate( logger );
assertEquals( "Deactivate method name", "deactivate", cm2.getDeactivate() );
assertFalse( "Deactivate method expected to not be declared", cm2.isDeactivateDeclared() );
}
public void test_component_deactivate_ds11()
{
final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null );
cm1.validate( logger );
assertEquals( "Deactivate method name", "deactivate", cm1.getDeactivate() );
assertFalse( "Deactivate method expected to not be declared", cm1.isDeactivateDeclared() );
final ComponentMetadata cm2 = createComponentMetadata11( Boolean.TRUE, null );
cm2.setDeactivate( "someMethod" );
cm2.validate( logger );
assertEquals( "Deactivate method name", "someMethod", cm2.getDeactivate() );
assertTrue( "Deactivate method expected to be declared", cm2.isDeactivateDeclared() );
}
public void test_component_modified_ds10()
{
final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
cm1.validate( logger );
assertNull( "Modified method name", cm1.getModified() );
final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
cm2.setModified( "someName" );
cm2.validate( logger );
assertNull( "Modified method name", cm2.getModified() );
}
public void test_component_modified_ds11()
{
final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null );
cm1.validate( logger );
assertNull( "Modified method name", cm1.getModified() );
final ComponentMetadata cm2 = createComponentMetadata11( Boolean.TRUE, null );
cm2.setModified( "someMethod" );
cm2.validate( logger );
assertEquals( "Modified method name", "someMethod", cm2.getModified() );
}
public void test_component_configuration_policy_ds10()
{
final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
cm1.validate( logger );
assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL, cm1
.getConfigurationPolicy() );
final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
cm2.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_IGNORE );
cm2.validate( logger );
assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL, cm2
.getConfigurationPolicy() );
final ComponentMetadata cm3 = createComponentMetadata( Boolean.TRUE, null );
cm3.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL );
cm3.validate( logger );
assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL, cm3
.getConfigurationPolicy() );
final ComponentMetadata cm4 = createComponentMetadata( Boolean.TRUE, null );
cm4.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_REQUIRE );
cm4.validate( logger );
assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL, cm4
.getConfigurationPolicy() );
final ComponentMetadata cm5 = createComponentMetadata( Boolean.TRUE, null );
cm5.setConfigurationPolicy( "undefined" );
cm5.validate( logger );
assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL, cm5
.getConfigurationPolicy() );
}
public void test_component_configuration_policy_ds11()
{
final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null );
cm1.validate( logger );
assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL, cm1
.getConfigurationPolicy() );
final ComponentMetadata cm2 = createComponentMetadata11( Boolean.TRUE, null );
cm2.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_IGNORE );
cm2.validate( logger );
assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_IGNORE, cm2
.getConfigurationPolicy() );
final ComponentMetadata cm3 = createComponentMetadata11( Boolean.TRUE, null );
cm3.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL );
cm3.validate( logger );
assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL, cm3
.getConfigurationPolicy() );
final ComponentMetadata cm4 = createComponentMetadata11( Boolean.TRUE, null );
cm4.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_REQUIRE );
cm4.validate( logger );
assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_REQUIRE, cm4
.getConfigurationPolicy() );
final ComponentMetadata cm5 = createComponentMetadata11( Boolean.TRUE, null );
cm5.setConfigurationPolicy( "undefined" );
try
{
cm5.validate( logger );
fail( "Expected validation failure due to undefined configuration policy" );
}
catch ( ComponentException ce )
{
// expected due to undefned configuration policy
}
}
public void test_reference_valid()
{
// two references, should validate
final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
cm1.addDependency( createReferenceMetadata( "name1" ) );
cm1.addDependency( createReferenceMetadata( "name2" ) );
cm1.validate( logger );
}
public void test_reference_duplicate_name()
{
// two references with same name, must warn
final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
cm2.addDependency( createReferenceMetadata( "name1" ) );
cm2.addDependency( createReferenceMetadata( "name1" ) );
cm2.validate( logger );
assertTrue( "Expected warning for duplicate reference name", logger
.messageContains( "Detected duplicate reference name" ) );
}
public void test_reference_no_name_ds10()
{
// un-named reference, illegal for pre DS 1.1
final ComponentMetadata cm3 = createComponentMetadata( Boolean.TRUE, null );
cm3.addDependency( createReferenceMetadata( null ) );
try
{
cm3.validate( logger );
fail( "Expect validation failure for DS 1.0 reference without name" );
}
catch ( ComponentException ce )
{
// expected
}
}
public void test_reference_no_name_ds11()
{
// un-named reference, illegal for DS 1.1
final ComponentMetadata cm4 = createComponentMetadata11( Boolean.TRUE, null );
final ReferenceMetadata rm4 = createReferenceMetadata( null );
cm4.addDependency( rm4 );
cm4.validate( logger );
assertEquals( "Reference name defaults to interface", rm4.getInterface(), rm4.getName() );
}
public void test_duplicate_implementation_ds10()
{
final ComponentMetadata cm = createComponentMetadata( Boolean.TRUE, null );
cm.setImplementationClassName( "second.implementation.class" );
try
{
cm.validate( logger );
fail( "Expect validation failure for duplicate implementation element" );
}
catch ( ComponentException ce )
{
// expected
}
}
public void test_duplicate_implementation_ds11()
{
final ComponentMetadata cm = createComponentMetadata11( Boolean.TRUE, null );
cm.setImplementationClassName( "second.implementation.class" );
try
{
cm.validate( logger );
fail( "Expect validation failure for duplicate implementation element" );
}
catch ( ComponentException ce )
{
// expected
}
}
public void test_duplicate_service_ds10()
{
final ComponentMetadata cm = createComponentMetadata( Boolean.TRUE, null );
cm.setService( createServiceMetadata( Boolean.TRUE ) );
cm.setService( createServiceMetadata( Boolean.TRUE ) );
try
{
cm.validate( logger );
fail( "Expect validation failure for duplicate service element" );
}
catch ( ComponentException ce )
{
// expected
}
}
public void test_duplicate_service_ds11()
{
final ComponentMetadata cm = createComponentMetadata11( Boolean.TRUE, null );
cm.setService( createServiceMetadata( Boolean.TRUE ) );
cm.setService( createServiceMetadata( Boolean.TRUE ) );
try
{
cm.validate( logger );
fail( "Expect validation failure for duplicate service element" );
}
catch ( ComponentException ce )
{
// expected
}
}
//---------- Helper methods
// Creates DS 1.0 Component Metadata
private ComponentMetadata createComponentMetadata( Boolean immediate, String factory )
{
ComponentMetadata meta = new ComponentMetadata( XmlHandler.DS_VERSION_1_0 );
meta.setName( "place.holder" );
meta.setImplementationClassName( "place.holder.implementation" );
if ( immediate != null )
{
meta.setImmediate( immediate.booleanValue() );
}
if ( factory != null )
{
meta.setFactoryIdentifier( factory );
}
return meta;
}
// Creates DS 1.1 Component Metadata
private ComponentMetadata createComponentMetadata11( Boolean immediate, String factory )
{
ComponentMetadata meta = new ComponentMetadata( XmlHandler.DS_VERSION_1_1 );
meta.setName( "place.holder" );
meta.setImplementationClassName( "place.holder.implementation" );
if ( immediate != null )
{
meta.setImmediate( immediate.booleanValue() );
}
if ( factory != null )
{
meta.setFactoryIdentifier( factory );
}
return meta;
}
private ServiceMetadata createServiceMetadata( Boolean serviceFactory )
{
ServiceMetadata meta = new ServiceMetadata();
meta.addProvide( "place.holder.service" );
if ( serviceFactory != null )
{
meta.setServiceFactory( serviceFactory.booleanValue() );
}
return meta;
}
private ReferenceMetadata createReferenceMetadata( String name )
{
ReferenceMetadata meta = new ReferenceMetadata();
meta.setName( name );
meta.setInterface( "place.holder" );
return meta;
}
}