blob: 8d4ccc0f15c83b59052f43fef31ede33719d4632 [file] [log] [blame]
Pavlin Radoslavov8e7ba4b2013-10-16 04:04:27 -07001package net.onrc.onos.ofcontroller.topology;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -07002
3import static org.junit.Assert.assertEquals;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -07004import static org.junit.Assert.assertTrue;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -07005
6import org.easymock.EasyMock;
7
8import org.junit.After;
9import org.junit.Before;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070010import org.junit.Test;
11import org.junit.runner.RunWith;
12
13import org.powermock.api.easymock.PowerMock;
14import org.powermock.core.classloader.annotations.PrepareForTest;
15import org.powermock.modules.junit4.PowerMockRunner;
16
17import com.thinkaurelius.titan.core.TitanGraph;
18import com.thinkaurelius.titan.core.TitanFactory;
yoshi2fd4c7e2013-11-22 15:47:55 -080019import net.onrc.onos.graph.DBConnection;
20import net.onrc.onos.graph.DBOperation;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070021import net.onrc.onos.graph.GraphDBConnection;
yoshi2fd4c7e2013-11-22 15:47:55 -080022import net.onrc.onos.graph.GraphDBManager;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070023import net.onrc.onos.graph.GraphDBOperation;
24import net.onrc.onos.ofcontroller.core.internal.TestDatabaseManager;
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -070025import net.onrc.onos.ofcontroller.topology.TopologyManager;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070026import net.onrc.onos.ofcontroller.util.DataPath;
27import net.onrc.onos.ofcontroller.util.Dpid;
Pavlin Radoslavov204b2862013-07-12 14:15:36 -070028import net.onrc.onos.ofcontroller.util.FlowPathFlags;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070029import net.onrc.onos.ofcontroller.util.Port;
30import net.onrc.onos.ofcontroller.util.SwitchPort;
31
32/**
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -070033 * A class for testing the TopologyManager class.
34 * @see net.onrc.onos.ofcontroller.topology.TopologyManager
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070035 */
36@RunWith(PowerMockRunner.class)
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -070037@PrepareForTest({TitanFactory.class, GraphDBConnection.class, GraphDBOperation.class, TopologyManager.class})
Pavlin Radoslavov8e7ba4b2013-10-16 04:04:27 -070038public class TopologyManagerTest {
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070039 String conf;
yoshi2fd4c7e2013-11-22 15:47:55 -080040 String dbStore;
41 private DBConnection conn = null;
42 private DBOperation oper = null;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070043 private TitanGraph titanGraph = null;
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -070044 private TopologyManager topologyManager = null;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070045
46 /**
47 * Setup the tests.
48 */
49 @Before
50 public void setUp() throws Exception {
yoshi2fd4c7e2013-11-22 15:47:55 -080051 dbStore = "dummyStore";
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070052 conf = "/dummy/path/to/db";
53
54 //
55 // Make mock database.
56 // Replace TitanFactory.open() to return the mock database.
57 //
58 titanGraph = TestDatabaseManager.getTestDatabase();
59 PowerMock.mockStatic(TitanFactory.class);
60 EasyMock.expect(TitanFactory.open((String)EasyMock.anyObject())).andReturn(titanGraph);
61 PowerMock.replay(TitanFactory.class);
62
yoshi2fd4c7e2013-11-22 15:47:55 -080063 oper = GraphDBManager.getDBOperation(dbStore, conf);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070064 // Create the connection to the database
yoshi2fd4c7e2013-11-22 15:47:55 -080065 conn = GraphDBManager.getConnection(dbStore, conf);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070066
67 // Populate the database
68 TestDatabaseManager.populateTestData(titanGraph);
69
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -070070 // Prepare the TopologyManager instance
Pavlin Radoslavov0367d352013-10-19 11:04:43 -070071 topologyManager = new TopologyManager(oper);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070072 }
73
74 /**
75 * Cleanup after the tests.
76 */
77 @After
78 public void tearDown() throws Exception {
79 titanGraph.shutdown();
80 TestDatabaseManager.deleteTestDatabase();
81 }
82
83 /**
Pavlin Radoslavov15954d42013-10-19 15:29:04 -070084 * Test method TopologyManager.getTopologyShortestPath()
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070085 *
Pavlin Radoslavov15954d42013-10-19 15:29:04 -070086 * @see net.onrc.onos.ofcontroller.topology.TopologyManager#getTopologyShortestPath
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070087 */
88 @Test
Pavlin Radoslavov15954d42013-10-19 15:29:04 -070089 public void test_getTopologyShortestPath() {
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070090 DataPath dataPath = null;
91 String srcDpidStr = "00:00:00:00:00:00:0a:01";
92 String dstDpidStr = "00:00:00:00:00:00:0a:06";
93 short srcPortShort = 1;
94 short dstPortShort = 1;
95
96 //
97 // Initialize the source and destination points
98 //
99 Dpid srcDpid = new Dpid(srcDpidStr);
100 Port srcPort = new Port(srcPortShort);
101 Dpid dstDpid = new Dpid(dstDpidStr);
102 Port dstPort = new Port(dstPortShort);
103 SwitchPort srcSwitchPort = new SwitchPort(srcDpid, srcPort);
104 SwitchPort dstSwitchPort = new SwitchPort(dstDpid, dstPort);
105
106 //
107 // Test a valid Shortest-Path computation
108 //
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700109 Topology topology = topologyManager.newDatabaseTopology();
110 dataPath = topologyManager.getTopologyShortestPath(topology,
111 srcSwitchPort,
112 dstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700113 assertTrue(dataPath != null);
114 String dataPathSummaryStr = dataPath.dataPathSummary();
115 // System.out.println(dataPathSummaryStr);
116 String expectedResult = "1/00:00:00:00:00:00:0a:01/2;1/00:00:00:00:00:00:0a:03/2;2/00:00:00:00:00:00:0a:04/3;1/00:00:00:00:00:00:0a:06/1;";
117 assertEquals(dataPathSummaryStr, expectedResult);
118
Pavlin Radoslavov204b2862013-07-12 14:15:36 -0700119 // Test if we apply various Flow Path Flags
120 String expectedResult2 = "1/00:00:00:00:00:00:0a:03/2;2/00:00:00:00:00:00:0a:04/3;1/00:00:00:00:00:00:0a:06/1;";
121 String expectedResult3 = "1/00:00:00:00:00:00:0a:03/2;";
122 FlowPathFlags flowPathFlags2 = new FlowPathFlags("DISCARD_FIRST_HOP_ENTRY");
123 FlowPathFlags flowPathFlags3 = new FlowPathFlags("KEEP_ONLY_FIRST_HOP_ENTRY");
124 //
125 dataPath.applyFlowPathFlags(flowPathFlags2);
126 dataPathSummaryStr = dataPath.dataPathSummary();
127 assertEquals(dataPathSummaryStr, expectedResult2);
128 //
129 dataPath.applyFlowPathFlags(flowPathFlags3);
130 dataPathSummaryStr = dataPath.dataPathSummary();
131 assertEquals(dataPathSummaryStr, expectedResult3);
132
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700133 //
134 // Test Shortest-Path computation to non-existing destination
135 //
136 String noSuchDpidStr = "ff:ff:00:00:00:00:0a:06";
137 Dpid noSuchDstDpid = new Dpid(noSuchDpidStr);
138 SwitchPort noSuchDstSwitchPort = new SwitchPort(noSuchDstDpid, dstPort);
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700139 dataPath = topologyManager.getTopologyShortestPath(topology,
140 srcSwitchPort,
141 noSuchDstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700142 assertTrue(dataPath == null);
143
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700144 topologyManager.dropTopology(topology);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700145 }
146
147 /**
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700148 * Test method TopologyManager.getDatabaseShortestPath()
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700149 *
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700150 * @see net.onrc.onos.ofcontroller.routing.TopologyManager#getDatabaseShortestPath
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700151 */
152 @Test
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700153 public void test_getDatabaseShortestPath() {
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700154 DataPath dataPath = null;
155 String srcDpidStr = "00:00:00:00:00:00:0a:01";
156 String dstDpidStr = "00:00:00:00:00:00:0a:06";
157 short srcPortShort = 1;
158 short dstPortShort = 1;
159
160 //
161 // Initialize the source and destination points
162 //
163 Dpid srcDpid = new Dpid(srcDpidStr);
164 Port srcPort = new Port(srcPortShort);
165 Dpid dstDpid = new Dpid(dstDpidStr);
166 Port dstPort = new Port(dstPortShort);
167 SwitchPort srcSwitchPort = new SwitchPort(srcDpid, srcPort);
168 SwitchPort dstSwitchPort = new SwitchPort(dstDpid, dstPort);
169
170 //
171 // Test a valid Shortest-Path computation
172 //
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700173 dataPath = topologyManager.getDatabaseShortestPath(srcSwitchPort,
174 dstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700175 assertTrue(dataPath != null);
176 String dataPathSummaryStr = dataPath.dataPathSummary();
177 // System.out.println(dataPathSummaryStr);
178 String expectedResult = "1/00:00:00:00:00:00:0a:01/2;1/00:00:00:00:00:00:0a:03/2;2/00:00:00:00:00:00:0a:04/3;1/00:00:00:00:00:00:0a:06/1;";
179 assertEquals(dataPathSummaryStr, expectedResult);
180
Pavlin Radoslavov204b2862013-07-12 14:15:36 -0700181 // Test if we apply various Flow Path Flags
182 String expectedResult2 = "1/00:00:00:00:00:00:0a:03/2;2/00:00:00:00:00:00:0a:04/3;1/00:00:00:00:00:00:0a:06/1;";
183 String expectedResult3 = "1/00:00:00:00:00:00:0a:03/2;";
184 FlowPathFlags flowPathFlags2 = new FlowPathFlags("DISCARD_FIRST_HOP_ENTRY");
185 FlowPathFlags flowPathFlags3 = new FlowPathFlags("KEEP_ONLY_FIRST_HOP_ENTRY");
186 //
187 dataPath.applyFlowPathFlags(flowPathFlags2);
188 dataPathSummaryStr = dataPath.dataPathSummary();
189 assertEquals(dataPathSummaryStr, expectedResult2);
190 //
191 dataPath.applyFlowPathFlags(flowPathFlags3);
192 dataPathSummaryStr = dataPath.dataPathSummary();
193 assertEquals(dataPathSummaryStr, expectedResult3);
194
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700195 //
196 // Test Shortest-Path computation to non-existing destination
197 //
198 String noSuchDpidStr = "ff:ff:00:00:00:00:0a:06";
199 Dpid noSuchDstDpid = new Dpid(noSuchDpidStr);
200 SwitchPort noSuchDstSwitchPort = new SwitchPort(noSuchDstDpid, dstPort);
201
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700202 dataPath = topologyManager.getDatabaseShortestPath(srcSwitchPort,
203 noSuchDstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700204 assertTrue(dataPath == null);
205 }
206
207 /**
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -0700208 * Test method TopologyManager.routeExists()
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700209 *
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -0700210 * @see net.onrc.onos.ofcontroller.routing.TopologyManager#routeExists
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700211 */
212 @Test
213 public void test_routeExists() {
214 Boolean result;
215 String srcDpidStr = "00:00:00:00:00:00:0a:01";
216 String dstDpidStr = "00:00:00:00:00:00:0a:06";
217 short srcPortShort = 1;
218 short dstPortShort = 1;
219
220 //
221 // Initialize the source and destination points
222 //
223 Dpid srcDpid = new Dpid(srcDpidStr);
224 Port srcPort = new Port(srcPortShort);
225 Dpid dstDpid = new Dpid(dstDpidStr);
226 Port dstPort = new Port(dstPortShort);
227 SwitchPort srcSwitchPort = new SwitchPort(srcDpid, srcPort);
228 SwitchPort dstSwitchPort = new SwitchPort(dstDpid, dstPort);
229
230 //
231 // Test a valid route
232 //
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -0700233 result = topologyManager.routeExists(srcSwitchPort, dstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700234 assertTrue(result == true);
235
236 //
237 // Test a non-existing route
238 //
239 String noSuchDpidStr = "ff:ff:00:00:00:00:0a:06";
240 Dpid noSuchDstDpid = new Dpid(noSuchDpidStr);
241 SwitchPort noSuchDstSwitchPort = new SwitchPort(noSuchDstDpid, dstPort);
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -0700242 result = topologyManager.routeExists(srcSwitchPort,
243 noSuchDstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700244 assertTrue(result != true);
245 }
246}