blob: 80bf28b6ccb79c161578cc3fe0fd3064085305f8 [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.inject.methods;
import org.apache.felix.scr.impl.MockBundle;
import org.apache.felix.scr.impl.inject.BindParameters;
import org.apache.felix.scr.impl.inject.RefPair;
import org.apache.felix.scr.impl.inject.internal.ComponentMethodsImpl;
import org.apache.felix.scr.impl.inject.methods.BindMethod;
import org.apache.felix.scr.impl.logger.ComponentLogger;
import org.apache.felix.scr.impl.logger.MockComponentLogger;
import org.apache.felix.scr.impl.manager.ComponentActivator;
import org.apache.felix.scr.impl.manager.ComponentContainer;
import org.apache.felix.scr.impl.manager.ComponentContextImpl;
import org.apache.felix.scr.impl.manager.SingleComponentManager;
import org.apache.felix.scr.impl.manager.SingleRefPair;
import org.apache.felix.scr.impl.manager.components.FakeService;
import org.apache.felix.scr.impl.manager.components.T1;
import org.apache.felix.scr.impl.manager.components.T1MapSR;
import org.apache.felix.scr.impl.manager.components.T1a;
import org.apache.felix.scr.impl.manager.components.T3;
import org.apache.felix.scr.impl.manager.components2.T2;
import org.apache.felix.scr.impl.metadata.ComponentMetadata;
import org.apache.felix.scr.impl.metadata.DSVersion;
import org.mockito.Mockito;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import junit.framework.TestCase;
public class BindMethodTest extends TestCase
{
private ServiceReference m_serviceReference;
private FakeService m_serviceInstance;
private BundleContext m_context;
@Override
public void setUp()
{
m_serviceReference = Mockito.mock( ServiceReference.class );
m_serviceInstance = Mockito.mock( FakeService.class );
m_context = Mockito.mock( BundleContext.class );
Mockito.when( m_context.getService( m_serviceReference ) ).thenReturn( m_serviceInstance );
Mockito.when( m_serviceReference.getPropertyKeys() ).thenReturn( new String[]
{ Constants.SERVICE_ID } );
Mockito.when( m_serviceReference.getProperty( Constants.SERVICE_ID ) ).thenReturn( "Fake Service" );
}
public void test_Unexistent()
{
testMethod( "unexistent", new T1(), DSVersion.DS10, null );
testMethod( "unexistent", new T1(), DSVersion.DS11, null );
testMethod( "unexistent", new T2(), DSVersion.DS10, null );
testMethod( "unexistent", new T2(), DSVersion.DS11, null );
testMethod( "unexistent", new T3(), DSVersion.DS10, null );
testMethod( "unexistent", new T3(), DSVersion.DS11, null );
}
public void test_privateT1()
{
testMethod( "privateT1", new T1(), DSVersion.DS10, null );
testMethod( "privateT1", new T1(), DSVersion.DS11, null );
testMethod( "privateT1", new T2(), DSVersion.DS10, null );
testMethod( "privateT1", new T2(), DSVersion.DS11, null );
testMethod( "privateT1", new T3(), DSVersion.DS10, null );
testMethod( "privateT1", new T3(), DSVersion.DS11, null );
}
public void test_privateT1SR()
{
testMethod( "privateT1SR", new T1(), DSVersion.DS10, null );
testMethod( "privateT1SR", new T1(), DSVersion.DS11, "privateT1SR" );
testMethod( "privateT1SR", new T2(), DSVersion.DS10, null );
testMethod( "privateT1SR", new T2(), DSVersion.DS11, null );
}
public void test_privateT1SI()
{
testMethod( "privateT1SI", new T1(), DSVersion.DS10, null );
testMethod( "privateT1SI", new T1(), DSVersion.DS11, "privateT1SI" );
testMethod( "privateT1SI", new T2(), DSVersion.DS10, null );
testMethod( "privateT1SI", new T2(), DSVersion.DS11, null );
}
public void test_privateT1SIMap()
{
testMethod( "privateT1SIMap", new T1(), DSVersion.DS10, null );
testMethod( "privateT1SIMap", new T1(), DSVersion.DS11, "privateT1SIMap" );
testMethod( "privateT1SIMap", new T2(), DSVersion.DS10, null );
testMethod( "privateT1SIMap", new T2(), DSVersion.DS11, null );
}
public void test_privateT1SSI()
{
testMethod( "privateT1SSI", new T1(), DSVersion.DS10, null );
testMethod( "privateT1SSI", new T1(), DSVersion.DS11, "privateT1SSI" );
testMethod( "privateT1SSI", new T2(), DSVersion.DS10, null );
testMethod( "privateT1SSI", new T2(), DSVersion.DS11, null );
}
public void test_privateT1SSIMap()
{
testMethod( "privateT1SSIMap", new T1(), DSVersion.DS10, null );
testMethod( "privateT1SSIMap", new T1(), DSVersion.DS11, "privateT1SSIMap" );
testMethod( "privateT1SSIMap", new T2(), DSVersion.DS10, null );
testMethod( "privateT1SSIMap", new T2(), DSVersion.DS11, null );
}
public void test_privateT2()
{
testMethod( "privateT2", new T1(), DSVersion.DS10, null );
testMethod( "privateT2", new T1(), DSVersion.DS11, null );
testMethod( "privateT2", new T2(), DSVersion.DS10, null );
testMethod( "privateT2", new T2(), DSVersion.DS11, null );
}
public void test_privateT2SR()
{
testMethod( "privateT2SR", new T1(), DSVersion.DS10, null );
testMethod( "privateT2SR", new T1(), DSVersion.DS11, null );
testMethod( "privateT2SR", new T2(), DSVersion.DS10, null );
testMethod( "privateT2SR", new T2(), DSVersion.DS11, "privateT2SR" );
}
public void test_privateT2SI()
{
testMethod( "privateT2SI", new T1(), DSVersion.DS10, null );
testMethod( "privateT2SI", new T1(), DSVersion.DS11, null );
testMethod( "privateT2SI", new T2(), DSVersion.DS10, null );
testMethod( "privateT2SI", new T2(), DSVersion.DS11, "privateT2SI" );
}
public void test_privateT2SIMap()
{
testMethod( "privateT2SIMap", new T1(), DSVersion.DS10, null );
testMethod( "privateT2SIMap", new T1(), DSVersion.DS11, null );
testMethod( "privateT2SIMap", new T2(), DSVersion.DS10, null );
testMethod( "privateT2SIMap", new T2(), DSVersion.DS11, "privateT2SIMap" );
}
public void test_privateT2SSI()
{
testMethod( "privateT2SSI", new T1(), DSVersion.DS10, null );
testMethod( "privateT2SSI", new T1(), DSVersion.DS11, null );
testMethod( "privateT2SSI", new T2(), DSVersion.DS10, null );
testMethod( "privateT2SSI", new T2(), DSVersion.DS11, "privateT2SSI" );
}
public void test_privateT2SSIMap()
{
testMethod( "privateT2SSIMap", new T1(), DSVersion.DS10, null );
testMethod( "privateT2SSIMap", new T1(), DSVersion.DS11, null );
testMethod( "privateT2SSIMap", new T2(), DSVersion.DS10, null );
testMethod( "privateT2SSIMap", new T2(), DSVersion.DS11, "privateT2SSIMap" );
}
public void test_packageT1()
{
testMethod( "packageT1", new T1(), DSVersion.DS10, null );
testMethod( "packageT1", new T1(), DSVersion.DS11, null );
testMethod( "packageT1", new T2(), DSVersion.DS10, null );
testMethod( "packageT1", new T2(), DSVersion.DS11, null );
testMethod( "packageT1", new T3(), DSVersion.DS10, null );
testMethod( "packageT1", new T3(), DSVersion.DS11, null );
testMethod( "packageT1", new T1a(), DSVersion.DS10, null );
testMethod( "packageT1", new T1a(), DSVersion.DS11, null );
}
public void test_packageT1SR()
{
testMethod( "packageT1SR", new T1(), DSVersion.DS10, null );
testMethod( "packageT1SR", new T1(), DSVersion.DS11, "packageT1SR" );
testMethod( "packageT1SR", new T2(), DSVersion.DS10, null );
testMethod( "packageT1SR", new T2(), DSVersion.DS11, null );
testMethod( "packageT1SR", new T3(), DSVersion.DS10, null );
testMethod( "packageT1SR", new T3(), DSVersion.DS11, null );
testMethod( "packageT1SR", new T1a(), DSVersion.DS10, null );
testMethod( "packageT1SR", new T1a(), DSVersion.DS11, "packageT1SR" );
}
public void test_packageT1SI()
{
testMethod( "packageT1SI", new T1(), DSVersion.DS10, null );
testMethod( "packageT1SI", new T1(), DSVersion.DS11, "packageT1SI" );
testMethod( "packageT1SI", new T2(), DSVersion.DS10, null );
testMethod( "packageT1SI", new T2(), DSVersion.DS11, null );
testMethod( "packageT1SI", new T3(), DSVersion.DS10, null );
testMethod( "packageT1SI", new T3(), DSVersion.DS11, null );
testMethod( "packageT1SI", new T1a(), DSVersion.DS10, null );
testMethod( "packageT1SI", new T1a(), DSVersion.DS11, "packageT1SI" );
}
public void test_packageT1SIMap()
{
testMethod( "packageT1SIMap", new T1(), DSVersion.DS10, null );
testMethod( "packageT1SIMap", new T1(), DSVersion.DS11, "packageT1SIMap" );
testMethod( "packageT1SIMap", new T2(), DSVersion.DS10, null );
testMethod( "packageT1SIMap", new T2(), DSVersion.DS11, null );
testMethod( "packageT1SIMap", new T3(), DSVersion.DS10, null );
testMethod( "packageT1SIMap", new T3(), DSVersion.DS11, null );
testMethod( "packageT1SIMap", new T1a(), DSVersion.DS10, null );
testMethod( "packageT1SIMap", new T1a(), DSVersion.DS11, "packageT1SIMap" );
}
public void test_packageT1SSI()
{
testMethod( "packageT1SSI", new T1(), DSVersion.DS10, null );
testMethod( "packageT1SSI", new T1(), DSVersion.DS11, "packageT1SSI" );
testMethod( "packageT1SSI", new T2(), DSVersion.DS10, null );
testMethod( "packageT1SSI", new T2(), DSVersion.DS11, null );
testMethod( "packageT1SSI", new T3(), DSVersion.DS10, null );
testMethod( "packageT1SSI", new T3(), DSVersion.DS11, null );
testMethod( "packageT1SSI", new T1a(), DSVersion.DS10, null );
testMethod( "packageT1SSI", new T1a(), DSVersion.DS11, "packageT1SSI" );
}
public void test_packageT1SSIMap()
{
testMethod( "packageT1SSIMap", new T1(), DSVersion.DS10, null );
testMethod( "packageT1SSIMap", new T1(), DSVersion.DS11, "packageT1SSIMap" );
testMethod( "packageT1SSIMap", new T2(), DSVersion.DS10, null );
testMethod( "packageT1SSIMap", new T2(), DSVersion.DS11, null );
testMethod( "packageT1SSIMap", new T3(), DSVersion.DS10, null );
testMethod( "packageT1SSIMap", new T3(), DSVersion.DS11, null );
testMethod( "packageT1SSIMap", new T1a(), DSVersion.DS10, null );
testMethod( "packageT1SSIMap", new T1a(), DSVersion.DS11, "packageT1SSIMap" );
}
public void test_packageT2()
{
testMethod( "packageT2", new T1(), DSVersion.DS10, null );
testMethod( "packageT2", new T1(), DSVersion.DS11, null );
testMethod( "packageT2", new T2(), DSVersion.DS10, null );
testMethod( "packageT2", new T2(), DSVersion.DS11, null );
}
public void test_packageT2SR()
{
testMethod( "packageT2SR", new T1(), DSVersion.DS10, null );
testMethod( "packageT2SR", new T1(), DSVersion.DS11, null );
testMethod( "packageT2SR", new T2(), DSVersion.DS10, null );
testMethod( "packageT2SR", new T2(), DSVersion.DS11, "packageT2SR" );
}
public void test_packageT2SI()
{
testMethod( "packageT2SI", new T1(), DSVersion.DS10, null );
testMethod( "packageT2SI", new T1(), DSVersion.DS11, null );
testMethod( "packageT2SI", new T2(), DSVersion.DS10, null );
testMethod( "packageT2SI", new T2(), DSVersion.DS11, "packageT2SI" );
}
public void test_packageT2SIMap()
{
testMethod( "packageT2SIMap", new T1(), DSVersion.DS10, null );
testMethod( "packageT2SIMap", new T1(), DSVersion.DS11, null );
testMethod( "packageT2SIMap", new T2(), DSVersion.DS10, null );
testMethod( "packageT2SIMap", new T2(), DSVersion.DS11, "packageT2SIMap" );
}
public void test_packageT2SSI()
{
testMethod( "packageT2SSI", new T1(), DSVersion.DS10, null );
testMethod( "packageT2SSI", new T1(), DSVersion.DS11, null );
testMethod( "packageT2SSI", new T2(), DSVersion.DS10, null );
testMethod( "packageT2SSI", new T2(), DSVersion.DS11, "packageT2SSI" );
}
public void test_packageT2SSIMap()
{
testMethod( "packageT2SSIMap", new T1(), DSVersion.DS10, null );
testMethod( "packageT2SSIMap", new T1(), DSVersion.DS11, null );
testMethod( "packageT2SSIMap", new T2(), DSVersion.DS10, null );
testMethod( "packageT2SSIMap", new T2(), DSVersion.DS11, "packageT2SSIMap" );
}
public void test_protectedT1()
{
testMethod( "protectedT1", new T1(), DSVersion.DS10, null );
testMethod( "protectedT1", new T1(), DSVersion.DS11, null );
testMethod( "protectedT1", new T2(), DSVersion.DS10, null );
testMethod( "protectedT1", new T2(), DSVersion.DS11, null );
}
public void test_protectedT1SR()
{
testMethod( "protectedT1SR", new T1(), DSVersion.DS10, "protectedT1SR" );
testMethod( "protectedT1SR", new T1(), DSVersion.DS11, "protectedT1SR" );
testMethod( "protectedT1SR", new T2(), DSVersion.DS10, "protectedT1SR" );
testMethod( "protectedT1SR", new T2(), DSVersion.DS11, "protectedT1SR" );
}
public void test_protectedT1SI()
{
testMethod( "protectedT1SI", new T1(), DSVersion.DS10, "protectedT1SI" );
testMethod( "protectedT1SI", new T1(), DSVersion.DS11, "protectedT1SI" );
testMethod( "protectedT1SI", new T2(), DSVersion.DS10, "protectedT1SI" );
testMethod( "protectedT1SI", new T2(), DSVersion.DS11, "protectedT1SI" );
}
public void test_protectedT1SSI()
{
testMethod( "protectedT1SSI", new T1(), DSVersion.DS10, "protectedT1SSI" );
testMethod( "protectedT1SSI", new T1(), DSVersion.DS11, "protectedT1SSI" );
testMethod( "protectedT1SSI", new T2(), DSVersion.DS10, "protectedT1SSI" );
testMethod( "protectedT1SSI", new T2(), DSVersion.DS11, "protectedT1SSI" );
}
public void test_publicT1()
{
testMethod( "publicT1", new T1(), DSVersion.DS10, null );
testMethod( "publicT1", new T1(), DSVersion.DS11, null );
testMethod( "publicT1", new T2(), DSVersion.DS10, null );
testMethod( "publicT1", new T2(), DSVersion.DS11, null );
}
public void test_publicT1SR()
{
testMethod( "publicT1SR", new T1(), DSVersion.DS10, "publicT1SR" );
testMethod( "publicT1SR", new T1(), DSVersion.DS11, "publicT1SR" );
testMethod( "publicT1SR", new T2(), DSVersion.DS10, "publicT1SR" );
testMethod( "publicT1SR", new T2(), DSVersion.DS11, "publicT1SR" );
}
public void test_publicT1SI()
{
testMethod( "publicT1SI", new T1(), DSVersion.DS10, "publicT1SI" );
testMethod( "publicT1SI", new T1(), DSVersion.DS11, "publicT1SI" );
testMethod( "publicT1SI", new T2(), DSVersion.DS10, "publicT1SI" );
testMethod( "publicT1SI", new T2(), DSVersion.DS11, "publicT1SI" );
}
public void test_publicT1SIMap()
{
testMethod( "publicT1SIMap", new T1(), DSVersion.DS10, null );
testMethod( "publicT1SIMap", new T1(), DSVersion.DS11, "publicT1SIMap" );
testMethod( "publicT1SIMap", new T2(), DSVersion.DS10, null );
testMethod( "publicT1SIMap", new T2(), DSVersion.DS11, "publicT1SIMap" );
}
public void test_publicT1SSI()
{
testMethod( "publicT1SSI", new T1(), DSVersion.DS10, "publicT1SSI" );
testMethod( "publicT1SSI", new T1(), DSVersion.DS11, "publicT1SSI" );
testMethod( "publicT1SSI", new T2(), DSVersion.DS10, "publicT1SSI" );
testMethod( "publicT1SSI", new T2(), DSVersion.DS11, "publicT1SSI" );
}
public void test_publicT1SSIMap()
{
testMethod( "publicT1SSIMap", new T1(), DSVersion.DS10, null );
testMethod( "publicT1SSIMap", new T1(), DSVersion.DS11, "publicT1SSIMap" );
testMethod( "publicT1SSIMap", new T2(), DSVersion.DS10, null );
testMethod( "publicT1SSIMap", new T2(), DSVersion.DS11, "publicT1SSIMap" );
}
public void test_suitable()
{
// T1 should use its own public implementation
testMethod( "suitable", new T1(), DSVersion.DS10, "suitableT1" );
testMethod( "suitable", new T1(), DSVersion.DS11, "suitableT1" );
// T2's private implementation is only visible for DS 1.1
testMethod( "suitable", new T2(), DSVersion.DS10, null );
testMethod( "suitable", new T2(), DSVersion.DS11, "suitableT2" );
// T3 extends T2 and cannot see T2's private method
testMethod( "suitable", new T3(), DSVersion.DS10, null );
testMethod( "suitable", new T3(), DSVersion.DS11, null );
// T1a extends T1 and uses T1's public method
testMethod( "suitable", new T1a(), DSVersion.DS10, "suitableT1" );
testMethod( "suitable", new T1a(), DSVersion.DS11, "suitableT1" );
}
public void test_13()
{
//single map param
testMethod( "packageT1Map", new T1(), DSVersion.DS12, null);
testMethod( "packageT1Map", new T1(), DSVersion.DS13, "packageT1Map");
//map, sr
testMethod( "packageT1MapSR", new T1MapSR(), DSVersion.DS12, null);
testMethod( "packageT1MapSR", new T1MapSR(), DSVersion.DS13, "packageT1MapSR");
}
private void testMethod( final String methodName, final T1 component, final DSVersion dsVersion,
final String expectCallPerformed )
{
ComponentContainer container = newContainer();
SingleComponentManager icm = new SingleComponentManager( container, new ComponentMethodsImpl() );
BindMethod bm = new BindMethod( methodName, component.getClass(),
FakeService.class.getName(), dsVersion, false );
RefPair refPair = new SingleRefPair( m_serviceReference );
ComponentContextImpl<T1> cc = new ComponentContextImpl(icm, new MockBundle(), null);
assertTrue( bm.getServiceObject( new BindParameters(cc, refPair), m_context ) );
BindParameters bp = new BindParameters(cc, refPair);
bm.invoke( component, bp, null );
assertEquals( expectCallPerformed, component.callPerformed );
}
private ComponentContainer newContainer()
{
final ComponentActivator activator = Mockito.mock(ComponentActivator.class);
final ComponentMetadata metadata = newMetadata();
ComponentContainer container = new ComponentContainer() {
@Override
public ComponentActivator getActivator()
{
return activator;
}
@Override
public ComponentMetadata getComponentMetadata()
{
return metadata;
}
@Override
public void disposed(SingleComponentManager component)
{
}
public boolean isEnabled()
{
return false;
}
@Override
public ComponentLogger getLogger() {
return new MockComponentLogger();
}
};
return container;
}
private ComponentMetadata newMetadata() {
ComponentMetadata metadata = new ComponentMetadata( DSVersion.DS11 );
metadata.setName("foo");
metadata.setImplementationClassName(Object.class.getName());
metadata.validate();
return metadata;
}
}