1 /******************************************************************************* 2 * Copyright (c) 2011, 2013 VMware Inc. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * VMware Inc. - initial contribution 13 *******************************************************************************/ 14 15 package org.eclipse.equinox.region.internal.tests; 16 17 import static org.junit.Assert.assertEquals; 18 import static org.junit.Assert.assertFalse; 19 import static org.junit.Assert.assertNull; 20 import static org.junit.Assert.assertTrue; 21 22 import java.util.HashSet; 23 import java.util.Iterator; 24 import org.easymock.EasyMock; 25 import org.eclipse.equinox.region.*; 26 import org.eclipse.equinox.region.RegionDigraph.FilteredRegion; 27 import org.junit.*; 28 import org.osgi.framework.*; 29 30 public class BundleIdBasedRegionTests { 31 32 private static final String OTHER_REGION_NAME = "other"; 33 34 private static final String BUNDLE_SYMBOLIC_NAME = "b"; 35 36 private static final String BUNDLE_SYMBOLIC_NAME_2 = "c"; 37 38 private static final Version BUNDLE_VERSION = new Version("1"); 39 40 private static final long BUNDLE_ID = 1L; 41 42 private static final long BUNDLE_ID_2 = 2L; 43 44 private static final String REGION_NAME = "reg"; 45 46 private static final long TEST_BUNDLE_ID = 99L; 47 48 private Bundle mockBundle; 49 50 private RegionDigraph mockGraph; 51 52 private Iterator<Region> regionIterator; 53 54 private BundleContext mockBundleContext; 55 56 Region mockRegion; 57 58 Region mockRegion2; 59 60 RegionFilter mockRegionFilter; 61 62 private ThreadLocal<Region> threadLocal; 63 64 private Object bundleIdToRegionMapping; 65 66 @Before setUp()67 public void setUp() throws Exception { 68 this.threadLocal = new ThreadLocal<Region>(); 69 this.mockBundle = EasyMock.createMock(Bundle.class); 70 EasyMock.expect(this.mockBundle.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME).anyTimes(); 71 EasyMock.expect(this.mockBundle.getVersion()).andReturn(BUNDLE_VERSION).anyTimes(); 72 EasyMock.expect(this.mockBundle.getBundleId()).andReturn(BUNDLE_ID).anyTimes(); 73 74 this.mockBundleContext = EasyMock.createMock(BundleContext.class); 75 EasyMock.expect(this.mockBundleContext.getBundle(BUNDLE_ID)).andReturn(this.mockBundle).anyTimes(); 76 77 this.mockRegion = EasyMock.createMock(Region.class); 78 this.mockRegion2 = EasyMock.createMock(Region.class); 79 80 this.mockRegionFilter = EasyMock.createMock(RegionFilter.class); 81 82 this.regionIterator = new Iterator<Region>() { 83 84 @Override 85 public boolean hasNext() { 86 return false; 87 } 88 89 @Override 90 public Region next() { 91 return null; 92 } 93 94 @Override 95 public void remove() { 96 // nothing 97 } 98 }; 99 this.mockGraph = EasyMock.createMock(RegionDigraph.class); 100 this.mockGraph.connect(EasyMock.isA(Region.class), EasyMock.eq(this.mockRegionFilter), EasyMock.eq(this.mockRegion)); 101 EasyMock.expectLastCall().anyTimes(); 102 this.bundleIdToRegionMapping = RegionReflectionUtils.newStandardBundleIdToRegionMapping(); 103 } 104 replayMocks()105 private void replayMocks() { 106 EasyMock.replay(this.mockBundleContext, this.mockBundle, this.mockRegion, this.mockRegion2, this.mockRegionFilter, this.mockGraph); 107 } 108 109 @After tearDown()110 public void tearDown() throws Exception { 111 EasyMock.verify(this.mockBundleContext, this.mockBundle, this.mockRegion, this.mockRegion2, this.mockRegionFilter, this.mockGraph); 112 } 113 114 @Test testGetName()115 public void testGetName() { 116 defaultSetUp(); 117 118 Region r = createDefaultBundleIdBasedRegion(); 119 assertEquals(REGION_NAME, r.getName()); 120 } 121 createDefaultBundleIdBasedRegion()122 private Region createDefaultBundleIdBasedRegion() { 123 return createBundleIdBasedRegion(REGION_NAME); 124 } 125 createBundleIdBasedRegion(String regionName)126 private Region createBundleIdBasedRegion(String regionName) { 127 return RegionReflectionUtils.newBundleIdBasedRegion(regionName, this.mockGraph, this.bundleIdToRegionMapping, this.mockBundleContext, this.threadLocal); 128 } 129 defaultSetUp()130 private void defaultSetUp() { 131 EasyMock.expect(this.mockGraph.iterator()).andReturn(this.regionIterator).anyTimes(); 132 EasyMock.expect(this.mockGraph.getEdges(EasyMock.isA(Region.class))).andReturn(new HashSet<FilteredRegion>()).anyTimes(); 133 replayMocks(); 134 } 135 136 @Test testAddBundle()137 public void testAddBundle() throws BundleException { 138 EasyMock.expect(this.mockGraph.iterator()).andReturn(this.regionIterator).anyTimes(); 139 140 HashSet<FilteredRegion> edges = new HashSet<FilteredRegion>(); 141 edges.add(new FilteredRegion() { 142 143 @Override 144 public Region getRegion() { 145 // TODO Auto-generated method stub 146 return null; 147 } 148 149 @Override 150 public RegionFilter getFilter() { 151 return mockRegionFilter; 152 } 153 }); 154 EasyMock.expect(this.mockGraph.getEdges(EasyMock.isA(Region.class))).andReturn(edges).anyTimes(); 155 replayMocks(); 156 157 Region r = createDefaultBundleIdBasedRegion(); 158 r.addBundle(this.mockBundle); 159 } 160 161 @Test testAddExistingBundle()162 public void testAddExistingBundle() throws BundleException { 163 defaultSetUp(); 164 165 Region r = createDefaultBundleIdBasedRegion(); 166 r.addBundle(this.mockBundle); 167 r.addBundle(this.mockBundle); 168 } 169 170 // This restriction was removed, so no exception should be thrown. testAddConflictingBundle()171 public void testAddConflictingBundle() throws BundleException { 172 defaultSetUp(); 173 174 Bundle mockBundle2 = EasyMock.createMock(Bundle.class); 175 EasyMock.expect(mockBundle2.getSymbolicName()).andReturn(BUNDLE_SYMBOLIC_NAME).anyTimes(); 176 EasyMock.expect(mockBundle2.getVersion()).andReturn(BUNDLE_VERSION).anyTimes(); 177 EasyMock.expect(mockBundle2.getBundleId()).andReturn(BUNDLE_ID_2).anyTimes(); 178 EasyMock.replay(mockBundle2); 179 180 Region r = createDefaultBundleIdBasedRegion(); 181 r.addBundle(this.mockBundle); 182 r.addBundle(mockBundle2); 183 } 184 185 @Test(expected = BundleException.class) testAddBundlePresentInAnotherRegion1()186 public void testAddBundlePresentInAnotherRegion1() throws BundleException { 187 Region r = regionForBundlePersentInAnotherRegionTest(); 188 r.addBundle(this.mockBundle); 189 } 190 191 @Test(expected = BundleException.class) testAddBundlePresentInAnotherRegion2()192 public void testAddBundlePresentInAnotherRegion2() throws BundleException { 193 Region r = regionForBundlePersentInAnotherRegionTest(); 194 r.addBundle(this.mockBundle.getBundleId()); 195 } 196 regionForBundlePersentInAnotherRegionTest()197 private Region regionForBundlePersentInAnotherRegionTest() throws BundleException { 198 this.regionIterator = new Iterator<Region>() { 199 200 private int next = 2; 201 202 @Override 203 public boolean hasNext() { 204 return this.next > 0; 205 } 206 207 @Override 208 public Region next() { 209 switch (next--) { 210 case 2 : 211 return mockRegion; 212 default : 213 return mockRegion2; 214 } 215 } 216 217 @Override 218 public void remove() { 219 // nothing 220 } 221 }; 222 EasyMock.expect(this.mockGraph.iterator()).andReturn(this.regionIterator).anyTimes(); 223 EasyMock.expect(this.mockGraph.getEdges(EasyMock.isA(Region.class))).andReturn(new HashSet<FilteredRegion>()).anyTimes(); 224 EasyMock.expect(this.mockRegion.contains(EasyMock.eq(BUNDLE_ID))).andReturn(true).anyTimes(); 225 EasyMock.expect(this.mockRegion2.contains(EasyMock.eq(BUNDLE_ID))).andReturn(false).anyTimes(); 226 RegionReflectionUtils.associateBundleWithRegion(this.bundleIdToRegionMapping, BUNDLE_ID, mockRegion); 227 228 replayMocks(); 229 230 Region r = createDefaultBundleIdBasedRegion(); 231 return r; 232 } 233 234 @Test testInstallBundleStringInputStream()235 public void testInstallBundleStringInputStream() { 236 defaultSetUp(); 237 238 // TODO 239 } 240 241 @Test testInstallBundleString()242 public void testInstallBundleString() { 243 defaultSetUp(); 244 245 // TODO 246 } 247 248 @Test testContains()249 public void testContains() throws BundleException { 250 defaultSetUp(); 251 252 Region r = createDefaultBundleIdBasedRegion(); 253 r.addBundle(this.mockBundle); 254 assertTrue(r.contains(this.mockBundle)); 255 } 256 257 @Test testDoesNotContain()258 public void testDoesNotContain() { 259 defaultSetUp(); 260 261 Region r = createDefaultBundleIdBasedRegion(); 262 assertFalse(r.contains(this.mockBundle)); 263 } 264 265 @Test testGetBundle()266 public void testGetBundle() throws BundleException { 267 defaultSetUp(); 268 269 Region r = createDefaultBundleIdBasedRegion(); 270 r.addBundle(this.mockBundle); 271 assertEquals(this.mockBundle, r.getBundle(BUNDLE_SYMBOLIC_NAME, BUNDLE_VERSION)); 272 } 273 274 @Test testGetBundleNotFound()275 public void testGetBundleNotFound() throws BundleException { 276 defaultSetUp(); 277 278 Region r = createDefaultBundleIdBasedRegion(); 279 r.addBundle(this.mockBundle); 280 assertNull(r.getBundle(BUNDLE_SYMBOLIC_NAME_2, BUNDLE_VERSION)); 281 } 282 283 @Test testConnectRegion()284 public void testConnectRegion() throws BundleException { 285 defaultSetUp(); 286 287 Region r = createDefaultBundleIdBasedRegion(); 288 r.connectRegion(this.mockRegion, this.mockRegionFilter); 289 } 290 291 @Test testEquals()292 public void testEquals() { 293 defaultSetUp(); 294 295 Region r = createDefaultBundleIdBasedRegion(); 296 Region s = createDefaultBundleIdBasedRegion(); 297 assertEquals(r, r); 298 assertEquals(r, s); 299 assertEquals(r.hashCode(), s.hashCode()); 300 } 301 302 @Test testNotEqual()303 public void testNotEqual() { 304 defaultSetUp(); 305 306 Region r = createDefaultBundleIdBasedRegion(); 307 Region s = createBundleIdBasedRegion(OTHER_REGION_NAME); 308 assertFalse(r.equals(s)); 309 assertFalse(r.equals(null)); 310 } 311 312 @Test testAddRemoveBundleId()313 public void testAddRemoveBundleId() throws BundleException { 314 defaultSetUp(); 315 Region r = createDefaultBundleIdBasedRegion(); 316 r.addBundle(TEST_BUNDLE_ID); 317 assertTrue(r.contains(TEST_BUNDLE_ID)); 318 r.removeBundle(TEST_BUNDLE_ID); 319 assertFalse(r.contains(TEST_BUNDLE_ID)); 320 321 } 322 323 } 324