blob: 09d0a0072f15be53013d041e80eec6c9eb034257 [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 -07005import java.util.Map;
6
7import org.easymock.EasyMock;
8
9import org.junit.After;
10import org.junit.Before;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070011import org.junit.Test;
12import org.junit.runner.RunWith;
13
14import org.powermock.api.easymock.PowerMock;
15import org.powermock.core.classloader.annotations.PrepareForTest;
16import org.powermock.modules.junit4.PowerMockRunner;
17
18import com.thinkaurelius.titan.core.TitanGraph;
19import com.thinkaurelius.titan.core.TitanFactory;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070020import net.onrc.onos.graph.GraphDBConnection;
21import net.onrc.onos.graph.GraphDBOperation;
22import net.onrc.onos.ofcontroller.core.internal.TestDatabaseManager;
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -070023import net.onrc.onos.ofcontroller.topology.TopologyManager;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070024import net.onrc.onos.ofcontroller.util.DataPath;
25import net.onrc.onos.ofcontroller.util.Dpid;
Pavlin Radoslavov204b2862013-07-12 14:15:36 -070026import net.onrc.onos.ofcontroller.util.FlowPathFlags;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070027import net.onrc.onos.ofcontroller.util.Port;
28import net.onrc.onos.ofcontroller.util.SwitchPort;
29
30/**
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -070031 * A class for testing the TopologyManager class.
32 * @see net.onrc.onos.ofcontroller.topology.TopologyManager
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070033 */
34@RunWith(PowerMockRunner.class)
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -070035@PrepareForTest({TitanFactory.class, GraphDBConnection.class, GraphDBOperation.class, TopologyManager.class})
Pavlin Radoslavov8e7ba4b2013-10-16 04:04:27 -070036public class TopologyManagerTest {
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070037 String conf;
38 private GraphDBConnection conn = null;
39 private GraphDBOperation oper = null;
40 private TitanGraph titanGraph = null;
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -070041 private TopologyManager topologyManager = null;
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070042
43 /**
44 * Setup the tests.
45 */
46 @Before
47 public void setUp() throws Exception {
48 conf = "/dummy/path/to/db";
49
50 //
51 // Make mock database.
52 // Replace TitanFactory.open() to return the mock database.
53 //
54 titanGraph = TestDatabaseManager.getTestDatabase();
55 PowerMock.mockStatic(TitanFactory.class);
56 EasyMock.expect(TitanFactory.open((String)EasyMock.anyObject())).andReturn(titanGraph);
57 PowerMock.replay(TitanFactory.class);
58
59 // Create the connection to the database
60 conn = GraphDBConnection.getInstance(conf);
61 oper = new GraphDBOperation(conn);
62
63 // Populate the database
64 TestDatabaseManager.populateTestData(titanGraph);
65
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -070066 // Prepare the TopologyManager instance
Pavlin Radoslavov0367d352013-10-19 11:04:43 -070067 topologyManager = new TopologyManager(oper);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070068 }
69
70 /**
71 * Cleanup after the tests.
72 */
73 @After
74 public void tearDown() throws Exception {
75 titanGraph.shutdown();
76 TestDatabaseManager.deleteTestDatabase();
77 }
78
79 /**
Pavlin Radoslavov15954d42013-10-19 15:29:04 -070080 * Test method TopologyManager.getTopologyShortestPath()
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070081 *
Pavlin Radoslavov15954d42013-10-19 15:29:04 -070082 * @see net.onrc.onos.ofcontroller.topology.TopologyManager#getTopologyShortestPath
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070083 */
84 @Test
Pavlin Radoslavov15954d42013-10-19 15:29:04 -070085 public void test_getTopologyShortestPath() {
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -070086 DataPath dataPath = null;
87 String srcDpidStr = "00:00:00:00:00:00:0a:01";
88 String dstDpidStr = "00:00:00:00:00:00:0a:06";
89 short srcPortShort = 1;
90 short dstPortShort = 1;
91
92 //
93 // Initialize the source and destination points
94 //
95 Dpid srcDpid = new Dpid(srcDpidStr);
96 Port srcPort = new Port(srcPortShort);
97 Dpid dstDpid = new Dpid(dstDpidStr);
98 Port dstPort = new Port(dstPortShort);
99 SwitchPort srcSwitchPort = new SwitchPort(srcDpid, srcPort);
100 SwitchPort dstSwitchPort = new SwitchPort(dstDpid, dstPort);
101
102 //
103 // Test a valid Shortest-Path computation
104 //
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700105 Topology topology = topologyManager.newDatabaseTopology();
106 dataPath = topologyManager.getTopologyShortestPath(topology,
107 srcSwitchPort,
108 dstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700109 assertTrue(dataPath != null);
110 String dataPathSummaryStr = dataPath.dataPathSummary();
111 // System.out.println(dataPathSummaryStr);
112 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;";
113 assertEquals(dataPathSummaryStr, expectedResult);
114
Pavlin Radoslavov204b2862013-07-12 14:15:36 -0700115 // Test if we apply various Flow Path Flags
116 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;";
117 String expectedResult3 = "1/00:00:00:00:00:00:0a:03/2;";
118 FlowPathFlags flowPathFlags2 = new FlowPathFlags("DISCARD_FIRST_HOP_ENTRY");
119 FlowPathFlags flowPathFlags3 = new FlowPathFlags("KEEP_ONLY_FIRST_HOP_ENTRY");
120 //
121 dataPath.applyFlowPathFlags(flowPathFlags2);
122 dataPathSummaryStr = dataPath.dataPathSummary();
123 assertEquals(dataPathSummaryStr, expectedResult2);
124 //
125 dataPath.applyFlowPathFlags(flowPathFlags3);
126 dataPathSummaryStr = dataPath.dataPathSummary();
127 assertEquals(dataPathSummaryStr, expectedResult3);
128
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700129 //
130 // Test Shortest-Path computation to non-existing destination
131 //
132 String noSuchDpidStr = "ff:ff:00:00:00:00:0a:06";
133 Dpid noSuchDstDpid = new Dpid(noSuchDpidStr);
134 SwitchPort noSuchDstSwitchPort = new SwitchPort(noSuchDstDpid, dstPort);
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700135 dataPath = topologyManager.getTopologyShortestPath(topology,
136 srcSwitchPort,
137 noSuchDstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700138 assertTrue(dataPath == null);
139
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700140 topologyManager.dropTopology(topology);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700141 }
142
143 /**
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700144 * Test method TopologyManager.getDatabaseShortestPath()
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700145 *
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700146 * @see net.onrc.onos.ofcontroller.routing.TopologyManager#getDatabaseShortestPath
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700147 */
148 @Test
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700149 public void test_getDatabaseShortestPath() {
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700150 DataPath dataPath = null;
151 String srcDpidStr = "00:00:00:00:00:00:0a:01";
152 String dstDpidStr = "00:00:00:00:00:00:0a:06";
153 short srcPortShort = 1;
154 short dstPortShort = 1;
155
156 //
157 // Initialize the source and destination points
158 //
159 Dpid srcDpid = new Dpid(srcDpidStr);
160 Port srcPort = new Port(srcPortShort);
161 Dpid dstDpid = new Dpid(dstDpidStr);
162 Port dstPort = new Port(dstPortShort);
163 SwitchPort srcSwitchPort = new SwitchPort(srcDpid, srcPort);
164 SwitchPort dstSwitchPort = new SwitchPort(dstDpid, dstPort);
165
166 //
167 // Test a valid Shortest-Path computation
168 //
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700169 dataPath = topologyManager.getDatabaseShortestPath(srcSwitchPort,
170 dstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700171 assertTrue(dataPath != null);
172 String dataPathSummaryStr = dataPath.dataPathSummary();
173 // System.out.println(dataPathSummaryStr);
174 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;";
175 assertEquals(dataPathSummaryStr, expectedResult);
176
Pavlin Radoslavov204b2862013-07-12 14:15:36 -0700177 // Test if we apply various Flow Path Flags
178 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;";
179 String expectedResult3 = "1/00:00:00:00:00:00:0a:03/2;";
180 FlowPathFlags flowPathFlags2 = new FlowPathFlags("DISCARD_FIRST_HOP_ENTRY");
181 FlowPathFlags flowPathFlags3 = new FlowPathFlags("KEEP_ONLY_FIRST_HOP_ENTRY");
182 //
183 dataPath.applyFlowPathFlags(flowPathFlags2);
184 dataPathSummaryStr = dataPath.dataPathSummary();
185 assertEquals(dataPathSummaryStr, expectedResult2);
186 //
187 dataPath.applyFlowPathFlags(flowPathFlags3);
188 dataPathSummaryStr = dataPath.dataPathSummary();
189 assertEquals(dataPathSummaryStr, expectedResult3);
190
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700191 //
192 // Test Shortest-Path computation to non-existing destination
193 //
194 String noSuchDpidStr = "ff:ff:00:00:00:00:0a:06";
195 Dpid noSuchDstDpid = new Dpid(noSuchDpidStr);
196 SwitchPort noSuchDstSwitchPort = new SwitchPort(noSuchDstDpid, dstPort);
197
Pavlin Radoslavov15954d42013-10-19 15:29:04 -0700198 dataPath = topologyManager.getDatabaseShortestPath(srcSwitchPort,
199 noSuchDstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700200 assertTrue(dataPath == null);
201 }
202
203 /**
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -0700204 * Test method TopologyManager.routeExists()
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700205 *
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -0700206 * @see net.onrc.onos.ofcontroller.routing.TopologyManager#routeExists
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700207 */
208 @Test
209 public void test_routeExists() {
210 Boolean result;
211 String srcDpidStr = "00:00:00:00:00:00:0a:01";
212 String dstDpidStr = "00:00:00:00:00:00:0a:06";
213 short srcPortShort = 1;
214 short dstPortShort = 1;
215
216 //
217 // Initialize the source and destination points
218 //
219 Dpid srcDpid = new Dpid(srcDpidStr);
220 Port srcPort = new Port(srcPortShort);
221 Dpid dstDpid = new Dpid(dstDpidStr);
222 Port dstPort = new Port(dstPortShort);
223 SwitchPort srcSwitchPort = new SwitchPort(srcDpid, srcPort);
224 SwitchPort dstSwitchPort = new SwitchPort(dstDpid, dstPort);
225
226 //
227 // Test a valid route
228 //
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -0700229 result = topologyManager.routeExists(srcSwitchPort, dstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700230 assertTrue(result == true);
231
232 //
233 // Test a non-existing route
234 //
235 String noSuchDpidStr = "ff:ff:00:00:00:00:0a:06";
236 Dpid noSuchDstDpid = new Dpid(noSuchDpidStr);
237 SwitchPort noSuchDstSwitchPort = new SwitchPort(noSuchDstDpid, dstPort);
Pavlin Radoslavove1b37bc2013-10-16 03:57:06 -0700238 result = topologyManager.routeExists(srcSwitchPort,
239 noSuchDstSwitchPort);
Pavlin Radoslavove3e03dc2013-06-27 15:49:05 -0700240 assertTrue(result != true);
241 }
242}