blob: 0968fefae5435da11666b5ad9c5e273dfdbe867e [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 Hart627f10c2013-01-16 14:20:03 -080011import net.floodlightcontroller.core.internal.TestDatabaseManager;
mininet403d5892013-06-05 03:48:17 -070012import net.floodlightcontroller.linkdiscovery.LinkInfo;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080013import net.floodlightcontroller.routing.Link;
HIGUCHI Yuta20514902013-06-12 11:24:16 -070014import net.onrc.onos.ofcontroller.core.INetMapStorage.DM_OPERATION;
HIGUCHI Yuta80c3ab82013-06-12 13:17:05 -070015import net.onrc.onos.ofcontroller.linkdiscovery.ILinkStorage;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080016
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;
Naoki Shiotacae568a2013-06-05 17:53:41 -070023import org.openflow.protocol.OFPhysicalPort;
mininet403d5892013-06-05 03:48:17 -070024import org.openflow.util.HexString;
mininet37dc5892013-06-04 10:58:44 -070025import org.powermock.api.easymock.PowerMock;
26import org.powermock.core.classloader.annotations.PrepareForTest;
27import org.powermock.modules.junit4.PowerMockRunner;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080028
mininet37dc5892013-06-04 10:58:44 -070029import com.thinkaurelius.titan.core.TitanFactory;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080030import com.thinkaurelius.titan.core.TitanGraph;
Naoki Shiotacae568a2013-06-05 17:53:41 -070031import com.tinkerpop.blueprints.Direction;
32import com.tinkerpop.blueprints.Edge;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080033import com.tinkerpop.blueprints.Vertex;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080034import com.tinkerpop.gremlin.java.GremlinPipeline;
Naoki Shiotacae568a2013-06-05 17:53:41 -070035import com.tinkerpop.pipes.PipeFunction;
36import com.tinkerpop.pipes.transform.PathPipe;
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080037
mininet37dc5892013-06-04 10:58:44 -070038@RunWith(PowerMockRunner.class)
39@PrepareForTest({TitanFactory.class})
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -080040public class LinkStorageImplTest {
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080041 private static ILinkStorage linkStorage;
42 private static TitanGraph titanGraph;
43
mininet37dc5892013-06-04 10:58:44 -070044 //private static IController
45
mininet9d203de2013-06-05 08:40:45 -070046 /**
47 * Setup code called before each tests.
48 * Read test graph data and replace DB access by test graph data.
49 * @throws Exception
50 */
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080051 @Before
Jonathan Hart627f10c2013-01-16 14:20:03 -080052 public void setUp() throws Exception{
mininet403d5892013-06-05 03:48:17 -070053 TestDatabaseManager.deleteTestDatabase();
54
Jonathan Hart627f10c2013-01-16 14:20:03 -080055 titanGraph = TestDatabaseManager.getTestDatabase();
56 TestDatabaseManager.populateTestData(titanGraph);
mininet37dc5892013-06-04 10:58:44 -070057
mininet9d203de2013-06-05 08:40:45 -070058 // replace return value of TitanFactory.open() to dummy DB created above
mininet37dc5892013-06-04 10:58:44 -070059 PowerMock.mockStatic(TitanFactory.class);
60 EasyMock.expect(TitanFactory.open((String)EasyMock.anyObject())).andReturn(titanGraph);
61 PowerMock.replay(TitanFactory.class);
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080062
mininet403d5892013-06-05 03:48:17 -070063 linkStorage = new LinkStorageImpl();
64
65 // initialize with dummy string
mininet37dc5892013-06-04 10:58:44 -070066 linkStorage.init("/dummy/path/to/db");
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080067 }
68
mininet9d203de2013-06-05 08:40:45 -070069 /**
70 * Closing code called after each tests.
71 * Discard test graph data.
72 * @throws Exception
73 */
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -080074 @After
mininet403d5892013-06-05 03:48:17 -070075 public void tearDown() throws Exception {
76 // finish code
77 linkStorage.close();
78
Jonathan Hartd1c5a1c2013-01-23 00:56:14 -080079 titanGraph.shutdown();
mininet37dc5892013-06-04 10:58:44 -070080 TestDatabaseManager.deleteTestDatabase();
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -080081 }
82
Naoki Shiotacae568a2013-06-05 17:53:41 -070083 // TODO: remove @Ignore after UPDATE method is implemented
Naoki Shiota1b972862013-06-05 19:49:09 -070084 /**
85 * Test if update() can correctly updates LinkInfo for a Link.
86 */
mininet403d5892013-06-05 03:48:17 -070087 @Ignore @Test
88 public void testUpdate_UpdateSingleLink() {
89 Link linkToUpdate= createExistingLink();
Naoki Shiotacae568a2013-06-05 17:53:41 -070090 long currentTime = System.currentTimeMillis();
91 LinkInfo infoToUpdate = createFeasibleLinkInfo(currentTime);
92 LinkInfo infoToVerify = createFeasibleLinkInfo(currentTime);
mininet403d5892013-06-05 03:48:17 -070093
94 linkStorage.update(linkToUpdate, infoToUpdate, ILinkStorage.DM_OPERATION.UPDATE);
95
Naoki Shiotacae568a2013-06-05 17:53:41 -070096 doTestLinkHasStateOf(linkToUpdate, infoToVerify);
mininet403d5892013-06-05 03:48:17 -070097 }
98
Naoki Shiota1b972862013-06-05 19:49:09 -070099 /**
100 * Test if update() can correctly creates a Link.
101 */
mininet403d5892013-06-05 03:48:17 -0700102 @Test
103 public void testUpdate_CreateSingleLink() {
104 Link linkToCreate = createFeasibleLink();
105 Link linkToVerify = createFeasibleLink();
106
107 //Use the link storage API to add the link
108 linkStorage.update(linkToCreate, ILinkStorage.DM_OPERATION.CREATE);
109 doTestLinkIsInGraph(linkToVerify);
110
111 // Add same link
112 Link linkToCreateTwice = createFeasibleLink();
113 linkStorage.update(linkToCreateTwice, ILinkStorage.DM_OPERATION.CREATE);
114
115 // this occurs assertion failure if there are two links in titanGraph
116 doTestLinkIsInGraph(linkToVerify);
117 }
118
Naoki Shiota1b972862013-06-05 19:49:09 -0700119 /**
120 * Test if update() can correctly inserts a Link.
121 */
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800122 @Test
mininet403d5892013-06-05 03:48:17 -0700123 public void testUpdate_InsertSingleLink(){
124 Link linkToInsert = createFeasibleLink();
125 Link linkToVerify = createFeasibleLink();
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800126
127 //Use the link storage API to add the link
mininet403d5892013-06-05 03:48:17 -0700128 linkStorage.update(linkToInsert, ILinkStorage.DM_OPERATION.INSERT);
129
130 doTestLinkIsInGraph(linkToVerify);
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800131
mininet403d5892013-06-05 03:48:17 -0700132 // Add same link
133 Link linkToInsertTwice = createFeasibleLink();
134 linkStorage.update(linkToInsertTwice, ILinkStorage.DM_OPERATION.INSERT);
135
136 // this occurs assertion failure if there are two links in titanGraph
137 doTestLinkIsInGraph(linkToVerify);
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800138 }
139
Naoki Shiota1b972862013-06-05 19:49:09 -0700140 /**
141 * Test if update() can correctly deletes a Link.
142 */
mininet403d5892013-06-05 03:48:17 -0700143 @Test
144 public void testUpdate_DeleteSingleLink(){
145 Link linkToDelete = createExistingLink();
146 Link linkToVerify = createExistingLink();
147
148 // Test deletion of existing link
149 linkStorage.update(linkToDelete, DM_OPERATION.DELETE);
150 doTestLinkIsNotInGraph(linkToVerify);
151
152 linkToDelete = createFeasibleLink();
153 linkToVerify = createFeasibleLink();
154
155 // Test deletion of not-existing link
156 linkStorage.update(linkToDelete, DM_OPERATION.DELETE);
157 doTestLinkIsNotInGraph(linkToVerify);
158 }
Naoki Shiota1b972862013-06-05 19:49:09 -0700159
160 /**
161 * Test if update() can correctly creates multiple Links.
162 */
mininet403d5892013-06-05 03:48:17 -0700163 @Test
164 public void testUpdate_CreateLinks(){
165 List<Link> linksToCreate = createFeasibleLinks();
166 List<Link> linksToVerify = createFeasibleLinks();
167
168 // Test creation of new links
169 linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
170 for(Link l : linksToVerify) {
171 doTestLinkIsInGraph(l);
172 }
173
174 // Test creation of existing links
175 linksToCreate = createFeasibleLinks();
176 linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
177 for(Link l : linksToVerify) {
178 doTestLinkIsInGraph(l);
179 }
180 }
181
Naoki Shiota1b972862013-06-05 19:49:09 -0700182 /**
183 * Test if update() can handle mixture of normal/abnormal input for creation of Links.
184 */
mininet403d5892013-06-05 03:48:17 -0700185 @Test
mininet9d203de2013-06-05 08:40:45 -0700186 public void testUpdate_CreateLinks_Mixuture(){
mininet403d5892013-06-05 03:48:17 -0700187 List<Link> linksToCreate = new ArrayList<Link>();
188 linksToCreate.add(createFeasibleLink());
189 linksToCreate.add(createExistingLink());
190
191 // Test creation of mixture of new/existing links
192 linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
193 doTestLinkIsInGraph(createFeasibleLink());
194 doTestLinkIsInGraph(createExistingLink());
195 }
196
Naoki Shiota1b972862013-06-05 19:49:09 -0700197 /**
198 * Test if update() can correctly inserts multiple Links.
199 */
mininet403d5892013-06-05 03:48:17 -0700200 @Test
201 public void testUpdate_InsertLinks(){
202 List<Link> linksToInsert = createFeasibleLinks();
203 List<Link> linksToVerify = createFeasibleLinks();
204
205 // Test insertion of new links
206 linkStorage.update(linksToInsert, ILinkStorage.DM_OPERATION.INSERT);
207 for(Link l : linksToVerify) {
208 doTestLinkIsInGraph(l);
209 }
210
211 // Test insertion of existing links
212 linksToInsert = createFeasibleLinks();
213 linkStorage.update(linksToInsert, ILinkStorage.DM_OPERATION.INSERT);
214 for(Link l : linksToVerify) {
215 doTestLinkIsInGraph(l);
216 }
217 }
218
Naoki Shiota1b972862013-06-05 19:49:09 -0700219 /**
220 * Test if update() can handle mixture of normal/abnormal input for creation of Links.
221 */
mininet403d5892013-06-05 03:48:17 -0700222 @Test
mininet9d203de2013-06-05 08:40:45 -0700223 public void testUpdate_InsertLinks_Mixuture(){
mininet403d5892013-06-05 03:48:17 -0700224 List<Link> linksToInsert = new ArrayList<Link>();
225 linksToInsert.add(createFeasibleLink());
226 linksToInsert.add(createExistingLink());
227
228 // Test insertion of mixture of new/existing links
229 linkStorage.update(linksToInsert, ILinkStorage.DM_OPERATION.INSERT);
230 doTestLinkIsInGraph(createFeasibleLink());
231 doTestLinkIsInGraph(createExistingLink());
232 }
233
Naoki Shiota1b972862013-06-05 19:49:09 -0700234 /**
235 * Test if update() can correctly deletes multiple Links.
236 */
mininet403d5892013-06-05 03:48:17 -0700237 @Test
238 public void testUpdate_DeleteLinks(){
239 List<Link> linksToDelete = createExistingLinks();
240 List<Link> linksToVerify = createExistingLinks();
241
242 // Test deletion of existing links
243 linkStorage.update(linksToDelete, ILinkStorage.DM_OPERATION.DELETE);
244 for(Link l : linksToVerify) {
245 doTestLinkIsNotInGraph(l);
246 }
247
248 // Test deletion of not-existing links
249 linksToDelete = createExistingLinks();
250 linkStorage.update(linksToDelete, ILinkStorage.DM_OPERATION.DELETE);
251 for(Link l : linksToVerify) {
252 doTestLinkIsNotInGraph(l);
253 }
254 }
255
Naoki Shiota1b972862013-06-05 19:49:09 -0700256 /**
257 * Test if update() can handle mixture of normal/abnormal input for deletion of Links.
258 */
mininet403d5892013-06-05 03:48:17 -0700259 @Test
mininet9d203de2013-06-05 08:40:45 -0700260 public void testUpdate_DeleteLinks_Mixuture(){
mininet403d5892013-06-05 03:48:17 -0700261 List<Link> linksToDelete = new ArrayList<Link>();
262 linksToDelete.add(createFeasibleLink());
263 linksToDelete.add(createExistingLink());
264
265 // Test deletion of mixture of new/existing links
266 linkStorage.update(linksToDelete, ILinkStorage.DM_OPERATION.DELETE);
267 doTestLinkIsNotInGraph(createFeasibleLink());
268 doTestLinkIsNotInGraph(createExistingLink());
269 }
270
Naoki Shiotacae568a2013-06-05 17:53:41 -0700271 // TODO: remove @Ignore after UPDATE method is implemented
Naoki Shiota1b972862013-06-05 19:49:09 -0700272 /**
273 * Test if updateLink() can correctly updates LinkInfo for a Link.
274 */
mininet9d203de2013-06-05 08:40:45 -0700275 @Ignore @Test
Naoki Shiota1b972862013-06-05 19:49:09 -0700276 public void testUpdateLink_Update() {
mininet9d203de2013-06-05 08:40:45 -0700277 Link linkToUpdate= createExistingLink();
Naoki Shiotacae568a2013-06-05 17:53:41 -0700278 long currentTime = System.currentTimeMillis();
279 LinkInfo infoToUpdate = createFeasibleLinkInfo(currentTime);
280 LinkInfo infoToVerify = createFeasibleLinkInfo(currentTime);
mininet9d203de2013-06-05 08:40:45 -0700281
Naoki Shiota1b972862013-06-05 19:49:09 -0700282 linkStorage.updateLink(linkToUpdate, infoToUpdate, ILinkStorage.DM_OPERATION.UPDATE);
mininet9d203de2013-06-05 08:40:45 -0700283
Naoki Shiotacae568a2013-06-05 17:53:41 -0700284 doTestLinkHasStateOf(linkToUpdate, infoToVerify);
mininet403d5892013-06-05 03:48:17 -0700285 }
286
Naoki Shiota1b972862013-06-05 19:49:09 -0700287 /**
288 * Test if updateLink() can correctly creates a Link.
289 */
mininet403d5892013-06-05 03:48:17 -0700290 @Test
Naoki Shiota1b972862013-06-05 19:49:09 -0700291 public void testUpdateLink_Create() {
mininet9d203de2013-06-05 08:40:45 -0700292 Link linkToCreate = createFeasibleLink();
293 Link linkToVerify = createFeasibleLink();
mininet403d5892013-06-05 03:48:17 -0700294
mininet9d203de2013-06-05 08:40:45 -0700295 //Use the link storage API to add the link
Naoki Shiota1b972862013-06-05 19:49:09 -0700296 linkStorage.updateLink(linkToCreate, null, ILinkStorage.DM_OPERATION.CREATE);
mininet9d203de2013-06-05 08:40:45 -0700297 doTestLinkIsInGraph(linkToVerify);
298
299 // Add same link
300 Link linkToCreateTwice = createFeasibleLink();
Naoki Shiota1b972862013-06-05 19:49:09 -0700301 linkStorage.updateLink(linkToCreateTwice, null, ILinkStorage.DM_OPERATION.CREATE);
mininet403d5892013-06-05 03:48:17 -0700302
mininet9d203de2013-06-05 08:40:45 -0700303 // this occurs assertion failure if there are two links in titanGraph
304 doTestLinkIsInGraph(linkToVerify);
mininet403d5892013-06-05 03:48:17 -0700305 }
306
Naoki Shiota1b972862013-06-05 19:49:09 -0700307 /**
308 * Test if updateLink() can correctly inserts a Link.
309 */
mininet403d5892013-06-05 03:48:17 -0700310 @Test
Naoki Shiota1b972862013-06-05 19:49:09 -0700311 public void testUpdateLink_Insert() {
mininet9d203de2013-06-05 08:40:45 -0700312 Link linkToInsert = createFeasibleLink();
313 Link linkToVerify = createFeasibleLink();
mininet403d5892013-06-05 03:48:17 -0700314
mininet9d203de2013-06-05 08:40:45 -0700315 //Use the link storage API to add the link
Naoki Shiota1b972862013-06-05 19:49:09 -0700316 linkStorage.updateLink(linkToInsert, null, ILinkStorage.DM_OPERATION.INSERT);
mininet9d203de2013-06-05 08:40:45 -0700317
318 doTestLinkIsInGraph(linkToVerify);
319
320 // Add same link
321 Link linkToInsertTwice = createFeasibleLink();
Naoki Shiota1b972862013-06-05 19:49:09 -0700322 linkStorage.updateLink(linkToInsertTwice, null, ILinkStorage.DM_OPERATION.INSERT);
mininet9d203de2013-06-05 08:40:45 -0700323
324 // this occurs assertion failure if there are two links in titanGraph
325 doTestLinkIsInGraph(linkToVerify);
326 }
327
328 // TODO: Check if addOrUpdateLink() should accept DELETE operation. If not, remove this test.
Naoki Shiota1b972862013-06-05 19:49:09 -0700329 /**
330 * Test if updateLink() can correctly deletes a Link.
331 */
mininet9d203de2013-06-05 08:40:45 -0700332 @Ignore @Test
Naoki Shiota1b972862013-06-05 19:49:09 -0700333 public void testUpdateLink_Delete() {
mininet9d203de2013-06-05 08:40:45 -0700334 Link linkToDelete = createExistingLink();
335 Link linkToVerify = createExistingLink();
336
337 // Test deletion of existing link
Naoki Shiota1b972862013-06-05 19:49:09 -0700338 linkStorage.updateLink(linkToDelete, null, DM_OPERATION.DELETE);
mininet9d203de2013-06-05 08:40:45 -0700339 doTestLinkIsNotInGraph(linkToVerify);
340
341 linkToDelete = createFeasibleLink();
342 linkToVerify = createFeasibleLink();
343
344 // Test deletion of not-existing link
Naoki Shiota1b972862013-06-05 19:49:09 -0700345 linkStorage.updateLink(linkToDelete, null, DM_OPERATION.DELETE);
mininet9d203de2013-06-05 08:40:45 -0700346 doTestLinkIsNotInGraph(linkToVerify);
347 }
348
Naoki Shiota1b972862013-06-05 19:49:09 -0700349 /**
350 * Test if getLinks() can correctly return Links connected to specific DPID and port.
351 */
mininet9d203de2013-06-05 08:40:45 -0700352 @Test
353 public void testGetLinks_ByDpidPort(){
354 Link linkToVerify = createExistingLink();
355 Long dpid = linkToVerify.getSrc();
356 short port = (short)linkToVerify.getSrcPort();
357
358 List<Link> list = linkStorage.getLinks(dpid, port);
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800359
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800360 assertEquals(list.size(), 1);
361
362 Link l = list.get(0);
mininet403d5892013-06-05 03:48:17 -0700363 assertEquals(l.getSrc(), linkToVerify.getSrc());
364 assertEquals(l.getSrcPort(), linkToVerify.getSrcPort());
365 assertEquals(l.getDst(), linkToVerify.getDst());
366 assertEquals(l.getDstPort(), linkToVerify.getDstPort());
367
368 Link linkToVerifyNot = createFeasibleLink();
369
370 List<Link> list2 = linkStorage.getLinks(linkToVerifyNot.getSrc(), (short)linkToVerifyNot.getSrcPort());
371
372 assertEquals(list2.size(), 0);
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800373 }
374
Naoki Shiota1b972862013-06-05 19:49:09 -0700375 /**
376 * Test if getLinks() can correctly return Links connected to specific MAC address.
377 */
mininet403d5892013-06-05 03:48:17 -0700378 @Test
mininet9d203de2013-06-05 08:40:45 -0700379 public void testGetLinks_ByString() {
mininet403d5892013-06-05 03:48:17 -0700380 Link linkToVeryfy = createExistingLink();
mininet9d203de2013-06-05 08:40:45 -0700381 String dpid = HexString.toHexString(linkToVeryfy.getSrc());
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800382
mininet9d203de2013-06-05 08:40:45 -0700383 List<Link> links = linkStorage.getLinks(dpid);
mininet403d5892013-06-05 03:48:17 -0700384 assertTrue(links.contains(linkToVeryfy));
385
386 Link linkToVerifyNot = createFeasibleLink();
387 assertFalse(links.contains(linkToVerifyNot));
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800388 }
389
Naoki Shiota1b972862013-06-05 19:49:09 -0700390 /**
391 * Test if deleteLink() can correctly delete a Link.
392 */
mininet403d5892013-06-05 03:48:17 -0700393 @Test
394 public void testDeleteLink() {
395 // Deletion of existing link
396 Link linkToDelete = createExistingLink();
397 Link linkToVerify = createExistingLink();
398
399 linkStorage.deleteLink(linkToDelete);
400 doTestLinkIsNotInGraph(linkToVerify);
401
402 // Deletion of not existing link
403 linkToDelete = createFeasibleLink();
404 linkToVerify = createFeasibleLink();
405
406 linkStorage.deleteLink(linkToDelete);
407 doTestLinkIsNotInGraph(linkToVerify);
408 }
409
Naoki Shiota1b972862013-06-05 19:49:09 -0700410 /**
411 * Test if deleteLinks() can correctly delete Links.
412 */
mininet403d5892013-06-05 03:48:17 -0700413 @Test
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800414 public void testDeleteLinks(){
mininet403d5892013-06-05 03:48:17 -0700415 List<Link> linksToDelete = createExistingLinks();
416 List<Link> linksToVerify = createExistingLinks();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800417
mininet403d5892013-06-05 03:48:17 -0700418 linkStorage.deleteLinks(linksToDelete);
419 for(Link l : linksToVerify) {
420 doTestLinkIsNotInGraph(l);
421 }
422 }
423
Naoki Shiota1b972862013-06-05 19:49:09 -0700424 /**
425 * Test if deleteLinks() can handle mixture of normal/abnormal input.
426 */
mininet403d5892013-06-05 03:48:17 -0700427 @Test
mininet9d203de2013-06-05 08:40:45 -0700428 public void testDeleteLinks_Mixture(){
429 List<Link> linksToDelete = new ArrayList<Link>();
430 linksToDelete.add(createFeasibleLink());
431 linksToDelete.add(createExistingLink());
432
433 // Test deletion of mixture of new/existing links
434 linkStorage.deleteLinks(linksToDelete);
435 doTestLinkIsNotInGraph(createFeasibleLink());
436 doTestLinkIsNotInGraph(createExistingLink());
437 }
438
Naoki Shiota1b972862013-06-05 19:49:09 -0700439 /**
440 * Test if getActiveLinks() can correctly return active Links.
441 */
mininet9d203de2013-06-05 08:40:45 -0700442 @Test
mininet403d5892013-06-05 03:48:17 -0700443 public void testGetActiveLinks() {
444 Link existingLink = createExistingLink();
445 Link notExistingLink = createFeasibleLink();
446
447 List<Link> links = linkStorage.getActiveLinks();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800448
mininet403d5892013-06-05 03:48:17 -0700449 assertTrue(links.contains(existingLink));
450 assertFalse(links.contains(notExistingLink));
451 }
452
Naoki Shiota1b972862013-06-05 19:49:09 -0700453 /**
454 * Test if deleteLinksOnPort() can delete Links.
455 */
mininet403d5892013-06-05 03:48:17 -0700456 @Test
457 public void testDeleteLinksOnPort() {
458 Link linkToDelete = createExistingLink();
459 Link linkToVerify = createExistingLink();
460
461 linkStorage.deleteLinksOnPort(linkToDelete.getSrc(), linkToDelete.getSrcPort());
462
463 doTestLinkIsNotInGraph(linkToVerify);
464 }
mininet9d203de2013-06-05 08:40:45 -0700465
mininet403d5892013-06-05 03:48:17 -0700466 /**
mininet9d203de2013-06-05 08:40:45 -0700467 * Test if titanGraph has specific link
468 * @param link
mininet403d5892013-06-05 03:48:17 -0700469 */
470 private void doTestLinkIsInGraph(Link link) {
471 String src_dpid = HexString.toHexString(link.getSrc());
472 String dst_dpid = HexString.toHexString(link.getDst());
473 short src_port = link.getSrcPort();
474 short dst_port = link.getDstPort();
475
mininet403d5892013-06-05 03:48:17 -0700476 Iterator<Vertex> it = titanGraph.getVertices("dpid", src_dpid).iterator();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800477
mininet9d203de2013-06-05 08:40:45 -0700478 // Test if just one switch is found in the graph
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800479 assertTrue(it.hasNext());
mininet403d5892013-06-05 03:48:17 -0700480 Vertex sw = it.next();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800481 assertFalse(it.hasNext());
482
Naoki Shiotacae568a2013-06-05 17:53:41 -0700483 GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
mininet403d5892013-06-05 03:48:17 -0700484 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 -0800485
mininet9d203de2013-06-05 08:40:45 -0700486 // Test if just one link is found in the graph
mininet403d5892013-06-05 03:48:17 -0700487 assertTrue(pipe.hasNext());
488 pipe.next();
Jonathan Hartc86a2ea2013-01-15 22:39:42 -0800489 assertFalse(pipe.hasNext());
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800490 }
491
mininet403d5892013-06-05 03:48:17 -0700492 /**
493 * Test if titanGraph doesn't have specific link
494 * @param link
495 */
496 private void doTestLinkIsNotInGraph(Link link) {
497 String src_dpid = HexString.toHexString(link.getSrc());
498 String dst_dpid = HexString.toHexString(link.getDst());
499 short src_port = link.getSrcPort();
500 short dst_port = link.getDstPort();
501
mininet403d5892013-06-05 03:48:17 -0700502 Iterator<Vertex> it = titanGraph.getVertices("dpid", src_dpid).iterator();
503
mininet9d203de2013-06-05 08:40:45 -0700504 // Test if just one switch is found in the graph
mininet403d5892013-06-05 03:48:17 -0700505 assertTrue(it.hasNext());
506 Vertex sw = it.next();
507 assertFalse(it.hasNext());
508
Naoki Shiotacae568a2013-06-05 17:53:41 -0700509 GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
mininet403d5892013-06-05 03:48:17 -0700510 pipe.start(sw).out("on").has("number", src_port).out("link").has("number", dst_port).in("on").has("dpid", dst_dpid);
511
mininet9d203de2013-06-05 08:40:45 -0700512 // Test if no link is found in the graph
mininet403d5892013-06-05 03:48:17 -0700513 assertFalse(pipe.hasNext());
514 }
Naoki Shiotacae568a2013-06-05 17:53:41 -0700515
516 /**
517 * Test if titanGraph has specific Link with specific LinkInfo
518 * @param link
519 */
520 private void doTestLinkHasStateOf(Link link, LinkInfo info) {
521 String src_dpid = HexString.toHexString(link.getSrc());
522 String dst_dpid = HexString.toHexString(link.getDst());
523 short src_port = link.getSrcPort();
524 short dst_port = link.getDstPort();
525
526 Iterator<Vertex> it = titanGraph.getVertices("dpid", src_dpid).iterator();
527
528 // Test if just one switch is found in the graph
529 assertTrue(it.hasNext());
530 Vertex sw = it.next();
531 assertFalse(it.hasNext());
532
533 GremlinPipeline<Vertex, Edge> pipe = new GremlinPipeline<Vertex, Edge>();
534 pipe.start(sw);
535 pipe.enablePath();
536 pipe.out("on").has("number", src_port).out("link").has("number", dst_port).in("on").has("dpid", dst_dpid)
537 .path().step(new PipeFunction<PathPipe<Vertex>, Edge>() {
538 @Override
539 public Edge compute(PathPipe<Vertex> pipepath) {
540 List<Vertex> V = pipepath.next();
541
542 Vertex port_src = V.get(1);
543 Vertex port_dst = V.get(2);
544
545 for(Edge e : port_src.getEdges(Direction.OUT)) {
546 if(e.getVertex(Direction.IN).equals(port_dst)) {
547 return e;
548 }
549 }
550
551 return null;
552 }
553 });
554
555 // Test if just one link is found in the graph
556 assertTrue(pipe.hasNext());
557 Edge edge = pipe.next();
558 assertTrue(edge != null);
559 assertFalse(pipe.hasNext());
560
561 // TODO: implement test code to check if update is correctly done.
Naoki Shiota1b972862013-06-05 19:49:09 -0700562 assertTrue(false);
Naoki Shiotacae568a2013-06-05 17:53:41 -0700563 }
564
mininet403d5892013-06-05 03:48:17 -0700565
566 //----------------- Creation of test data -----------------------
mininet9d203de2013-06-05 08:40:45 -0700567 /**
568 * Returns new Link object which has information of existing link in titanGraph
569 * @return new Link object
570 */
mininet403d5892013-06-05 03:48:17 -0700571 private Link createExistingLink() {
mininet9d203de2013-06-05 08:40:45 -0700572 // Link from SEA switch port 2 to CHI switch port 1
mininet403d5892013-06-05 03:48:17 -0700573 return new Link(Long.decode("0x0000000000000a01"), 2, Long.decode("0x0000000000000a03"), 1);
574 }
575
mininet9d203de2013-06-05 08:40:45 -0700576 /**
577 * Returns new Link object which has information of not-existing but feasible link in titanGraph
578 * @return new Link object
579 */
mininet403d5892013-06-05 03:48:17 -0700580 private Link createFeasibleLink() {
mininet9d203de2013-06-05 08:40:45 -0700581 // Link from SEA switch port 1 to LAX switch port 1
mininet403d5892013-06-05 03:48:17 -0700582 return new Link(Long.decode("0x0000000000000a01"), 4, Long.decode("0x0000000000000a02"), 1);
583 }
584
mininet9d203de2013-06-05 08:40:45 -0700585 // make NO sense while test-network data doesn't define physical network (i.e. any link is feasible)
mininet403d5892013-06-05 03:48:17 -0700586 @SuppressWarnings("unused")
587 private Link createInfeasibleLink() {
588 return new Link(Long.decode("0x0000000000000a01"), 1, Long.decode("0x0000000000000a02"), 1);
589 }
590
mininet9d203de2013-06-05 08:40:45 -0700591 /**
592 * Returns list of Link objects which all has information of existing link in titanGraph
593 * @return ArrayList of new Link objects
594 */
mininet403d5892013-06-05 03:48:17 -0700595 private List<Link> createExistingLinks() {
596 List<Link> links = new ArrayList<Link>();
mininet9d203de2013-06-05 08:40:45 -0700597 // Link from SEA switch port 2 to CHI switch port 1
mininet403d5892013-06-05 03:48:17 -0700598 links.add(new Link(Long.decode("0x0000000000000a01"), 2, Long.decode("0x0000000000000a03"), 1));
mininet9d203de2013-06-05 08:40:45 -0700599 // Link from LAX switch port 1 to SEA switch port 3
mininet403d5892013-06-05 03:48:17 -0700600 links.add(new Link(Long.decode("0x0000000000000a02"), 1, Long.decode("0x0000000000000a01"), 3));
601 return links;
602 }
603
mininet9d203de2013-06-05 08:40:45 -0700604 /**
605 * Returns list of Link objects which all has information of not-existing but feasible link
606 * @return ArrayList of new Link objects
607 */
mininet403d5892013-06-05 03:48:17 -0700608 private List<Link> createFeasibleLinks() {
609 List<Link> links = new ArrayList<Link>();
mininet9d203de2013-06-05 08:40:45 -0700610 // Link from CHI switch port 4 to NYC switch port 3
mininet403d5892013-06-05 03:48:17 -0700611 links.add(new Link(Long.decode("0x0000000000000a03"), 4, Long.decode("0x0000000000000a05"), 3));
mininet9d203de2013-06-05 08:40:45 -0700612 // Link from SEA switch port 4 to LAX switch port 1
mininet403d5892013-06-05 03:48:17 -0700613 links.add(new Link(Long.decode("0x0000000000000a01"), 4, Long.decode("0x0000000000000a02"), 1));
614 return links;
615 }
Naoki Shiotacae568a2013-06-05 17:53:41 -0700616
617 /**
618 * Returns new LinkInfo object with convenient values.
619 * @return LinkInfo object
620 */
621 private LinkInfo createFeasibleLinkInfo(long time) {
622 long time_first = time;
623 long time_last_lldp = time + 50;
624 long time_last_bddp = time + 100;
625 int state_src = OFPhysicalPort.OFPortState.OFPPS_STP_FORWARD.getValue();
626 int state_dst = OFPhysicalPort.OFPortState.OFPPS_STP_LISTEN.getValue();
627
628 return new LinkInfo(time_first,
629 time_last_lldp,
630 time_last_bddp,
631 state_src,
632 state_dst);
633 }
mininet403d5892013-06-05 03:48:17 -0700634 //---------------------------------------------------------------
Jonathan Hartb7e3d2c2013-01-15 18:45:19 -0800635}