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