/* * Copyright 2002-2006 the original author or authors. * * Licensed 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. * * Created on 26-Jan-2006 by Adrian Colyer */ package org.springframework.osgi.service; import junit.framework.TestCase; import org.easymock.MockControl; import org.easymock.internal.AlwaysMatcher; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceReference; import org.springframework.aop.target.HotSwappableTargetSource; /** * @author Adrian Colyer * @since 2.0 */ public class OsgiServiceInterceptorTests extends TestCase { private OsgiServiceInterceptor interceptor; private MockControl mockContextControl; private BundleContext bundleContext; private ServiceReference serviceRef; private HotSwappableTargetSource tgtSource; private SI targetObject; protected void setUp() throws Exception { super.setUp(); this.mockContextControl = MockControl.createControl(BundleContext.class); this.bundleContext = (BundleContext) this.mockContextControl.getMock(); this.serviceRef = getServiceReference(); this.targetObject = new SI() { public void process() {} }; this.tgtSource = new HotSwappableTargetSource(targetObject); } /** * */ private void createInterceptor() { this.interceptor = new OsgiServiceInterceptor( this.bundleContext, this.serviceRef, this.tgtSource, SI.class, "(attr=value)" ); } public void testServiceModified() { this.bundleContext.addServiceListener(null); this.mockContextControl.setMatcher(new AlwaysMatcher()); this.bundleContext.getService(this.serviceRef); SI newTarget = new SI() { public void process() {} }; this.mockContextControl.setReturnValue(newTarget); this.mockContextControl.replay(); createInterceptor(); assertSame("should have original target",this.targetObject, this.tgtSource.getTarget()); ServiceEvent event = new ServiceEvent(ServiceEvent.MODIFIED,this.serviceRef); this.interceptor.serviceChanged(event); this.mockContextControl.verify(); assertSame("target has been swapped",newTarget,this.tgtSource.getTarget()); } public void testServiceUnregisteredAndRebinds() throws Throwable { this.bundleContext.addServiceListener(null); this.mockContextControl.setMatcher(new AlwaysMatcher()); this.bundleContext.getServiceReferences(SI.class.getName(),"(attr=value)"); this.mockContextControl.setReturnValue(new ServiceReference[0]); this.bundleContext.getServiceReferences(SI.class.getName(),"(attr=value)"); ServiceReference newServiceReference = getServiceReference(); this.mockContextControl.setReturnValue(new ServiceReference[] {newServiceReference}); this.bundleContext.getService(newServiceReference); SI newTarget = new SI() { public void process() {} }; this.mockContextControl.setReturnValue(newTarget); this.mockContextControl.replay(); createInterceptor(); assertSame("should have original target",this.targetObject, this.tgtSource.getTarget()); ServiceEvent event = new ServiceEvent(ServiceEvent.UNREGISTERING,this.serviceRef); this.interceptor.serviceChanged(event); this.interceptor.before(null, null, null); this.mockContextControl.verify(); assertSame("target has been swapped",newTarget,this.tgtSource.getTarget()); } public void testServiceUnregisteredAndFailsToRebind() throws Throwable { this.bundleContext.addServiceListener(null); this.mockContextControl.setMatcher(new AlwaysMatcher()); this.bundleContext.getServiceReferences(SI.class.getName(),"(attr=value)"); this.mockContextControl.setReturnValue(new ServiceReference[0]); this.bundleContext.getServiceReferences(SI.class.getName(),"(attr=value)"); this.mockContextControl.setReturnValue(new ServiceReference[0]); this.bundleContext.getServiceReferences(SI.class.getName(),"(attr=value)"); this.mockContextControl.setReturnValue(new ServiceReference[0]); this.mockContextControl.replay(); createInterceptor(); ServiceEvent event = new ServiceEvent(ServiceEvent.UNREGISTERING,this.serviceRef); this.interceptor.serviceChanged(event); try { this.interceptor.before(null, null, null); fail("should have thrown ServiceUnavailableException"); } catch(ServiceUnavailableException ex) { assertTrue("Message should start with 'The target OSGi service", ex.getMessage().startsWith("The target OSGi service")); assertEquals(SI.class, ex.getServiceType()); assertEquals("(attr=value)",ex.getFilter()); } this.mockContextControl.verify(); } private ServiceReference getServiceReference() { MockControl sRefControl = MockControl.createNiceControl(ServiceReference.class); return (ServiceReference) sRefControl.getMock(); } public interface SI { void process(); } }