blob: 6f62f76d0160dfe17d7b4425f2d794b92c9f3719 [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;
Naoki Shiotacae568a2013-06-05 17:53:41 -070010import java.util.Set;
11
12import junit.framework.Assert;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080013
Jonathan Hartc86a2ea2013-01-15 22:39:42 -080014import net.floodlightcontroller.core.INetMapStorage.DM_OPERATION;
Jonathan Hart627f10c2013-01-16 14:20:03 -080015import net.floodlightcontroller.core.internal.TestDatabaseManager;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080016import net.floodlightcontroller.linkdiscovery.ILinkStorage;
mininet403d5892013-06-05 03:48:17 -070017import net.floodlightcontroller.linkdiscovery.LinkInfo;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080018import net.floodlightcontroller.routing.Link;
19
mininet37dc5892013-06-04 10:58:44 -070020import org.easymock.EasyMock;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080021import org.junit.After;
22import org.junit.Before;
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -080023import org.junit.Ignore;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080024import org.junit.Test;
mininet37dc5892013-06-04 10:58:44 -070025import org.junit.runner.RunWith;
Naoki Shiotacae568a2013-06-05 17:53:41 -070026import org.openflow.protocol.OFPhysicalPort;
27import org.openflow.protocol.OFPhysicalPort.OFPortState;
mininet403d5892013-06-05 03:48:17 -070028import org.openflow.util.HexString;
mininet37dc5892013-06-04 10:58:44 -070029import org.powermock.api.easymock.PowerMock;
30import org.powermock.core.classloader.annotations.PrepareForTest;
31import org.powermock.modules.junit4.PowerMockRunner;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080032
mininet37dc5892013-06-04 10:58:44 -070033import com.thinkaurelius.titan.core.TitanFactory;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080034import com.thinkaurelius.titan.core.TitanGraph;
Naoki Shiotacae568a2013-06-05 17:53:41 -070035import com.tinkerpop.blueprints.Direction;
36import com.tinkerpop.blueprints.Edge;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080037import com.tinkerpop.blueprints.Vertex;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080038import com.tinkerpop.gremlin.java.GremlinPipeline;
Naoki Shiotacae568a2013-06-05 17:53:41 -070039import com.tinkerpop.pipes.PipeFunction;
40import com.tinkerpop.pipes.transform.PathPipe;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080041
mininet37dc5892013-06-04 10:58:44 -070042@RunWith(PowerMockRunner.class)
43@PrepareForTest({TitanFactory.class})
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -080044public class LinkStorageImplTest {
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080045 private static ILinkStorage linkStorage;
46 private static TitanGraph titanGraph;
47
mininet37dc5892013-06-04 10:58:44 -070048 //private static IController
49
mininet9d203de2013-06-05 08:40:45 -070050 /**
51 * Setup code called before each tests.
52 * Read test graph data and replace DB access by test graph data.
53 * @throws Exception
54 */
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080055 @Before
Jonathan Hart627f10c2013-01-16 14:20:03 -080056 public void setUp() throws Exception{
mininet403d5892013-06-05 03:48:17 -070057 TestDatabaseManager.deleteTestDatabase();
58
Jonathan Hart627f10c2013-01-16 14:20:03 -080059 titanGraph = TestDatabaseManager.getTestDatabase();
60 TestDatabaseManager.populateTestData(titanGraph);
mininet37dc5892013-06-04 10:58:44 -070061
mininet9d203de2013-06-05 08:40:45 -070062 // replace return value of TitanFactory.open() to dummy DB created above
mininet37dc5892013-06-04 10:58:44 -070063 PowerMock.mockStatic(TitanFactory.class);
64 EasyMock.expect(TitanFactory.open((String)EasyMock.anyObject())).andReturn(titanGraph);
65 PowerMock.replay(TitanFactory.class);
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080066
mininet403d5892013-06-05 03:48:17 -070067 linkStorage = new LinkStorageImpl();
68
69 // initialize with dummy string
mininet37dc5892013-06-04 10:58:44 -070070 linkStorage.init("/dummy/path/to/db");
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080071 }
72
mininet9d203de2013-06-05 08:40:45 -070073 /**
74 * Closing code called after each tests.
75 * Discard test graph data.
76 * @throws Exception
77 */
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -080078 @After
mininet403d5892013-06-05 03:48:17 -070079 public void tearDown() throws Exception {
80 // finish code
81 linkStorage.close();
82
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -080083 titanGraph.shutdown();
mininet37dc5892013-06-04 10:58:44 -070084 TestDatabaseManager.deleteTestDatabase();
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080085 }
86
Naoki Shiotacae568a2013-06-05 17:53:41 -070087 // TODO: remove @Ignore after UPDATE method is implemented
Naoki Shiota1b972862013-06-05 19:49:09 -070088 /**
89 * Test if update() can correctly updates LinkInfo for a Link.
90 */
mininet403d5892013-06-05 03:48:17 -070091 @Ignore @Test
92 public void testUpdate_UpdateSingleLink() {
93 Link linkToUpdate= createExistingLink();
Naoki Shiotacae568a2013-06-05 17:53:41 -070094 long currentTime = System.currentTimeMillis();
95 LinkInfo infoToUpdate = createFeasibleLinkInfo(currentTime);
96 LinkInfo infoToVerify = createFeasibleLinkInfo(currentTime);
mininet403d5892013-06-05 03:48:17 -070097
98 linkStorage.update(linkToUpdate, infoToUpdate, ILinkStorage.DM_OPERATION.UPDATE);
99
Naoki Shiotacae568a2013-06-05 17:53:41 -0700100 doTestLinkHasStateOf(linkToUpdate, infoToVerify);
mininet403d5892013-06-05 03:48:17 -0700101 }
102
Naoki Shiota1b972862013-06-05 19:49:09 -0700103 /**
104 * Test if update() can correctly creates a Link.
105 */
mininet403d5892013-06-05 03:48:17 -0700106 @Test
107 public void testUpdate_CreateSingleLink() {
108 Link linkToCreate = createFeasibleLink();
109 Link linkToVerify = createFeasibleLink();
110
111 //Use the link storage API to add the link
112 linkStorage.update(linkToCreate, ILinkStorage.DM_OPERATION.CREATE);
113 doTestLinkIsInGraph(linkToVerify);
114
115 // Add same link
116 Link linkToCreateTwice = createFeasibleLink();
117 linkStorage.update(linkToCreateTwice, ILinkStorage.DM_OPERATION.CREATE);
118
119 // this occurs assertion failure if there are two links in titanGraph
120 doTestLinkIsInGraph(linkToVerify);
121 }
122
Naoki Shiota1b972862013-06-05 19:49:09 -0700123 /**
124 * Test if update() can correctly inserts a Link.
125 */
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800126 @Test
mininet403d5892013-06-05 03:48:17 -0700127 public void testUpdate_InsertSingleLink(){
128 Link linkToInsert = createFeasibleLink();
129 Link linkToVerify = createFeasibleLink();
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800130
131 //Use the link storage API to add the link
mininet403d5892013-06-05 03:48:17 -0700132 linkStorage.update(linkToInsert, ILinkStorage.DM_OPERATION.INSERT);
133
134 doTestLinkIsInGraph(linkToVerify);
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800135
mininet403d5892013-06-05 03:48:17 -0700136 // Add same link
137 Link linkToInsertTwice = createFeasibleLink();
138 linkStorage.update(linkToInsertTwice, ILinkStorage.DM_OPERATION.INSERT);
139
140 // this occurs assertion failure if there are two links in titanGraph
141 doTestLinkIsInGraph(linkToVerify);
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800142 }
143
Naoki Shiota1b972862013-06-05 19:49:09 -0700144 /**
145 * Test if update() can correctly deletes a Link.
146 */
mininet403d5892013-06-05 03:48:17 -0700147 @Test
148 public void testUpdate_DeleteSingleLink(){
149 Link linkToDelete = createExistingLink();
150 Link linkToVerify = createExistingLink();
151
152 // Test deletion of existing link
153 linkStorage.update(linkToDelete, DM_OPERATION.DELETE);
154 doTestLinkIsNotInGraph(linkToVerify);
155
156 linkToDelete = createFeasibleLink();
157 linkToVerify = createFeasibleLink();
158
159 // Test deletion of not-existing link
160 linkStorage.update(linkToDelete, DM_OPERATION.DELETE);
161 doTestLinkIsNotInGraph(linkToVerify);
162 }
Naoki Shiota1b972862013-06-05 19:49:09 -0700163
164 /**
165 * Test if update() can correctly creates multiple Links.
166 */
mininet403d5892013-06-05 03:48:17 -0700167 @Test
168 public void testUpdate_CreateLinks(){
169 List<Link> linksToCreate = createFeasibleLinks();
170 List<Link> linksToVerify = createFeasibleLinks();
171
172 // Test creation of new links
173 linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
174 for(Link l : linksToVerify) {
175 doTestLinkIsInGraph(l);
176 }
177
178 // Test creation of existing links
179 linksToCreate = createFeasibleLinks();
180 linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
181 for(Link l : linksToVerify) {
182 doTestLinkIsInGraph(l);
183 }
184 }
185
Naoki Shiota1b972862013-06-05 19:49:09 -0700186 /**
187 * Test if update() can handle mixture of normal/abnormal input for creation of Links.
188 */
mininet403d5892013-06-05 03:48:17 -0700189 @Test
mininet9d203de2013-06-05 08:40:45 -0700190 public void testUpdate_CreateLinks_Mixuture(){
mininet403d5892013-06-05 03:48:17 -0700191 List<Link> linksToCreate = new ArrayList<Link>();
192 linksToCreate.add(createFeasibleLink());
193 linksToCreate.add(createExistingLink());
194
195 // Test creation of mixture of new/existing links
196 linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
197 doTestLinkIsInGraph(createFeasibleLink());
198 doTestLinkIsInGraph(createExistingLink());
199 }
200
Naoki Shiota1b972862013-06-05 19:49:09 -0700201 /**
202 * Test if update() can correctly inserts multiple Links.
203 */
mininet403d5892013-06-05 03:48:17 -0700204 @Test
205 public void testUpdate_InsertLinks(){
206 List<Link> linksToInsert = createFeasibleLinks();
207 List<Link> linksToVerify = createFeasibleLinks();
208
209 // Test insertion of new links
210 linkStorage.update(linksToInsert, ILinkStorage.DM_OPERATION.INSERT);
211 for(Link l : linksToVerify) {
212 doTestLinkIsInGraph(l);
213 }
214
215 // Test insertion of existing links
216 linksToInsert = createFeasibleLinks();
217 linkStorage.update(linksToInsert, ILinkStorage.DM_OPERATION.INSERT);
218 for(Link l : linksToVerify) {
219 doTestLinkIsInGraph(l);
220 }
221 }
222
Naoki Shiota1b972862013-06-05 19:49:09 -0700223 /**
224 * Test if update() can handle mixture of normal/abnormal input for creation of Links.
225 */
mininet403d5892013-06-05 03:48:17 -0700226 @Test
mininet9d203de2013-06-05 08:40:45 -0700227 public void testUpdate_InsertLinks_Mixuture(){
mininet403d5892013-06-05 03:48:17 -0700228 List<Link> linksToInsert = new ArrayList<Link>();
229 linksToInsert.add(createFeasibleLink());
230 linksToInsert.add(createExistingLink());
231
232 // Test insertion of mixture of new/existing links
233 linkStorage.update(linksToInsert, ILinkStorage.DM_OPERATION.INSERT);
234 doTestLinkIsInGraph(createFeasibleLink());
235 doTestLinkIsInGraph(createExistingLink());
236 }
237
Naoki Shiota1b972862013-06-05 19:49:09 -0700238 /**
239 * Test if update() can correctly deletes multiple Links.
240 */
mininet403d5892013-06-05 03:48:17 -0700241 @Test
242 public void testUpdate_DeleteLinks(){
243 List<Link> linksToDelete = createExistingLinks();
244 List<Link> linksToVerify = createExistingLinks();
245
246 // Test deletion of existing links
247 linkStorage.update(linksToDelete, ILinkStorage.DM_OPERATION.DELETE);
248 for(Link l : linksToVerify) {
249 doTestLinkIsNotInGraph(l);
250 }
251
252 // Test deletion of not-existing links
253 linksToDelete = createExistingLinks();
254 linkStorage.update(linksToDelete, ILinkStorage.DM_OPERATION.DELETE);
255 for(Link l : linksToVerify) {
256 doTestLinkIsNotInGraph(l);
257 }
258 }
259
Naoki Shiota1b972862013-06-05 19:49:09 -0700260 /**
261 * Test if update() can handle mixture of normal/abnormal input for deletion of Links.
262 */
mininet403d5892013-06-05 03:48:17 -0700263 @Test
mininet9d203de2013-06-05 08:40:45 -0700264 public void testUpdate_DeleteLinks_Mixuture(){
mininet403d5892013-06-05 03:48:17 -0700265 List<Link> linksToDelete = new ArrayList<Link>();
266 linksToDelete.add(createFeasibleLink());
267 linksToDelete.add(createExistingLink());
268
269 // Test deletion of mixture of new/existing links
270 linkStorage.update(linksToDelete, ILinkStorage.DM_OPERATION.DELETE);
271 doTestLinkIsNotInGraph(createFeasibleLink());
272 doTestLinkIsNotInGraph(createExistingLink());
273 }
274
Naoki Shiotacae568a2013-06-05 17:53:41 -0700275 // TODO: remove @Ignore after UPDATE method is implemented
Naoki Shiota1b972862013-06-05 19:49:09 -0700276 /**
277 * Test if updateLink() can correctly updates LinkInfo for a Link.
278 */
mininet9d203de2013-06-05 08:40:45 -0700279 @Ignore @Test
Naoki Shiota1b972862013-06-05 19:49:09 -0700280 public void testUpdateLink_Update() {
mininet9d203de2013-06-05 08:40:45 -0700281 Link linkToUpdate= createExistingLink();
Naoki Shiotacae568a2013-06-05 17:53:41 -0700282 long currentTime = System.currentTimeMillis();
283 LinkInfo infoToUpdate = createFeasibleLinkInfo(currentTime);
284 LinkInfo infoToVerify = createFeasibleLinkInfo(currentTime);
mininet9d203de2013-06-05 08:40:45 -0700285
Naoki Shiota1b972862013-06-05 19:49:09 -0700286 linkStorage.updateLink(linkToUpdate, infoToUpdate, ILinkStorage.DM_OPERATION.UPDATE);
mininet9d203de2013-06-05 08:40:45 -0700287
Naoki Shiotacae568a2013-06-05 17:53:41 -0700288 doTestLinkHasStateOf(linkToUpdate, infoToVerify);
mininet403d5892013-06-05 03:48:17 -0700289 }
290
Naoki Shiota1b972862013-06-05 19:49:09 -0700291 /**
292 * Test if updateLink() can correctly creates a Link.
293 */
mininet403d5892013-06-05 03:48:17 -0700294 @Test
Naoki Shiota1b972862013-06-05 19:49:09 -0700295 public void testUpdateLink_Create() {
mininet9d203de2013-06-05 08:40:45 -0700296 Link linkToCreate = createFeasibleLink();
297 Link linkToVerify = createFeasibleLink();
mininet403d5892013-06-05 03:48:17 -0700298
mininet9d203de2013-06-05 08:40:45 -0700299 //Use the link storage API to add the link
Naoki Shiota1b972862013-06-05 19:49:09 -0700300 linkStorage.updateLink(linkToCreate, null, ILinkStorage.DM_OPERATION.CREATE);
mininet9d203de2013-06-05 08:40:45 -0700301 doTestLinkIsInGraph(linkToVerify);
302
303 // Add same link
304 Link linkToCreateTwice = createFeasibleLink();
Naoki Shiota1b972862013-06-05 19:49:09 -0700305 linkStorage.updateLink(linkToCreateTwice, null, ILinkStorage.DM_OPERATION.CREATE);
mininet403d5892013-06-05 03:48:17 -0700306
mininet9d203de2013-06-05 08:40:45 -0700307 // this occurs assertion failure if there are two links in titanGraph
308 doTestLinkIsInGraph(linkToVerify);
mininet403d5892013-06-05 03:48:17 -0700309 }
310
Naoki Shiota1b972862013-06-05 19:49:09 -0700311 /**
312 * Test if updateLink() can correctly inserts a Link.
313 */
mininet403d5892013-06-05 03:48:17 -0700314 @Test
Naoki Shiota1b972862013-06-05 19:49:09 -0700315 public void testUpdateLink_Insert() {
mininet9d203de2013-06-05 08:40:45 -0700316 Link linkToInsert = createFeasibleLink();
317 Link linkToVerify = createFeasibleLink();
mininet403d5892013-06-05 03:48:17 -0700318
mininet9d203de2013-06-05 08:40:45 -0700319 //Use the link storage API to add the link
Naoki Shiota1b972862013-06-05 19:49:09 -0700320 linkStorage.updateLink(linkToInsert, null, ILinkStorage.DM_OPERATION.INSERT);
mininet9d203de2013-06-05 08:40:45 -0700321
322 doTestLinkIsInGraph(linkToVerify);
323
324 // Add same link
325 Link linkToInsertTwice = createFeasibleLink();
Naoki Shiota1b972862013-06-05 19:49:09 -0700326 linkStorage.updateLink(linkToInsertTwice, null, ILinkStorage.DM_OPERATION.INSERT);
mininet9d203de2013-06-05 08:40:45 -0700327
328 // this occurs assertion failure if there are two links in titanGraph
329 doTestLinkIsInGraph(linkToVerify);
330 }
331
332 // TODO: Check if addOrUpdateLink() should accept DELETE operation. If not, remove this test.
Naoki Shiota1b972862013-06-05 19:49:09 -0700333 /**
334 * Test if updateLink() can correctly deletes a Link.
335 */
mininet9d203de2013-06-05 08:40:45 -0700336 @Ignore @Test
Naoki Shiota1b972862013-06-05 19:49:09 -0700337 public void testUpdateLink_Delete() {
mininet9d203de2013-06-05 08:40:45 -0700338 Link linkToDelete = createExistingLink();
339 Link linkToVerify = createExistingLink();
340
341 // Test deletion of existing link
Naoki Shiota1b972862013-06-05 19:49:09 -0700342 linkStorage.updateLink(linkToDelete, null, DM_OPERATION.DELETE);
mininet9d203de2013-06-05 08:40:45 -0700343 doTestLinkIsNotInGraph(linkToVerify);
344
345 linkToDelete = createFeasibleLink();
346 linkToVerify = createFeasibleLink();
347
348 // Test deletion of not-existing link
Naoki Shiota1b972862013-06-05 19:49:09 -0700349 linkStorage.updateLink(linkToDelete, null, DM_OPERATION.DELETE);
mininet9d203de2013-06-05 08:40:45 -0700350 doTestLinkIsNotInGraph(linkToVerify);
351 }
352
Naoki Shiota1b972862013-06-05 19:49:09 -0700353 /**
354 * Test if getLinks() can correctly return Links connected to specific DPID and port.
355 */
mininet9d203de2013-06-05 08:40:45 -0700356 @Test
357 public void testGetLinks_ByDpidPort(){
358 Link linkToVerify = createExistingLink();
359 Long dpid = linkToVerify.getSrc();
360 short port = (short)linkToVerify.getSrcPort();
361
362 List<Link> list = linkStorage.getLinks(dpid, port);
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800363
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800364 assertEquals(list.size(), 1);
365
366 Link l = list.get(0);
mininet403d5892013-06-05 03:48:17 -0700367 assertEquals(l.getSrc(), linkToVerify.getSrc());
368 assertEquals(l.getSrcPort(), linkToVerify.getSrcPort());
369 assertEquals(l.getDst(), linkToVerify.getDst());
370 assertEquals(l.getDstPort(), linkToVerify.getDstPort());
371
372 Link linkToVerifyNot = createFeasibleLink();
373
374 List<Link> list2 = linkStorage.getLinks(linkToVerifyNot.getSrc(), (short)linkToVerifyNot.getSrcPort());
375
376 assertEquals(list2.size(), 0);
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800377 }
378
Naoki Shiota1b972862013-06-05 19:49:09 -0700379 /**
380 * Test if getLinks() can correctly return Links connected to specific MAC address.
381 */
mininet403d5892013-06-05 03:48:17 -0700382 @Test
mininet9d203de2013-06-05 08:40:45 -0700383 public void testGetLinks_ByString() {
mininet403d5892013-06-05 03:48:17 -0700384 Link linkToVeryfy = createExistingLink();
mininet9d203de2013-06-05 08:40:45 -0700385 String dpid = HexString.toHexString(linkToVeryfy.getSrc());
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800386
mininet9d203de2013-06-05 08:40:45 -0700387 List<Link> links = linkStorage.getLinks(dpid);
mininet403d5892013-06-05 03:48:17 -0700388 assertTrue(links.contains(linkToVeryfy));
389
390 Link linkToVerifyNot = createFeasibleLink();
391 assertFalse(links.contains(linkToVerifyNot));
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800392 }
393
Naoki Shiota1b972862013-06-05 19:49:09 -0700394 /**
395 * Test if deleteLink() can correctly delete a Link.
396 */
mininet403d5892013-06-05 03:48:17 -0700397 @Test
398 public void testDeleteLink() {
399 // Deletion of existing link
400 Link linkToDelete = createExistingLink();
401 Link linkToVerify = createExistingLink();
402
403 linkStorage.deleteLink(linkToDelete);
404 doTestLinkIsNotInGraph(linkToVerify);
405
406 // Deletion of not existing link
407 linkToDelete = createFeasibleLink();
408 linkToVerify = createFeasibleLink();
409
410 linkStorage.deleteLink(linkToDelete);
411 doTestLinkIsNotInGraph(linkToVerify);
412 }
413
Naoki Shiota1b972862013-06-05 19:49:09 -0700414 /**
415 * Test if deleteLinks() can correctly delete Links.
416 */
mininet403d5892013-06-05 03:48:17 -0700417 @Test
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800418 public void testDeleteLinks(){
mininet403d5892013-06-05 03:48:17 -0700419 List<Link> linksToDelete = createExistingLinks();
420 List<Link> linksToVerify = createExistingLinks();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800421
mininet403d5892013-06-05 03:48:17 -0700422 linkStorage.deleteLinks(linksToDelete);
423 for(Link l : linksToVerify) {
424 doTestLinkIsNotInGraph(l);
425 }
426 }
427
Naoki Shiota1b972862013-06-05 19:49:09 -0700428 /**
429 * Test if deleteLinks() can handle mixture of normal/abnormal input.
430 */
mininet403d5892013-06-05 03:48:17 -0700431 @Test
mininet9d203de2013-06-05 08:40:45 -0700432 public void testDeleteLinks_Mixture(){
433 List<Link> linksToDelete = new ArrayList<Link>();
434 linksToDelete.add(createFeasibleLink());
435 linksToDelete.add(createExistingLink());
436
437 // Test deletion of mixture of new/existing links
438 linkStorage.deleteLinks(linksToDelete);
439 doTestLinkIsNotInGraph(createFeasibleLink());
440 doTestLinkIsNotInGraph(createExistingLink());
441 }
442
Naoki Shiota1b972862013-06-05 19:49:09 -0700443 /**
444 * Test if getActiveLinks() can correctly return active Links.
445 */
mininet9d203de2013-06-05 08:40:45 -0700446 @Test
mininet403d5892013-06-05 03:48:17 -0700447 public void testGetActiveLinks() {
448 Link existingLink = createExistingLink();
449 Link notExistingLink = createFeasibleLink();
450
451 List<Link> links = linkStorage.getActiveLinks();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800452
mininet403d5892013-06-05 03:48:17 -0700453 assertTrue(links.contains(existingLink));
454 assertFalse(links.contains(notExistingLink));
455 }
456
Naoki Shiota1b972862013-06-05 19:49:09 -0700457 /**
458 * Test if deleteLinksOnPort() can delete Links.
459 */
mininet403d5892013-06-05 03:48:17 -0700460 @Test
461 public void testDeleteLinksOnPort() {
462 Link linkToDelete = createExistingLink();
463 Link linkToVerify = createExistingLink();
464
465 linkStorage.deleteLinksOnPort(linkToDelete.getSrc(), linkToDelete.getSrcPort());
466
467 doTestLinkIsNotInGraph(linkToVerify);
468 }
mininet9d203de2013-06-05 08:40:45 -0700469
mininet403d5892013-06-05 03:48:17 -0700470 /**
mininet9d203de2013-06-05 08:40:45 -0700471 * Test if titanGraph has specific link
472 * @param link
mininet403d5892013-06-05 03:48:17 -0700473 */
474 private void doTestLinkIsInGraph(Link link) {
475 String src_dpid = HexString.toHexString(link.getSrc());
476 String dst_dpid = HexString.toHexString(link.getDst());
477 short src_port = link.getSrcPort();
478 short dst_port = link.getDstPort();
479
mininet403d5892013-06-05 03:48:17 -0700480 Iterator<Vertex> it = titanGraph.getVertices("dpid", src_dpid).iterator();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800481
mininet9d203de2013-06-05 08:40:45 -0700482 // Test if just one switch is found in the graph
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800483 assertTrue(it.hasNext());
mininet403d5892013-06-05 03:48:17 -0700484 Vertex sw = it.next();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800485 assertFalse(it.hasNext());
486
Naoki Shiotacae568a2013-06-05 17:53:41 -0700487 GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
mininet403d5892013-06-05 03:48:17 -0700488 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 -0800489
mininet9d203de2013-06-05 08:40:45 -0700490 // Test if just one link is found in the graph
mininet403d5892013-06-05 03:48:17 -0700491 assertTrue(pipe.hasNext());
492 pipe.next();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800493 assertFalse(pipe.hasNext());
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800494 }
495
mininet403d5892013-06-05 03:48:17 -0700496 /**
497 * Test if titanGraph doesn't have specific link
498 * @param link
499 */
500 private void doTestLinkIsNotInGraph(Link link) {
501 String src_dpid = HexString.toHexString(link.getSrc());
502 String dst_dpid = HexString.toHexString(link.getDst());
503 short src_port = link.getSrcPort();
504 short dst_port = link.getDstPort();
505
mininet403d5892013-06-05 03:48:17 -0700506 Iterator<Vertex> it = titanGraph.getVertices("dpid", src_dpid).iterator();
507
mininet9d203de2013-06-05 08:40:45 -0700508 // Test if just one switch is found in the graph
mininet403d5892013-06-05 03:48:17 -0700509 assertTrue(it.hasNext());
510 Vertex sw = it.next();
511 assertFalse(it.hasNext());
512
Naoki Shiotacae568a2013-06-05 17:53:41 -0700513 GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
mininet403d5892013-06-05 03:48:17 -0700514 pipe.start(sw).out("on").has("number", src_port).out("link").has("number", dst_port).in("on").has("dpid", dst_dpid);
515
mininet9d203de2013-06-05 08:40:45 -0700516 // Test if no link is found in the graph
mininet403d5892013-06-05 03:48:17 -0700517 assertFalse(pipe.hasNext());
518 }
Naoki Shiotacae568a2013-06-05 17:53:41 -0700519
520 /**
521 * Test if titanGraph has specific Link with specific LinkInfo
522 * @param link
523 */
524 private void doTestLinkHasStateOf(Link link, LinkInfo info) {
525 String src_dpid = HexString.toHexString(link.getSrc());
526 String dst_dpid = HexString.toHexString(link.getDst());
527 short src_port = link.getSrcPort();
528 short dst_port = link.getDstPort();
529
530 Iterator<Vertex> it = titanGraph.getVertices("dpid", src_dpid).iterator();
531
532 // Test if just one switch is found in the graph
533 assertTrue(it.hasNext());
534 Vertex sw = it.next();
535 assertFalse(it.hasNext());
536
537 GremlinPipeline<Vertex, Edge> pipe = new GremlinPipeline<Vertex, Edge>();
538 pipe.start(sw);
539 pipe.enablePath();
540 pipe.out("on").has("number", src_port).out("link").has("number", dst_port).in("on").has("dpid", dst_dpid)
541 .path().step(new PipeFunction<PathPipe<Vertex>, Edge>() {
542 @Override
543 public Edge compute(PathPipe<Vertex> pipepath) {
544 List<Vertex> V = pipepath.next();
545
546 Vertex port_src = V.get(1);
547 Vertex port_dst = V.get(2);
548
549 for(Edge e : port_src.getEdges(Direction.OUT)) {
550 if(e.getVertex(Direction.IN).equals(port_dst)) {
551 return e;
552 }
553 }
554
555 return null;
556 }
557 });
558
559 // Test if just one link is found in the graph
560 assertTrue(pipe.hasNext());
561 Edge edge = pipe.next();
562 assertTrue(edge != null);
563 assertFalse(pipe.hasNext());
564
565 // TODO: implement test code to check if update is correctly done.
Naoki Shiota1b972862013-06-05 19:49:09 -0700566 assertTrue(false);
Naoki Shiotacae568a2013-06-05 17:53:41 -0700567 }
568
mininet403d5892013-06-05 03:48:17 -0700569
570 //----------------- Creation of test data -----------------------
mininet9d203de2013-06-05 08:40:45 -0700571 /**
572 * Returns new Link object which has information of existing link in titanGraph
573 * @return new Link object
574 */
mininet403d5892013-06-05 03:48:17 -0700575 private Link createExistingLink() {
mininet9d203de2013-06-05 08:40:45 -0700576 // Link from SEA switch port 2 to CHI switch port 1
mininet403d5892013-06-05 03:48:17 -0700577 return new Link(Long.decode("0x0000000000000a01"), 2, Long.decode("0x0000000000000a03"), 1);
578 }
579
mininet9d203de2013-06-05 08:40:45 -0700580 /**
581 * Returns new Link object which has information of not-existing but feasible link in titanGraph
582 * @return new Link object
583 */
mininet403d5892013-06-05 03:48:17 -0700584 private Link createFeasibleLink() {
mininet9d203de2013-06-05 08:40:45 -0700585 // Link from SEA switch port 1 to LAX switch port 1
mininet403d5892013-06-05 03:48:17 -0700586 return new Link(Long.decode("0x0000000000000a01"), 4, Long.decode("0x0000000000000a02"), 1);
587 }
588
mininet9d203de2013-06-05 08:40:45 -0700589 // make NO sense while test-network data doesn't define physical network (i.e. any link is feasible)
mininet403d5892013-06-05 03:48:17 -0700590 @SuppressWarnings("unused")
591 private Link createInfeasibleLink() {
592 return new Link(Long.decode("0x0000000000000a01"), 1, Long.decode("0x0000000000000a02"), 1);
593 }
594
mininet9d203de2013-06-05 08:40:45 -0700595 /**
596 * Returns list of Link objects which all has information of existing link in titanGraph
597 * @return ArrayList of new Link objects
598 */
mininet403d5892013-06-05 03:48:17 -0700599 private List<Link> createExistingLinks() {
600 List<Link> links = new ArrayList<Link>();
mininet9d203de2013-06-05 08:40:45 -0700601 // Link from SEA switch port 2 to CHI switch port 1
mininet403d5892013-06-05 03:48:17 -0700602 links.add(new Link(Long.decode("0x0000000000000a01"), 2, Long.decode("0x0000000000000a03"), 1));
mininet9d203de2013-06-05 08:40:45 -0700603 // Link from LAX switch port 1 to SEA switch port 3
mininet403d5892013-06-05 03:48:17 -0700604 links.add(new Link(Long.decode("0x0000000000000a02"), 1, Long.decode("0x0000000000000a01"), 3));
605 return links;
606 }
607
mininet9d203de2013-06-05 08:40:45 -0700608 /**
609 * Returns list of Link objects which all has information of not-existing but feasible link
610 * @return ArrayList of new Link objects
611 */
mininet403d5892013-06-05 03:48:17 -0700612 private List<Link> createFeasibleLinks() {
613 List<Link> links = new ArrayList<Link>();
mininet9d203de2013-06-05 08:40:45 -0700614 // Link from CHI switch port 4 to NYC switch port 3
mininet403d5892013-06-05 03:48:17 -0700615 links.add(new Link(Long.decode("0x0000000000000a03"), 4, Long.decode("0x0000000000000a05"), 3));
mininet9d203de2013-06-05 08:40:45 -0700616 // Link from SEA switch port 4 to LAX switch port 1
mininet403d5892013-06-05 03:48:17 -0700617 links.add(new Link(Long.decode("0x0000000000000a01"), 4, Long.decode("0x0000000000000a02"), 1));
618 return links;
619 }
Naoki Shiotacae568a2013-06-05 17:53:41 -0700620
621 /**
622 * Returns new LinkInfo object with convenient values.
623 * @return LinkInfo object
624 */
625 private LinkInfo createFeasibleLinkInfo(long time) {
626 long time_first = time;
627 long time_last_lldp = time + 50;
628 long time_last_bddp = time + 100;
629 int state_src = OFPhysicalPort.OFPortState.OFPPS_STP_FORWARD.getValue();
630 int state_dst = OFPhysicalPort.OFPortState.OFPPS_STP_LISTEN.getValue();
631
632 return new LinkInfo(time_first,
633 time_last_lldp,
634 time_last_bddp,
635 state_src,
636 state_dst);
637 }
mininet403d5892013-06-05 03:48:17 -0700638 //---------------------------------------------------------------
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800639}