blob: 8cacabc5bf8f02c5a376cac05f7d505ea2ce6cf0 [file] [log] [blame]
Jonathan Hartaa380972014-04-03 10:24:46 -07001package net.onrc.onos.core.intent.runtime;
Toshio Koidec87810e2014-02-11 13:03:21 -08002
Jonathan Harta88fd242014-04-03 11:24:54 -07003import static org.easymock.EasyMock.anyObject;
4import static org.easymock.EasyMock.createMock;
5import static org.easymock.EasyMock.eq;
6import static org.easymock.EasyMock.expect;
7import static org.easymock.EasyMock.expectLastCall;
8import static org.easymock.EasyMock.replay;
9import static org.easymock.EasyMock.verify;
Toshio Koide066506e2014-02-20 19:52:09 -080010
Pavlin Radoslavov74986ce2014-02-20 13:17:20 -080011import java.util.LinkedList;
Brian O'Connor12861f72014-02-19 20:40:32 -080012import java.util.List;
13import java.util.Set;
14
Toshio Koide27ffd412014-02-18 19:15:27 -080015import net.floodlightcontroller.core.module.FloodlightModuleContext;
16import net.floodlightcontroller.core.module.FloodlightModuleException;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070017import net.floodlightcontroller.restserver.IRestApiService;
18
Jonathan Hart6df90172014-04-03 10:13:11 -070019import net.onrc.onos.core.datagrid.IDatagridService;
20import net.onrc.onos.core.datagrid.IEventChannel;
21import net.onrc.onos.core.datagrid.IEventChannelListener;
Jonathan Hartaa380972014-04-03 10:24:46 -070022import net.onrc.onos.core.intent.ConstrainedShortestPathIntent;
23import net.onrc.onos.core.intent.FlowEntry;
24import net.onrc.onos.core.intent.Intent;
Jonathan Harta88fd242014-04-03 11:24:54 -070025import net.onrc.onos.core.intent.Intent.IntentState;
26import net.onrc.onos.core.intent.IntentOperation.Operator;
Jonathan Hartaa380972014-04-03 10:24:46 -070027import net.onrc.onos.core.intent.IntentOperationList;
Jonathan Harte37e4e22014-05-13 19:12:02 -070028import net.onrc.onos.core.intent.MockTopology;
Jonathan Hartaa380972014-04-03 10:24:46 -070029import net.onrc.onos.core.intent.PathIntent;
30import net.onrc.onos.core.intent.PathIntentMap;
31import net.onrc.onos.core.intent.ShortestPathIntent;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070032import net.onrc.onos.core.intent.runtime.web.IntentWebRoutable;
Jonathan Hartdeda0ba2014-04-03 11:14:12 -070033import net.onrc.onos.core.registry.IControllerRegistryService;
Jonathan Hart472062d2014-04-03 10:56:48 -070034import net.onrc.onos.core.topology.DeviceEvent;
Jonathan Harte37e4e22014-05-13 19:12:02 -070035import net.onrc.onos.core.topology.ITopologyListener;
36import net.onrc.onos.core.topology.ITopologyService;
Jonathan Hart472062d2014-04-03 10:56:48 -070037import net.onrc.onos.core.topology.LinkEvent;
Jonathan Hart472062d2014-04-03 10:56:48 -070038import net.onrc.onos.core.topology.PortEvent;
39import net.onrc.onos.core.topology.SwitchEvent;
Jonathan Harte37e4e22014-05-13 19:12:02 -070040import net.onrc.onos.core.topology.Topology;
Toshio Koidec87810e2014-02-11 13:03:21 -080041
42import org.junit.After;
43import org.junit.Before;
44import org.junit.Test;
Nick Karanatsios8abe7172014-02-19 20:31:48 -080045import org.junit.runner.RunWith;
46import org.powermock.api.easymock.PowerMock;
47import org.powermock.core.classloader.annotations.PrepareForTest;
48import org.powermock.modules.junit4.PowerMockRunner;
Toshio Koidec87810e2014-02-11 13:03:21 -080049
50/**
Toshio Koidee04a9df2014-05-01 15:49:28 -070051 * Temporary test cases for the ONS2014 demo.
52 * These test cases should be modified and be moved to appropriate classes
53 * (ex. PathCalcRuntimeModuleTest, PlanInstallModuleTest, etc.)
54 *
Toshio Koidec87810e2014-02-11 13:03:21 -080055 * @author Toshio Koide (t-koide@onlab.us)
56 */
Nick Karanatsios8abe7172014-02-19 20:31:48 -080057@RunWith(PowerMockRunner.class)
58@PrepareForTest(PathCalcRuntimeModule.class)
Toshio Koidec87810e2014-02-11 13:03:21 -080059public class UseCaseTest {
Jonathan Harte37e4e22014-05-13 19:12:02 -070060 private Topology topology;
Ray Milkey269ffb92014-04-03 14:43:30 -070061 private FloodlightModuleContext modContext;
62 private IDatagridService datagridService;
Jonathan Harte37e4e22014-05-13 19:12:02 -070063 private ITopologyService topologyService;
Ray Milkey269ffb92014-04-03 14:43:30 -070064 private IControllerRegistryService controllerRegistryService;
65 private PersistIntent persistIntent;
Pavlin Radoslavov13669052014-05-13 10:33:39 -070066 private IRestApiService restApi;
Toshio Koidee04a9df2014-05-01 15:49:28 -070067 private IEventChannel<Long, IntentOperationList> intentOperationChannel;
68 private IEventChannel<Long, IntentStateList> intentStateChannel;
Toshio Koidec87810e2014-02-11 13:03:21 -080069
Ray Milkey269ffb92014-04-03 14:43:30 -070070 private static Long LOCAL_PORT = 0xFFFEL;
Toshio Koidefe1d5d92014-02-26 20:09:48 -080071
Ray Milkey269ffb92014-04-03 14:43:30 -070072 @SuppressWarnings("unchecked")
73 @Before
74 public void setUp() throws Exception {
Jonathan Harte37e4e22014-05-13 19:12:02 -070075 MockTopology topology = new MockTopology();
76 topology.createSampleTopology1();
77 this.topology = topology;
Toshio Koide27ffd412014-02-18 19:15:27 -080078
Ray Milkey269ffb92014-04-03 14:43:30 -070079 datagridService = createMock(IDatagridService.class);
Jonathan Harte37e4e22014-05-13 19:12:02 -070080 topologyService = createMock(ITopologyService.class);
Ray Milkey269ffb92014-04-03 14:43:30 -070081 controllerRegistryService = createMock(IControllerRegistryService.class);
82 modContext = createMock(FloodlightModuleContext.class);
Toshio Koidee04a9df2014-05-01 15:49:28 -070083 intentOperationChannel = createMock(IEventChannel.class);
84 intentStateChannel = createMock(IEventChannel.class);
Ray Milkey269ffb92014-04-03 14:43:30 -070085 persistIntent = PowerMock.createMock(PersistIntent.class);
Pavlin Radoslavov13669052014-05-13 10:33:39 -070086 restApi = createMock(IRestApiService.class);
Toshio Koide798bc1b2014-02-20 14:02:40 -080087
Ray Milkey269ffb92014-04-03 14:43:30 -070088 PowerMock.expectNew(PersistIntent.class,
Pavlin Radoslavov0294e052014-04-10 13:36:45 -070089 anyObject(IControllerRegistryService.class)).andReturn(persistIntent);
Toshio Koide27ffd412014-02-18 19:15:27 -080090
Ray Milkey269ffb92014-04-03 14:43:30 -070091 expect(modContext.getServiceImpl(IDatagridService.class))
92 .andReturn(datagridService).once();
Jonathan Harte37e4e22014-05-13 19:12:02 -070093 expect(modContext.getServiceImpl(ITopologyService.class))
94 .andReturn(topologyService).once();
Ray Milkey269ffb92014-04-03 14:43:30 -070095 expect(modContext.getServiceImpl(IControllerRegistryService.class))
96 .andReturn(controllerRegistryService).once();
97 expect(persistIntent.getKey()).andReturn(1L).anyTimes();
98 expect(persistIntent.persistIfLeader(eq(1L),
99 anyObject(IntentOperationList.class))).andReturn(true).anyTimes();
Pavlin Radoslavov13669052014-05-13 10:33:39 -0700100 expect(modContext.getServiceImpl(IRestApiService.class))
101 .andReturn(restApi).once();
Toshio Koide0c9106d2014-02-19 15:26:38 -0800102
Jonathan Harte37e4e22014-05-13 19:12:02 -0700103 expect(topologyService.getTopology()).andReturn(topology).anyTimes();
104 topologyService.registerTopologyListener(anyObject(ITopologyListener.class));
Ray Milkey269ffb92014-04-03 14:43:30 -0700105 expectLastCall();
Toshio Koide0c9106d2014-02-19 15:26:38 -0800106
Ray Milkey269ffb92014-04-03 14:43:30 -0700107 expect(datagridService.createChannel("onos.pathintent", Long.class, IntentOperationList.class))
Toshio Koidee04a9df2014-05-01 15:49:28 -0700108 .andReturn(intentOperationChannel).once();
Toshio Koide27ffd412014-02-18 19:15:27 -0800109
Ray Milkey269ffb92014-04-03 14:43:30 -0700110 expect(datagridService.addListener(
111 eq("onos.pathintent_state"),
112 anyObject(IEventChannelListener.class),
113 eq(Long.class),
114 eq(IntentStateList.class)))
Toshio Koidee04a9df2014-05-01 15:49:28 -0700115 .andReturn(intentStateChannel).once();
Pavlin Radoslavov13669052014-05-13 10:33:39 -0700116 restApi.addRestletRoutable(anyObject(IntentWebRoutable.class));
Toshio Koide066506e2014-02-20 19:52:09 -0800117
Ray Milkey269ffb92014-04-03 14:43:30 -0700118 replay(datagridService);
Jonathan Harte37e4e22014-05-13 19:12:02 -0700119 replay(topologyService);
Ray Milkey269ffb92014-04-03 14:43:30 -0700120 replay(modContext);
121 replay(controllerRegistryService);
122 PowerMock.replay(persistIntent, PersistIntent.class);
Pavlin Radoslavov13669052014-05-13 10:33:39 -0700123 replay(restApi);
Ray Milkey269ffb92014-04-03 14:43:30 -0700124 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800125
Ray Milkey269ffb92014-04-03 14:43:30 -0700126 @After
127 public void tearDown() {
128 verify(datagridService);
Jonathan Harte37e4e22014-05-13 19:12:02 -0700129 verify(topologyService);
Ray Milkey269ffb92014-04-03 14:43:30 -0700130 verify(modContext);
131 verify(controllerRegistryService);
132 PowerMock.verify(persistIntent, PersistIntent.class);
Pavlin Radoslavov13669052014-05-13 10:33:39 -0700133 verify(restApi);
Ray Milkey269ffb92014-04-03 14:43:30 -0700134 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800135
Ray Milkey269ffb92014-04-03 14:43:30 -0700136 private void showResult(PathIntentMap intents) {
137 for (Intent intent : intents.getAllIntents()) {
138 PathIntent pathIntent = (PathIntent) intent;
139 System.out.println("Path intent:" + pathIntent);
140 System.out.println("Parent intent: " + pathIntent.getParentIntent().toString());
141 }
142 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800143
Ray Milkey269ffb92014-04-03 14:43:30 -0700144 @Test
145 public void createShortestPaths() throws FloodlightModuleException {
146 // create shortest path intents
147 IntentOperationList opList = new IntentOperationList();
148 opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 12L, LOCAL_PORT, 2L, 21L, LOCAL_PORT));
149 opList.add(Operator.ADD, new ShortestPathIntent("2", 1L, 14L, LOCAL_PORT, 4L, 41L, LOCAL_PORT));
150 opList.add(Operator.ADD, new ShortestPathIntent("3", 2L, 23L, LOCAL_PORT, 3L, 32L, LOCAL_PORT));
Toshio Koidec87810e2014-02-11 13:03:21 -0800151
Ray Milkey269ffb92014-04-03 14:43:30 -0700152 // compile high-level intent operations into low-level intent operations (calculate paths)
153 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
154 runtime1.init(modContext);
155 runtime1.startUp(modContext);
156 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koide27ffd412014-02-18 19:15:27 -0800157
Ray Milkey269ffb92014-04-03 14:43:30 -0700158 // compile low-level intents into flow entry installation plan
159 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
160 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800161
Ray Milkey269ffb92014-04-03 14:43:30 -0700162 // show results
163 showResult((PathIntentMap) runtime1.getPathIntents());
164 System.out.println(plan);
165 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800166
Ray Milkey269ffb92014-04-03 14:43:30 -0700167 @Test
168 public void createConstrainedShortestPaths() throws FloodlightModuleException {
169 // create constrained shortest path intents
170 IntentOperationList opList = new IntentOperationList();
171 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("1", 1L, 12L, LOCAL_PORT, 2L, 21L, LOCAL_PORT, 400.0));
172 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("2", 1L, 14L, LOCAL_PORT, 4L, 41L, LOCAL_PORT, 400.0));
173 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("3", 2L, 24L, LOCAL_PORT, 4L, 42L, LOCAL_PORT, 400.0));
174 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("4", 2L, 23L, LOCAL_PORT, 3L, 32L, LOCAL_PORT, 400.0));
175 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("5", 3L, 34L, LOCAL_PORT, 4L, 43L, LOCAL_PORT, 400.0));
Toshio Koidec87810e2014-02-11 13:03:21 -0800176
Ray Milkey269ffb92014-04-03 14:43:30 -0700177 // compile high-level intent operations into low-level intent operations (calculate paths)
178 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
179 runtime1.init(modContext);
180 runtime1.startUp(modContext);
181 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800182
Ray Milkey269ffb92014-04-03 14:43:30 -0700183 // compile low-level intents into flow entry installation plan
184 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
185 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800186
Ray Milkey269ffb92014-04-03 14:43:30 -0700187 // show results
188 showResult((PathIntentMap) runtime1.getPathIntents());
189 System.out.println(plan);
190 }
Toshio Koidec87810e2014-02-11 13:03:21 -0800191
Ray Milkey269ffb92014-04-03 14:43:30 -0700192 @Test
193 public void createMixedShortestPaths() throws FloodlightModuleException {
194 // create constrained & best effort shortest path intents
195 IntentOperationList opList = new IntentOperationList();
196 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("1", 1L, 12L, LOCAL_PORT, 2L, 21L, LOCAL_PORT, 400.0));
197 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("2", 1L, 14L, LOCAL_PORT, 4L, 41L, LOCAL_PORT, 400.0));
198 opList.add(Operator.ADD, new ShortestPathIntent("3", 2L, 24L, LOCAL_PORT, 4L, 42L, LOCAL_PORT));
199 opList.add(Operator.ADD, new ShortestPathIntent("4", 2L, 23L, LOCAL_PORT, 3L, 32L, LOCAL_PORT));
200 opList.add(Operator.ADD, new ConstrainedShortestPathIntent("5", 3L, 34L, LOCAL_PORT, 4L, 43L, LOCAL_PORT, 400.0));
Toshio Koidec87810e2014-02-11 13:03:21 -0800201
Ray Milkey269ffb92014-04-03 14:43:30 -0700202 // compile high-level intent operations into low-level intent operations (calculate paths)
203 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
204 runtime1.init(modContext);
205 runtime1.startUp(modContext);
206 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koidec87810e2014-02-11 13:03:21 -0800207
Ray Milkey269ffb92014-04-03 14:43:30 -0700208 // compile low-level intents into flow entry installation plan
209 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
210 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Brian O'Connor7f8e3012014-02-15 23:59:29 -0800211
Ray Milkey269ffb92014-04-03 14:43:30 -0700212 // show results
213 showResult((PathIntentMap) runtime1.getPathIntents());
214 System.out.println(plan);
215 }
Toshio Koided9fa2a82014-02-19 17:35:18 -0800216
Ray Milkey269ffb92014-04-03 14:43:30 -0700217 @Test
218 public void rerouteShortestPaths() throws FloodlightModuleException {
219 List<SwitchEvent> addedSwitchEvents = new LinkedList<>();
220 List<SwitchEvent> removedSwitchEvents = new LinkedList<>();
221 List<PortEvent> addedPortEvents = new LinkedList<>();
222 List<PortEvent> removedPortEvents = new LinkedList<>();
223 List<LinkEvent> addedLinkEvents = new LinkedList<>();
224 List<LinkEvent> removedLinkEvents = new LinkedList<>();
225 List<DeviceEvent> addedDeviceEvents = new LinkedList<>();
226 List<DeviceEvent> removedDeviceEvents = new LinkedList<>();
Pavlin Radoslavov74986ce2014-02-20 13:17:20 -0800227
Ray Milkey269ffb92014-04-03 14:43:30 -0700228 // create shortest path intents
229 IntentOperationList opList = new IntentOperationList();
230 opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 12L, LOCAL_PORT, 2L, 21L, LOCAL_PORT));
231 opList.add(Operator.ADD, new ShortestPathIntent("2", 1L, 14L, LOCAL_PORT, 4L, 41L, LOCAL_PORT));
232 opList.add(Operator.ADD, new ShortestPathIntent("3", 2L, 23L, LOCAL_PORT, 3L, 32L, LOCAL_PORT));
Toshio Koide0c9106d2014-02-19 15:26:38 -0800233
Ray Milkey269ffb92014-04-03 14:43:30 -0700234 // compile high-level intent operations into low-level intent operations (calculate paths)
235 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
236 runtime1.init(modContext);
237 runtime1.startUp(modContext);
238 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800239
Ray Milkey269ffb92014-04-03 14:43:30 -0700240 // compile low-level intents into flow entry installation plan
241 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
242 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800243
Ray Milkey269ffb92014-04-03 14:43:30 -0700244 // show results step1
245 showResult((PathIntentMap) runtime1.getPathIntents());
246 System.out.println(plan);
Toshio Koide0c9106d2014-02-19 15:26:38 -0800247
Ray Milkey269ffb92014-04-03 14:43:30 -0700248 // TODO this state changes should be triggered by notification of plan module
249 IntentStateList states = new IntentStateList();
250 states.put("1", IntentState.INST_ACK);
251 states.put("2", IntentState.INST_ACK);
252 states.put("3", IntentState.INST_ACK);
253 runtime1.getHighLevelIntents().changeStates(states);
254 states.clear();
255 states.put("1___0", IntentState.INST_ACK);
256 states.put("2___0", IntentState.INST_ACK);
257 states.put("3___0", IntentState.INST_ACK);
258 runtime1.getPathIntents().changeStates(states);
Toshio Koidea10c0372014-02-20 17:28:10 -0800259
Ray Milkey269ffb92014-04-03 14:43:30 -0700260 // link down
Jonathan Harte37e4e22014-05-13 19:12:02 -0700261 ((MockTopology) topology).removeLink(1L, 12L, 2L, 21L); // This link is used by the intent "1"
262 ((MockTopology) topology).removeLink(2L, 21L, 1L, 12L);
Ray Milkey269ffb92014-04-03 14:43:30 -0700263 LinkEvent linkEvent1 = new LinkEvent(1L, 12L, 2L, 21L);
264 LinkEvent linkEvent2 = new LinkEvent(2L, 21L, 1L, 12L);
265 removedLinkEvents.clear();
266 removedLinkEvents.add(linkEvent1);
267 removedLinkEvents.add(linkEvent2);
Jonathan Harte37e4e22014-05-13 19:12:02 -0700268 runtime1.topologyEvents(
Ray Milkey269ffb92014-04-03 14:43:30 -0700269 addedSwitchEvents,
270 removedSwitchEvents,
271 addedPortEvents,
272 removedPortEvents,
273 addedLinkEvents,
274 removedLinkEvents,
275 addedDeviceEvents,
276 removedDeviceEvents);
277 System.out.println("Link goes down.");
Toshio Koide0c9106d2014-02-19 15:26:38 -0800278
Ray Milkey269ffb92014-04-03 14:43:30 -0700279 // show results step2
280 showResult((PathIntentMap) runtime1.getPathIntents());
281 // TODO: show results of plan computation
282 }
Toshio Koidefa735a12014-03-28 10:49:07 -0700283
284
Ray Milkey269ffb92014-04-03 14:43:30 -0700285 @Test
286 public void createAndRemoveShortestPaths() throws FloodlightModuleException {
287 // create shortest path intents
288 IntentOperationList opList = new IntentOperationList();
289 opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 12L, LOCAL_PORT, 2L, 21L, LOCAL_PORT));
290 opList.add(Operator.ADD, new ShortestPathIntent("2", 1L, 14L, LOCAL_PORT, 4L, 41L, LOCAL_PORT));
291 opList.add(Operator.ADD, new ShortestPathIntent("3", 2L, 23L, LOCAL_PORT, 3L, 32L, LOCAL_PORT));
Toshio Koidefa735a12014-03-28 10:49:07 -0700292
Ray Milkey269ffb92014-04-03 14:43:30 -0700293 // compile high-level intent operations into low-level intent operations (calculate paths)
294 PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
295 runtime1.init(modContext);
296 runtime1.startUp(modContext);
297 IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
Toshio Koidefa735a12014-03-28 10:49:07 -0700298
Ray Milkey269ffb92014-04-03 14:43:30 -0700299 // compile low-level intents into flow entry installation plan
300 PlanCalcRuntime runtime2 = new PlanCalcRuntime();
301 List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
Toshio Koidefa735a12014-03-28 10:49:07 -0700302
Ray Milkey269ffb92014-04-03 14:43:30 -0700303 // show results
304 showResult((PathIntentMap) runtime1.getPathIntents());
305 System.out.println(plan);
Toshio Koidefa735a12014-03-28 10:49:07 -0700306
Ray Milkey269ffb92014-04-03 14:43:30 -0700307 // create remove operations
308 opList.clear();
309 opList.add(Operator.REMOVE, new Intent("1"));
310 opList.add(Operator.REMOVE, new Intent("2"));
Toshio Koidefa735a12014-03-28 10:49:07 -0700311
Ray Milkey269ffb92014-04-03 14:43:30 -0700312 // compile
313 runtime1.executeIntentOperations(opList);
Toshio Koidefa735a12014-03-28 10:49:07 -0700314
Ray Milkey269ffb92014-04-03 14:43:30 -0700315 // show results
316 showResult((PathIntentMap) runtime1.getPathIntents());
317 System.out.println(plan);
318 }
Toshio Koidefa735a12014-03-28 10:49:07 -0700319
Toshio Koidec87810e2014-02-11 13:03:21 -0800320}