blob: 3748ad10ea5e1b398a853b1c0495a0bb9c6a744f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2013 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.equinox.region.internal.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.HashSet;
import java.util.Iterator;
import org.easymock.EasyMock;
import org.eclipse.equinox.region.*;
import org.eclipse.equinox.region.RegionDigraph.FilteredRegion;
import org.junit.*;
import org.osgi.framework.*;
public class BundleIdBasedRegionTests {
private static final String OTHER_REGION_NAME = "other";
private static final String BUNDLE_SYMBOLIC_NAME = "b";
private static final String BUNDLE_SYMBOLIC_NAME_2 = "c";
private static final Version BUNDLE_VERSION = new Version("1");
private static final long BUNDLE_ID = 1L;
private static final long BUNDLE_ID_2 = 2L;
private static final String REGION_NAME = "reg";
private static final long TEST_BUNDLE_ID = 99L;
private Bundle mockBundle;
private RegionDigraph mockGraph;
private Iterator<Region> regionIterator;
private BundleContext mockBundleContext;
Region mockRegion;
Region mockRegion2;
RegionFilter mockRegionFilter;
private ThreadLocal<Region> threadLocal;
private Object bundleIdToRegionMapping;
@Before
public void setUp() throws Exception {
this.threadLocal = new ThreadLocal<Region>();
this.mockBundle = EasyMock.createMock(Bundle.class);
EasyMock.expect(this.mockBundle.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME).anyTimes();
EasyMock.expect(this.mockBundle.getVersion()).andReturn(BUNDLE_VERSION).anyTimes();
EasyMock.expect(this.mockBundle.getBundleId()).andReturn(BUNDLE_ID).anyTimes();
this.mockBundleContext = EasyMock.createMock(BundleContext.class);
EasyMock.expect(this.mockBundleContext.getBundle(BUNDLE_ID)).andReturn(this.mockBundle).anyTimes();
this.mockRegion = EasyMock.createMock(Region.class);
this.mockRegion2 = EasyMock.createMock(Region.class);
this.mockRegionFilter = EasyMock.createMock(RegionFilter.class);
this.regionIterator = new Iterator<Region>() {
@Override
public boolean hasNext() {
return false;
}
@Override
public Region next() {
return null;
}
@Override
public void remove() {
// nothing
}
};
this.mockGraph = EasyMock.createMock(RegionDigraph.class);
this.mockGraph.connect(EasyMock.isA(Region.class), EasyMock.eq(this.mockRegionFilter), EasyMock.eq(this.mockRegion));
EasyMock.expectLastCall().anyTimes();
this.bundleIdToRegionMapping = RegionReflectionUtils.newStandardBundleIdToRegionMapping();
}
private void replayMocks() {
EasyMock.replay(this.mockBundleContext, this.mockBundle, this.mockRegion, this.mockRegion2, this.mockRegionFilter, this.mockGraph);
}
@After
public void tearDown() throws Exception {
EasyMock.verify(this.mockBundleContext, this.mockBundle, this.mockRegion, this.mockRegion2, this.mockRegionFilter, this.mockGraph);
}
@Test
public void testGetName() {
defaultSetUp();
Region r = createDefaultBundleIdBasedRegion();
assertEquals(REGION_NAME, r.getName());
}
private Region createDefaultBundleIdBasedRegion() {
return createBundleIdBasedRegion(REGION_NAME);
}
private Region createBundleIdBasedRegion(String regionName) {
return RegionReflectionUtils.newBundleIdBasedRegion(regionName, this.mockGraph, this.bundleIdToRegionMapping, this.mockBundleContext, this.threadLocal);
}
private void defaultSetUp() {
EasyMock.expect(this.mockGraph.iterator()).andReturn(this.regionIterator).anyTimes();
EasyMock.expect(this.mockGraph.getEdges(EasyMock.isA(Region.class))).andReturn(new HashSet<FilteredRegion>()).anyTimes();
replayMocks();
}
@Test
public void testAddBundle() throws BundleException {
EasyMock.expect(this.mockGraph.iterator()).andReturn(this.regionIterator).anyTimes();
HashSet<FilteredRegion> edges = new HashSet<FilteredRegion>();
edges.add(new FilteredRegion() {
@Override
public Region getRegion() {
// TODO Auto-generated method stub
return null;
}
@Override
public RegionFilter getFilter() {
return mockRegionFilter;
}
});
EasyMock.expect(this.mockGraph.getEdges(EasyMock.isA(Region.class))).andReturn(edges).anyTimes();
replayMocks();
Region r = createDefaultBundleIdBasedRegion();
r.addBundle(this.mockBundle);
}
@Test
public void testAddExistingBundle() throws BundleException {
defaultSetUp();
Region r = createDefaultBundleIdBasedRegion();
r.addBundle(this.mockBundle);
r.addBundle(this.mockBundle);
}
// This restriction was removed, so no exception should be thrown.
public void testAddConflictingBundle() throws BundleException {
defaultSetUp();
Bundle mockBundle2 = EasyMock.createMock(Bundle.class);
EasyMock.expect(mockBundle2.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME).anyTimes();
EasyMock.expect(mockBundle2.getVersion()).andReturn(BUNDLE_VERSION).anyTimes();
EasyMock.expect(mockBundle2.getBundleId()).andReturn(BUNDLE_ID_2).anyTimes();
EasyMock.replay(mockBundle2);
Region r = createDefaultBundleIdBasedRegion();
r.addBundle(this.mockBundle);
r.addBundle(mockBundle2);
}
@Test(expected = BundleException.class)
public void testAddBundlePresentInAnotherRegion1() throws BundleException {
Region r = regionForBundlePersentInAnotherRegionTest();
r.addBundle(this.mockBundle);
}
@Test(expected = BundleException.class)
public void testAddBundlePresentInAnotherRegion2() throws BundleException {
Region r = regionForBundlePersentInAnotherRegionTest();
r.addBundle(this.mockBundle.getBundleId());
}
private Region regionForBundlePersentInAnotherRegionTest() throws BundleException {
this.regionIterator = new Iterator<Region>() {
private int next = 2;
@Override
public boolean hasNext() {
return this.next > 0;
}
@Override
public Region next() {
switch (next--) {
case 2 :
return mockRegion;
default :
return mockRegion2;
}
}
@Override
public void remove() {
// nothing
}
};
EasyMock.expect(this.mockGraph.iterator()).andReturn(this.regionIterator).anyTimes();
EasyMock.expect(this.mockGraph.getEdges(EasyMock.isA(Region.class))).andReturn(new HashSet<FilteredRegion>()).anyTimes();
EasyMock.expect(this.mockRegion.contains(EasyMock.eq(BUNDLE_ID))).andReturn(true).anyTimes();
EasyMock.expect(this.mockRegion2.contains(EasyMock.eq(BUNDLE_ID))).andReturn(false).anyTimes();
RegionReflectionUtils.associateBundleWithRegion(this.bundleIdToRegionMapping, BUNDLE_ID, mockRegion);
replayMocks();
Region r = createDefaultBundleIdBasedRegion();
return r;
}
@Test
public void testInstallBundleStringInputStream() {
defaultSetUp();
// TODO
}
@Test
public void testInstallBundleString() {
defaultSetUp();
// TODO
}
@Test
public void testContains() throws BundleException {
defaultSetUp();
Region r = createDefaultBundleIdBasedRegion();
r.addBundle(this.mockBundle);
assertTrue(r.contains(this.mockBundle));
}
@Test
public void testDoesNotContain() {
defaultSetUp();
Region r = createDefaultBundleIdBasedRegion();
assertFalse(r.contains(this.mockBundle));
}
@Test
public void testGetBundle() throws BundleException {
defaultSetUp();
Region r = createDefaultBundleIdBasedRegion();
r.addBundle(this.mockBundle);
assertEquals(this.mockBundle, r.getBundle(BUNDLE_SYMBOLIC_NAME, BUNDLE_VERSION));
}
@Test
public void testGetBundleNotFound() throws BundleException {
defaultSetUp();
Region r = createDefaultBundleIdBasedRegion();
r.addBundle(this.mockBundle);
assertNull(r.getBundle(BUNDLE_SYMBOLIC_NAME_2, BUNDLE_VERSION));
}
@Test
public void testConnectRegion() throws BundleException {
defaultSetUp();
Region r = createDefaultBundleIdBasedRegion();
r.connectRegion(this.mockRegion, this.mockRegionFilter);
}
@Test
public void testEquals() {
defaultSetUp();
Region r = createDefaultBundleIdBasedRegion();
Region s = createDefaultBundleIdBasedRegion();
assertEquals(r, r);
assertEquals(r, s);
assertEquals(r.hashCode(), s.hashCode());
}
@Test
public void testNotEqual() {
defaultSetUp();
Region r = createDefaultBundleIdBasedRegion();
Region s = createBundleIdBasedRegion(OTHER_REGION_NAME);
assertFalse(r.equals(s));
assertFalse(r.equals(null));
}
@Test
public void testAddRemoveBundleId() throws BundleException {
defaultSetUp();
Region r = createDefaultBundleIdBasedRegion();
r.addBundle(TEST_BUNDLE_ID);
assertTrue(r.contains(TEST_BUNDLE_ID));
r.removeBundle(TEST_BUNDLE_ID);
assertFalse(r.contains(TEST_BUNDLE_ID));
}
}