/******************************************************************************* * 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)); } }