Change calcPathIntent method to accept IntentOperationList

PathCalcRuntime.calcPathIntent()
 - accepts app-level IntentOperationList
 - returns PathIntents' IntentOperationList

PathCalcRuntimeModule class
 - retains app-level intents and path-level intents
 - publishes PathIntents' IntentOperationList

Change-Id: I70576390437f36d8b88849c0098966994b29900d
diff --git a/src/test/java/net/onrc/onos/intent/runtime/UseCaseTest.java b/src/test/java/net/onrc/onos/intent/runtime/UseCaseTest.java
index e32da32..c12a718 100644
--- a/src/test/java/net/onrc/onos/intent/runtime/UseCaseTest.java
+++ b/src/test/java/net/onrc/onos/intent/runtime/UseCaseTest.java
@@ -1,15 +1,22 @@
 package net.onrc.onos.intent.runtime;
 
-import java.util.LinkedList;
-
+import net.floodlightcontroller.core.module.FloodlightModuleContext;
+import net.floodlightcontroller.core.module.FloodlightModuleException;
+import net.onrc.onos.datagrid.IDatagridService;
+import net.onrc.onos.datagrid.IEventChannel;
 import net.onrc.onos.intent.ConstrainedShortestPathIntent;
 import net.onrc.onos.intent.Intent;
+import net.onrc.onos.intent.IntentOperation.Operator;
+import net.onrc.onos.intent.IntentOperationList;
 import net.onrc.onos.intent.MockNetworkGraph;
 import net.onrc.onos.intent.PathIntent;
 import net.onrc.onos.intent.PathIntentMap;
 import net.onrc.onos.intent.ShortestPathIntent;
-import net.onrc.onos.ofcontroller.networkgraph.*;
+import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
+import net.onrc.onos.ofcontroller.networkgraph.Link;
+import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
 
+import org.easymock.EasyMock;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -18,17 +25,46 @@
  * @author Toshio Koide (t-koide@onlab.us)
  */
 public class UseCaseTest {
-	NetworkGraph g;
+	private NetworkGraph g;
+	private FloodlightModuleContext modContext;
+	private IDatagridService datagridService;
+	private INetworkGraphService networkGraphService;
+	@SuppressWarnings("rawtypes")
+	private IEventChannel eventChannel;
 
+	@SuppressWarnings("unchecked")
 	@Before
 	public void setUp() {
 		MockNetworkGraph graph = new MockNetworkGraph();
 		graph.createSampleTopology();
 		g = graph;
+
+		datagridService = EasyMock.createMock(IDatagridService.class);
+		networkGraphService = EasyMock.createMock(INetworkGraphService.class);
+		modContext = EasyMock.createMock(FloodlightModuleContext.class);
+		eventChannel = EasyMock.createMock(IEventChannel.class);
+
+		EasyMock.expect(modContext.getServiceImpl(EasyMock.eq(IDatagridService.class)))
+		.andReturn(datagridService).once();
+		EasyMock.expect(modContext.getServiceImpl(EasyMock.eq(INetworkGraphService.class)))
+		.andReturn(networkGraphService).once();
+		
+		networkGraphService.getNetworkGraph();
+		EasyMock.expectLastCall().andReturn(g).anyTimes();
+		
+		EasyMock.expect(datagridService.createChannel("onos.pathintent", byte[].class, IntentOperationList.class))
+		.andReturn(eventChannel).once();
+
+		EasyMock.replay(datagridService);
+		EasyMock.replay(networkGraphService);
+		EasyMock.replay(modContext);
 	}
 
 	@After
 	public void tearDown() {
+		EasyMock.verify(datagridService);
+		EasyMock.verify(networkGraphService);
+		EasyMock.verify(modContext);
 	}
 
 	private void showResult(PathIntentMap intents) {
@@ -47,69 +83,75 @@
 	}
 
 	@Test
-	public void useCase1() {
+	public void useCase1() throws FloodlightModuleException {
 		// create shortest path intents
-		LinkedList<Intent> intents = new LinkedList<Intent>();
-		intents.add(new ShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 4L));
-		intents.add(new ShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 5L));
-		intents.add(new ShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 6L));
+		IntentOperationList opList = new IntentOperationList();
+		opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 4L));
+		opList.add(Operator.ADD, new ShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 5L));
+		opList.add(Operator.ADD, new ShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 6L));
 
-		// compile high-level intents into low-level intents (calculate paths)
-		PathCalcRuntime runtime1 = new PathCalcRuntime(g);
-		PathIntentMap pathIntents = runtime1.calcPathIntents(intents, new PathIntentMap(g));
-		
+		// compile high-level intent operations into low-level intent operations (calculate paths)
+		PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
+		runtime1.init(modContext);
+		runtime1.startUp(modContext);
+		IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
+
 		// compile low-level intents into flow entry installation plan
 		PlanCalcRuntime runtime2 = new PlanCalcRuntime(g);
-		runtime2.addIntents(pathIntents);
+		runtime2.addIntents((PathIntentMap) runtime1.getPathIntents()); // TODO use pathIntentOpList
 
 		// show results
-		showResult(pathIntents);
+		showResult((PathIntentMap) runtime1.getPathIntents());
 		System.out.println(runtime2.getPlan());
 	}
 
 	@Test
-	public void useCase2() {
+	public void useCase2() throws FloodlightModuleException {
 		// create constrained shortest path intents
-		LinkedList<Intent> intents = new LinkedList<Intent>();
-		intents.add(new ConstrainedShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 17L, 400.0));
-		intents.add(new ConstrainedShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 18L, 400.0));
-		intents.add(new ConstrainedShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 19L, 400.0));
-		intents.add(new ConstrainedShortestPathIntent("4", 3L, 20L, 4L, 8L, 20L, 20L, 400.0));
-		intents.add(new ConstrainedShortestPathIntent("5", 4L, 20L, 5L, 8L, 20L, 21L, 400.0));
+		IntentOperationList opList = new IntentOperationList();
+		opList.add(Operator.ADD, new ConstrainedShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 17L, 400.0));
+		opList.add(Operator.ADD, new ConstrainedShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 18L, 400.0));
+		opList.add(Operator.ADD, new ConstrainedShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 19L, 400.0));
+		opList.add(Operator.ADD, new ConstrainedShortestPathIntent("4", 3L, 20L, 4L, 8L, 20L, 20L, 400.0));
+		opList.add(Operator.ADD, new ConstrainedShortestPathIntent("5", 4L, 20L, 5L, 8L, 20L, 21L, 400.0));
 
-		// compile high-level intents into low-level intents (calculate paths)
-		PathCalcRuntime runtime1 = new PathCalcRuntime(g);
-		PathIntentMap pathIntents = runtime1.calcPathIntents(intents, new PathIntentMap(g));
+		// compile high-level intent operations into low-level intent operations (calculate paths)
+		PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
+		runtime1.init(modContext);
+		runtime1.startUp(modContext);
+		IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
 
 		// compile low-level intents into flow entry installation plan
 		PlanCalcRuntime runtime2 = new PlanCalcRuntime(g);
-		runtime2.addIntents(pathIntents);
+		runtime2.addIntents((PathIntentMap) runtime1.getPathIntents()); // TODO use pathIntentOpList
 
 		// show results
-		showResult(pathIntents);
+		showResult((PathIntentMap) runtime1.getPathIntents());
 		System.out.println(runtime2.getPlan());
 	}
 
 	@Test
-	public void useCase3() {
+	public void useCase3() throws FloodlightModuleException {
 		// create constrained & not best effort shortest path intents
-		LinkedList<Intent> intents = new LinkedList<Intent>();
-		intents.add(new ConstrainedShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 6L, 600.0));
-		intents.add(new ConstrainedShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 7L, 600.0));
-		intents.add(new ShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 8L));
-		intents.add(new ShortestPathIntent("4", 4L, 20L, 4L, 8L, 20L, 9L));
-		intents.add(new ConstrainedShortestPathIntent("5", 4L, 20L, 5L, 8L, 20L, 10L, 600.0));
+		IntentOperationList opList = new IntentOperationList();
+		opList.add(Operator.ADD, new ConstrainedShortestPathIntent("1", 1L, 20L, 1L, 4L, 20L, 6L, 600.0));
+		opList.add(Operator.ADD, new ConstrainedShortestPathIntent("2", 2L, 20L, 2L, 6L, 20L, 7L, 600.0));
+		opList.add(Operator.ADD, new ShortestPathIntent("3", 4L, 20L, 3L, 8L, 20L, 8L));
+		opList.add(Operator.ADD, new ShortestPathIntent("4", 4L, 20L, 4L, 8L, 20L, 9L));
+		opList.add(Operator.ADD, new ConstrainedShortestPathIntent("5", 4L, 20L, 5L, 8L, 20L, 10L, 600.0));
 
-		// compile high-level intents into low-level intents (calculate paths)
-		PathCalcRuntime runtime1 = new PathCalcRuntime(g);
-		PathIntentMap pathIntents = runtime1.calcPathIntents(intents, new PathIntentMap(g));
+		// compile high-level intent operations into low-level intent operations (calculate paths)
+		PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
+		runtime1.init(modContext);
+		runtime1.startUp(modContext);
+		IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
 
 		// compile low-level intents into flow entry installation plan
 		PlanCalcRuntime runtime2 = new PlanCalcRuntime(g);
-		runtime2.addIntents(pathIntents);
+		runtime2.addIntents((PathIntentMap) runtime1.getPathIntents()); // TODO use pathIntentOpList
 
 		// show results
-		showResult(pathIntents);
+		showResult((PathIntentMap) runtime1.getPathIntents());
 		System.out.println(runtime2.getPlan());
 	}
 }