blob: db56c75ffaab7e0ca7cdc5ff660f7f354b02cb39 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.kernel.userregion.internal;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import java.util.HashSet;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository;
import org.eclipse.virgo.nano.shim.scope.Scope;
import org.eclipse.virgo.nano.shim.scope.ScopeFactory;
import org.eclipse.virgo.kernel.userregion.internal.ServiceScopingStrategy;
import org.eclipse.virgo.test.stubs.framework.StubBundleContext;
/**
*/
public class ServiceScopingStrategyTests {
private static final String SCOPE_NAME = "application scope";
private static final String CLASS_NAME = "Class";
private static final String FILTER = "Filter";
private ServiceScopingStrategy serviceScopingStrategy;
private ScopeFactory scopeFactory;
private ScopeServiceRepository scopeServiceRepository;
private Scope globalScope;
private ServiceReference<?> unscopedServiceReference;
private StubBundleContext unscopedBundleContext;
private Scope appScope;
private ServiceReference<?> scopedServiceReference;
private StubBundleContext scopedBundleContext;
@Before
public void setUp() throws Exception {
this.scopeFactory = createMock(ScopeFactory.class);
this.scopeServiceRepository = createMock(ScopeServiceRepository.class);
this.serviceScopingStrategy = new ServiceScopingStrategy(this.scopeFactory, this.scopeServiceRepository);
this.globalScope = createMock(Scope.class);
expect(this.globalScope.isGlobal()).andReturn(true).anyTimes();
expect(this.scopeFactory.getGlobalScope()).andReturn(this.globalScope).anyTimes();
this.appScope = createMock(Scope.class);
expect(this.appScope.isGlobal()).andReturn(false).anyTimes();
expect(this.appScope.getScopeName()).andReturn(SCOPE_NAME).anyTimes();
replay(this.globalScope, this.appScope);
}
private void setUpScopedBundleContext() {
this.scopedBundleContext = new StubBundleContext();
expect(this.scopeFactory.getBundleScope(eq(this.scopedBundleContext.getBundle()))).andReturn(this.appScope).anyTimes();
}
private void setUpScopedServiceReference() {
this.scopedServiceReference = createMock(ServiceReference.class);
expect(this.scopeFactory.getServiceScope(eq(this.scopedServiceReference))).andReturn(this.appScope).anyTimes();
}
private void setUpUnscopedBundleContext() {
this.unscopedBundleContext = new StubBundleContext();
expect(this.scopeFactory.getBundleScope(eq(this.unscopedBundleContext.getBundle()))).andReturn(this.globalScope).anyTimes();
}
private void setUpUnscopedServiceReference() {
this.unscopedServiceReference = createMock(ServiceReference.class);
expect(this.scopeFactory.getServiceScope(eq(this.unscopedServiceReference))).andReturn(this.globalScope).anyTimes();
}
@After
public void tearDown() {
verify(this.globalScope, this.appScope);
}
@Test
public void testMatchesScopeUnscopedServiceUnscopedApplication() {
setUpUnscopedServiceReference();
setUpUnscopedBundleContext();
replay(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
assertTrue(this.serviceScopingStrategy.isPotentiallyVisible(this.unscopedServiceReference, this.unscopedBundleContext));
verify(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
}
@Test
public void testMatchesScopeScopedServiceScopedApplication() {
setUpScopedServiceReference();
setUpScopedBundleContext();
replay(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
assertTrue(this.serviceScopingStrategy.isPotentiallyVisible(this.scopedServiceReference, this.scopedBundleContext));
verify(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
}
@Test
public void testMatchesScopeScopedServiceUnscopedApplication() {
setUpScopedServiceReference();
setUpUnscopedBundleContext();
replay(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
assertFalse(this.serviceScopingStrategy.isPotentiallyVisible(this.scopedServiceReference, this.unscopedBundleContext));
verify(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
}
@Test
public void testMatchesScopeUnscopedServiceScopedApplication() {
setUpUnscopedServiceReference();
setUpScopedBundleContext();
replay(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
assertTrue(this.serviceScopingStrategy.isPotentiallyVisible(this.unscopedServiceReference, this.scopedBundleContext));
verify(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
}
@Test
public void testScopeReferencesUnscopedServiceUnscopedApplication() throws InvalidSyntaxException {
setUpUnscopedServiceReference();
setUpUnscopedBundleContext();
expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(false).anyTimes();
replay(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
Collection<ServiceReference<?>> references = new ShrinkableSet(this.unscopedServiceReference);
this.serviceScopingStrategy.scopeReferences(references, this.unscopedBundleContext, CLASS_NAME, FILTER);
assertTrue(references.contains(this.unscopedServiceReference));
verify(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
}
@Test
public void testScopeReferencesScopedServiceUnscopedApplication() throws InvalidSyntaxException {
setUpScopedServiceReference();
setUpUnscopedBundleContext();
expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(false).anyTimes();
replay(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
Collection<ServiceReference<?>> references = new ShrinkableSet(this.scopedServiceReference);
this.serviceScopingStrategy.scopeReferences(references, this.unscopedBundleContext, CLASS_NAME, FILTER);
assertFalse(references.contains(this.unscopedServiceReference));
verify(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
}
@Test
public void testScopeReferencesScopedServiceInModelScopedApplication() throws InvalidSyntaxException {
setUpScopedServiceReference();
setUpScopedBundleContext();
expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(true).anyTimes();
replay(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
Collection<ServiceReference<?>> references = new ShrinkableSet(this.scopedServiceReference);
this.serviceScopingStrategy.scopeReferences(references, this.scopedBundleContext, CLASS_NAME, FILTER);
assertTrue(references.contains(this.scopedServiceReference));
verify(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
}
@Test
public void testScopeReferencesScopedServiceNotInModelScopedApplication() throws InvalidSyntaxException {
setUpScopedServiceReference();
setUpScopedBundleContext();
expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(false).anyTimes();
replay(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
Collection<ServiceReference<?>> references = new ShrinkableSet(this.scopedServiceReference);
this.serviceScopingStrategy.scopeReferences(references, this.scopedBundleContext, CLASS_NAME, FILTER);
assertTrue(references.contains(this.scopedServiceReference));
verify(this.scopeFactory, this.scopeServiceRepository, this.scopedServiceReference);
}
@Test
public void testScopeReferencesUnscopedUnshadowedServiceScopedApplication() throws InvalidSyntaxException {
setUpUnscopedServiceReference();
setUpScopedBundleContext();
expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(false).anyTimes();
replay(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
Collection<ServiceReference<?>> references = new ShrinkableSet(this.unscopedServiceReference);
this.serviceScopingStrategy.scopeReferences(references, this.scopedBundleContext, CLASS_NAME, FILTER);
assertTrue(references.contains(this.unscopedServiceReference));
verify(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
}
@Test
public void testScopeReferencesUnscopedShadowedServiceScopedApplication() throws InvalidSyntaxException {
setUpUnscopedServiceReference();
setUpScopedBundleContext();
expect(this.scopeServiceRepository.scopeHasMatchingService(eq(SCOPE_NAME), eq(CLASS_NAME), eq(FILTER))).andReturn(true).anyTimes();
replay(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
Collection<ServiceReference<?>> references = new ShrinkableSet(this.unscopedServiceReference);
this.serviceScopingStrategy.scopeReferences(references, this.scopedBundleContext, CLASS_NAME, FILTER);
assertFalse(references.contains(this.unscopedServiceReference));
verify(this.scopeFactory, this.scopeServiceRepository, this.unscopedServiceReference);
}
/**
* This test uses a collection that does not support addition in order to place the
* same constraints on the implementation as the service registry find hook.
*/
private static final class ShrinkableSet extends HashSet<ServiceReference<?>> {
private static final long serialVersionUID = 1L;
public ShrinkableSet(ServiceReference<?> e) {
super();
super.add(e);
}
@Override
public boolean add(ServiceReference<?> e) {
throw new UnsupportedOperationException();
}
@Override
public boolean addAll(Collection<? extends ServiceReference<?>> c) {
throw new UnsupportedOperationException();
}
}
}