blob: 4c19d0a6812ab3a6d098f6a9aec483d83997ef0c [file] [log] [blame]
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -08001package net.floodlightcontroller.linkdiscovery.internal;
2
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -08003import static org.junit.Assert.assertEquals;
4import static org.junit.Assert.assertFalse;
5import static org.junit.Assert.assertTrue;
6
mininet403d5892013-06-05 03:48:17 -07007import java.util.ArrayList;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -08008import java.util.Iterator;
Jonathan Hartc86a2ea2013-01-15 22:39:42 -08009import java.util.List;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080010
Jonathan Hartc86a2ea2013-01-15 22:39:42 -080011import net.floodlightcontroller.core.INetMapStorage.DM_OPERATION;
Jonathan Hart627f10c2013-01-16 14:20:03 -080012import net.floodlightcontroller.core.internal.TestDatabaseManager;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080013import net.floodlightcontroller.linkdiscovery.ILinkStorage;
mininet403d5892013-06-05 03:48:17 -070014import net.floodlightcontroller.linkdiscovery.LinkInfo;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080015import net.floodlightcontroller.routing.Link;
16
mininet37dc5892013-06-04 10:58:44 -070017import org.easymock.EasyMock;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080018import org.junit.After;
19import org.junit.Before;
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -080020import org.junit.Ignore;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080021import org.junit.Test;
mininet37dc5892013-06-04 10:58:44 -070022import org.junit.runner.RunWith;
mininet403d5892013-06-05 03:48:17 -070023import org.openflow.util.HexString;
mininet37dc5892013-06-04 10:58:44 -070024import org.powermock.api.easymock.PowerMock;
25import org.powermock.core.classloader.annotations.PrepareForTest;
26import org.powermock.modules.junit4.PowerMockRunner;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080027
mininet37dc5892013-06-04 10:58:44 -070028import com.thinkaurelius.titan.core.TitanFactory;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080029import com.thinkaurelius.titan.core.TitanGraph;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080030import com.tinkerpop.blueprints.Vertex;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080031import com.tinkerpop.gremlin.java.GremlinPipeline;
32
mininet37dc5892013-06-04 10:58:44 -070033@RunWith(PowerMockRunner.class)
34@PrepareForTest({TitanFactory.class})
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -080035public class LinkStorageImplTest {
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080036 private static ILinkStorage linkStorage;
37 private static TitanGraph titanGraph;
38
mininet37dc5892013-06-04 10:58:44 -070039 //private static IController
40
Jonathan Hartc86a2ea2013-01-15 22:39:42 -080041 //TODO Future ideas:
42 //Test add links with CREATE and UPDATE
43 //Test adding existing link again
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080044
45 @Before
Jonathan Hart627f10c2013-01-16 14:20:03 -080046 public void setUp() throws Exception{
mininet403d5892013-06-05 03:48:17 -070047 TestDatabaseManager.deleteTestDatabase();
48
Jonathan Hart627f10c2013-01-16 14:20:03 -080049 titanGraph = TestDatabaseManager.getTestDatabase();
50 TestDatabaseManager.populateTestData(titanGraph);
mininet37dc5892013-06-04 10:58:44 -070051
mininet403d5892013-06-05 03:48:17 -070052 // replace TitanFactory.open() return value to dummy DB
mininet37dc5892013-06-04 10:58:44 -070053 PowerMock.mockStatic(TitanFactory.class);
54 EasyMock.expect(TitanFactory.open((String)EasyMock.anyObject())).andReturn(titanGraph);
55 PowerMock.replay(TitanFactory.class);
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080056
mininet403d5892013-06-05 03:48:17 -070057 linkStorage = new LinkStorageImpl();
58
59 // initialize with dummy string
mininet37dc5892013-06-04 10:58:44 -070060 linkStorage.init("/dummy/path/to/db");
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080061 }
62
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -080063 @After
mininet403d5892013-06-05 03:48:17 -070064 public void tearDown() throws Exception {
65 // finish code
66 linkStorage.close();
67
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -080068 titanGraph.shutdown();
mininet37dc5892013-06-04 10:58:44 -070069 TestDatabaseManager.deleteTestDatabase();
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080070 }
71
mininet403d5892013-06-05 03:48:17 -070072 // TODO: remove @Ignore after UPDATE method will be implemented
73 @Ignore @Test
74 public void testUpdate_UpdateSingleLink() {
75 Link linkToUpdate= createExistingLink();
76 LinkInfo infoToUpdate = new LinkInfo(
77 System.currentTimeMillis(),
78 System.currentTimeMillis(),
79 System.currentTimeMillis(),
80 0, 0);
81
82 linkStorage.update(linkToUpdate, infoToUpdate, ILinkStorage.DM_OPERATION.UPDATE);
83
84 // TODO: get LinkInfo from titanGraph and verify
85 }
86
87 @Test
88 public void testUpdate_CreateSingleLink() {
89 Link linkToCreate = createFeasibleLink();
90 Link linkToVerify = createFeasibleLink();
91
92 //Use the link storage API to add the link
93 linkStorage.update(linkToCreate, ILinkStorage.DM_OPERATION.CREATE);
94 doTestLinkIsInGraph(linkToVerify);
95
96 // Add same link
97 Link linkToCreateTwice = createFeasibleLink();
98 linkStorage.update(linkToCreateTwice, ILinkStorage.DM_OPERATION.CREATE);
99
100 // this occurs assertion failure if there are two links in titanGraph
101 doTestLinkIsInGraph(linkToVerify);
102 }
103
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800104 /*
105 * Add a link between port 1.102 and 2.104
106 * i.e SEA switch port 3 to LAX switch port 1
107 */
108 @Test
mininet403d5892013-06-05 03:48:17 -0700109 public void testUpdate_InsertSingleLink(){
110 Link linkToInsert = createFeasibleLink();
111 Link linkToVerify = createFeasibleLink();
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800112
113 //Use the link storage API to add the link
mininet403d5892013-06-05 03:48:17 -0700114 linkStorage.update(linkToInsert, ILinkStorage.DM_OPERATION.INSERT);
115
116 doTestLinkIsInGraph(linkToVerify);
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800117
mininet403d5892013-06-05 03:48:17 -0700118 // Add same link
119 Link linkToInsertTwice = createFeasibleLink();
120 linkStorage.update(linkToInsertTwice, ILinkStorage.DM_OPERATION.INSERT);
121
122 // this occurs assertion failure if there are two links in titanGraph
123 doTestLinkIsInGraph(linkToVerify);
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800124 }
125
mininet403d5892013-06-05 03:48:17 -0700126 @Test
127 public void testUpdate_DeleteSingleLink(){
128 Link linkToDelete = createExistingLink();
129 Link linkToVerify = createExistingLink();
130
131 // Test deletion of existing link
132 linkStorage.update(linkToDelete, DM_OPERATION.DELETE);
133 doTestLinkIsNotInGraph(linkToVerify);
134
135 linkToDelete = createFeasibleLink();
136 linkToVerify = createFeasibleLink();
137
138 // Test deletion of not-existing link
139 linkStorage.update(linkToDelete, DM_OPERATION.DELETE);
140 doTestLinkIsNotInGraph(linkToVerify);
141 }
142
143 // TODO: remove @Ignore after UPDATE method will be implemented
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -0800144 @Ignore @Test
mininet403d5892013-06-05 03:48:17 -0700145 public void testUpdate_UpdateLinks(){
146 List<Link> linksToUpdate= createExistingLinks();
147
148 // Who calls this method like this way?
149 linkStorage.update(linksToUpdate, ILinkStorage.DM_OPERATION.UPDATE);
150
151 // TODO: verification of update result
152 }
153
154 @Test
155 public void testUpdate_CreateLinks(){
156 List<Link> linksToCreate = createFeasibleLinks();
157 List<Link> linksToVerify = createFeasibleLinks();
158
159 // Test creation of new links
160 linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
161 for(Link l : linksToVerify) {
162 doTestLinkIsInGraph(l);
163 }
164
165 // Test creation of existing links
166 linksToCreate = createFeasibleLinks();
167 linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
168 for(Link l : linksToVerify) {
169 doTestLinkIsInGraph(l);
170 }
171 }
172
173 @Test
174 public void testUpdate_CreateLinksMixuture(){
175 List<Link> linksToCreate = new ArrayList<Link>();
176 linksToCreate.add(createFeasibleLink());
177 linksToCreate.add(createExistingLink());
178
179 // Test creation of mixture of new/existing links
180 linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
181 doTestLinkIsInGraph(createFeasibleLink());
182 doTestLinkIsInGraph(createExistingLink());
183 }
184
185 @Test
186 public void testUpdate_InsertLinks(){
187 List<Link> linksToInsert = createFeasibleLinks();
188 List<Link> linksToVerify = createFeasibleLinks();
189
190 // Test insertion of new links
191 linkStorage.update(linksToInsert, ILinkStorage.DM_OPERATION.INSERT);
192 for(Link l : linksToVerify) {
193 doTestLinkIsInGraph(l);
194 }
195
196 // Test insertion of existing links
197 linksToInsert = createFeasibleLinks();
198 linkStorage.update(linksToInsert, ILinkStorage.DM_OPERATION.INSERT);
199 for(Link l : linksToVerify) {
200 doTestLinkIsInGraph(l);
201 }
202 }
203
204 @Test
205 public void testUpdate_InsertLinksMixuture(){
206 List<Link> linksToInsert = new ArrayList<Link>();
207 linksToInsert.add(createFeasibleLink());
208 linksToInsert.add(createExistingLink());
209
210 // Test insertion of mixture of new/existing links
211 linkStorage.update(linksToInsert, ILinkStorage.DM_OPERATION.INSERT);
212 doTestLinkIsInGraph(createFeasibleLink());
213 doTestLinkIsInGraph(createExistingLink());
214 }
215
216
217 @Test
218 public void testUpdate_DeleteLinks(){
219 List<Link> linksToDelete = createExistingLinks();
220 List<Link> linksToVerify = createExistingLinks();
221
222 // Test deletion of existing links
223 linkStorage.update(linksToDelete, ILinkStorage.DM_OPERATION.DELETE);
224 for(Link l : linksToVerify) {
225 doTestLinkIsNotInGraph(l);
226 }
227
228 // Test deletion of not-existing links
229 linksToDelete = createExistingLinks();
230 linkStorage.update(linksToDelete, ILinkStorage.DM_OPERATION.DELETE);
231 for(Link l : linksToVerify) {
232 doTestLinkIsNotInGraph(l);
233 }
234 }
235
236 @Test
237 public void testUpdate_DeleteLinksMixuture(){
238 List<Link> linksToDelete = new ArrayList<Link>();
239 linksToDelete.add(createFeasibleLink());
240 linksToDelete.add(createExistingLink());
241
242 // Test deletion of mixture of new/existing links
243 linkStorage.update(linksToDelete, ILinkStorage.DM_OPERATION.DELETE);
244 doTestLinkIsNotInGraph(createFeasibleLink());
245 doTestLinkIsNotInGraph(createExistingLink());
246 }
247
248 @Test
249 public void testAddOrUpdateLink() {
250 Link linkToDelete = createExistingLink();
251
252 }
253
254 @Test
255 public void testUpdateInsertMultipleLinks() {
256 List<Link> linksToAdd = createFeasibleLinks();
257 List<Link> linksToVerify = createFeasibleLinks();
258
259 linkStorage.update(linksToAdd, ILinkStorage.DM_OPERATION.INSERT);
260
261 for(Link l : linksToVerify) {
262 doTestLinkIsInGraph(l);
263 }
264 }
265
266 @Test
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800267 public void testGetLinks(){
mininet403d5892013-06-05 03:48:17 -0700268 Link linkToVerify = createExistingLink();
269
270 List<Link> list = linkStorage.getLinks(linkToVerify.getSrc(), (short)linkToVerify.getSrcPort());
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800271
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800272 assertEquals(list.size(), 1);
273
274 Link l = list.get(0);
mininet403d5892013-06-05 03:48:17 -0700275 assertEquals(l.getSrc(), linkToVerify.getSrc());
276 assertEquals(l.getSrcPort(), linkToVerify.getSrcPort());
277 assertEquals(l.getDst(), linkToVerify.getDst());
278 assertEquals(l.getDstPort(), linkToVerify.getDstPort());
279
280 Link linkToVerifyNot = createFeasibleLink();
281
282 List<Link> list2 = linkStorage.getLinks(linkToVerifyNot.getSrc(), (short)linkToVerifyNot.getSrcPort());
283
284 assertEquals(list2.size(), 0);
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800285 }
286
mininet403d5892013-06-05 03:48:17 -0700287 @Test
288 public void testGetLinksByDpid() {
289 Link linkToVeryfy = createExistingLink();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800290
mininet403d5892013-06-05 03:48:17 -0700291 List<Link> links = linkStorage.getLinks(HexString.toHexString(linkToVeryfy.getSrc()));
292 assertTrue(links.contains(linkToVeryfy));
293
294 Link linkToVerifyNot = createFeasibleLink();
295 assertFalse(links.contains(linkToVerifyNot));
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800296 }
297
mininet403d5892013-06-05 03:48:17 -0700298 @Test
299 public void testDeleteLink() {
300 // Deletion of existing link
301 Link linkToDelete = createExistingLink();
302 Link linkToVerify = createExistingLink();
303
304 linkStorage.deleteLink(linkToDelete);
305 doTestLinkIsNotInGraph(linkToVerify);
306
307 // Deletion of not existing link
308 linkToDelete = createFeasibleLink();
309 linkToVerify = createFeasibleLink();
310
311 linkStorage.deleteLink(linkToDelete);
312 doTestLinkIsNotInGraph(linkToVerify);
313 }
314
315 @Test
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800316 public void testDeleteLinks(){
mininet403d5892013-06-05 03:48:17 -0700317 List<Link> linksToDelete = createExistingLinks();
318 List<Link> linksToVerify = createExistingLinks();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800319
mininet403d5892013-06-05 03:48:17 -0700320 linkStorage.deleteLinks(linksToDelete);
321 for(Link l : linksToVerify) {
322 doTestLinkIsNotInGraph(l);
323 }
324 }
325
326 @Test
327 public void testGetActiveLinks() {
328 Link existingLink = createExistingLink();
329 Link notExistingLink = createFeasibleLink();
330
331 List<Link> links = linkStorage.getActiveLinks();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800332
mininet403d5892013-06-05 03:48:17 -0700333 assertTrue(links.contains(existingLink));
334 assertFalse(links.contains(notExistingLink));
335 }
336
337 @Test
338 public void testDeleteLinksOnPort() {
339 Link linkToDelete = createExistingLink();
340 Link linkToVerify = createExistingLink();
341
342 linkStorage.deleteLinksOnPort(linkToDelete.getSrc(), linkToDelete.getSrcPort());
343
344 doTestLinkIsNotInGraph(linkToVerify);
345 }
346
347 /**
348 * Test if titanGraph has specific link (no more than one link)
349 * @param link
350 */
351 private void doTestLinkIsInGraph(Link link) {
352 String src_dpid = HexString.toHexString(link.getSrc());
353 String dst_dpid = HexString.toHexString(link.getDst());
354 short src_port = link.getSrcPort();
355 short dst_port = link.getDstPort();
356
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800357 GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
mininet403d5892013-06-05 03:48:17 -0700358 Iterator<Vertex> it = titanGraph.getVertices("dpid", src_dpid).iterator();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800359
360 assertTrue(it.hasNext());
mininet403d5892013-06-05 03:48:17 -0700361 Vertex sw = it.next();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800362 assertFalse(it.hasNext());
363
mininet403d5892013-06-05 03:48:17 -0700364 pipe.start(sw).out("on").has("number", src_port).out("link").has("number", dst_port).in("on").has("dpid", dst_dpid);
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800365
mininet403d5892013-06-05 03:48:17 -0700366 assertTrue(pipe.hasNext());
367 pipe.next();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800368 assertFalse(pipe.hasNext());
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800369 }
370
mininet403d5892013-06-05 03:48:17 -0700371 /**
372 * Test if titanGraph doesn't have specific link
373 * @param link
374 */
375 private void doTestLinkIsNotInGraph(Link link) {
376 String src_dpid = HexString.toHexString(link.getSrc());
377 String dst_dpid = HexString.toHexString(link.getDst());
378 short src_port = link.getSrcPort();
379 short dst_port = link.getDstPort();
380
381 GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
382 Iterator<Vertex> it = titanGraph.getVertices("dpid", src_dpid).iterator();
383
384 assertTrue(it.hasNext());
385 Vertex sw = it.next();
386 assertFalse(it.hasNext());
387
388 pipe.start(sw).out("on").has("number", src_port).out("link").has("number", dst_port).in("on").has("dpid", dst_dpid);
389
390 assertFalse(pipe.hasNext());
391 }
392
393 //----------------- Creation of test data -----------------------
394 private Link createExistingLink() {
395 return new Link(Long.decode("0x0000000000000a01"), 2, Long.decode("0x0000000000000a03"), 1);
396 }
397
398 private Link createFeasibleLink() {
399 return new Link(Long.decode("0x0000000000000a01"), 4, Long.decode("0x0000000000000a02"), 1);
400 }
401
402 // make NO sense while test-network data doesn't define physical network
403 @SuppressWarnings("unused")
404 private Link createInfeasibleLink() {
405 return new Link(Long.decode("0x0000000000000a01"), 1, Long.decode("0x0000000000000a02"), 1);
406 }
407
408 private List<Link> createExistingLinks() {
409 List<Link> links = new ArrayList<Link>();
410 links.add(new Link(Long.decode("0x0000000000000a01"), 2, Long.decode("0x0000000000000a03"), 1));
411 links.add(new Link(Long.decode("0x0000000000000a02"), 1, Long.decode("0x0000000000000a01"), 3));
412 return links;
413 }
414
415 private List<Link> createFeasibleLinks() {
416 List<Link> links = new ArrayList<Link>();
417 links.add(new Link(Long.decode("0x0000000000000a03"), 4, Long.decode("0x0000000000000a05"), 3));
418 links.add(new Link(Long.decode("0x0000000000000a01"), 4, Long.decode("0x0000000000000a02"), 1));
419 return links;
420 }
421 //---------------------------------------------------------------
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800422}