Support state change notifications

- defined state change event channel name
- added IEventChannelListener implementations to PathCalcRuntimeModule class
- register IntentStateList class to KryoFactory

Change-Id: Ibf09ca0d400954cba27e4dbc3f8c97a91d261435
diff --git a/src/test/java/net/onrc/onos/intent/IntentMapTest.java b/src/test/java/net/onrc/onos/intent/IntentMapTest.java
index bad546d..b636167 100644
--- a/src/test/java/net/onrc/onos/intent/IntentMapTest.java
+++ b/src/test/java/net/onrc/onos/intent/IntentMapTest.java
@@ -1,12 +1,21 @@
 package net.onrc.onos.intent;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import net.onrc.onos.intent.ErrorIntent.ErrorType;
 import net.onrc.onos.intent.Intent.IntentState;
+import net.onrc.onos.intent.IntentMap.ChangedEventType;
+import net.onrc.onos.intent.IntentOperation.Operator;
+import net.onrc.onos.intent.runtime.IntentStateList;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+/**
+ * @author Toshio Koide (t-koide@onlab.us)
+ */
 public class IntentMapTest {
 
 	@Before
@@ -18,55 +27,212 @@
 	}
 
 	@Test
-	public void test() {
+	public void testCreate() {
 		IntentMap intents = new IntentMap();
-		IntentOperationList operations = new IntentOperationList();
+		assertEquals(0, intents.getAllIntents().size());
+	}
 
-		// add three intents
+	@Test
+	public void testChangedEventCreate() {
+		IntentMap intents = new IntentMap();
+		IntentMap.ChangedEvent event = intents.new ChangedEvent(
+				ChangedEventType.ADDED,
+				new Intent("id1"));
+		assertEquals(ChangedEventType.ADDED, event.eventType);
+		assertEquals("id1", event.intent.getId());
+	}
 
-		ShortestPathIntent intent1 =
-				new ShortestPathIntent("1", 11L, 12L, 13L, 14L, 15L, 16L);
+	@Test
+	public void testAddOperations() {
+		IntentMap intents = new IntentMap();
+		assertEquals(0, intents.getAllIntents().size());
+
+		Intent intent1 = new Intent("1");
 		ShortestPathIntent intent2 =
 				new ShortestPathIntent("2", 21L, 22L, 23L, 24L, 25L, 26L);
 		ConstrainedShortestPathIntent intent3 =
 				new ConstrainedShortestPathIntent("3", 31L, 32L, 33L, 34L, 35L, 36L, 1000.0);
 
-		operations.add(new IntentOperation(IntentOperation.Operator.ADD, intent1));
-		operations.add(new IntentOperation(IntentOperation.Operator.ADD, intent2));
-		operations.add(new IntentOperation(IntentOperation.Operator.ADD, intent3));
+		IntentOperationList operations = new IntentOperationList();
+		operations.add(Operator.ADD, intent1);
+		operations.add(Operator.ADD, intent2);
+		operations.add(Operator.ADD, intent3);
+		assertEquals(3, operations.size());
+
 		intents.executeOperations(operations);
-
-		// check
-
 		assertEquals(3, intents.getAllIntents().size());
-		assertEquals(intent1, intents.getIntent("1"));
-		assertEquals(intent2, intents.getIntent("2"));
-		assertEquals(intent3, intents.getIntent("3"));
+		assertSame(intent1, intents.getIntent("1"));
+		assertSame(intent2, intents.getIntent("2"));
+		assertSame(intent3, intents.getIntent("3"));
+	}
 
-		// request removal of an intent
+	@Test
+	public void testAddOperationsOverwrite() {
+		IntentMap intents = new IntentMap();
 
+		Intent intent1 = new Intent("1");
+		Intent intent2 = new Intent("2");
+		Intent intent3 = new Intent("3");
 		Intent intent4 = new Intent("1");
+		Intent intent5 = new Intent("2");
+		Intent intent6 = new Intent("4");
+
+		IntentOperationList operations = new IntentOperationList();
+		operations.add(Operator.ADD, intent1);
+		operations.add(Operator.ADD, intent2);
+		operations.add(Operator.ADD, intent3);
+		assertEquals(3, operations.size());
+
+		intents.executeOperations(operations);
+		assertEquals(3, intents.getAllIntents().size());
+		assertSame(intent1, intents.getIntent("1"));
+		assertSame(intent2, intents.getIntent("2"));
+		assertSame(intent3, intents.getIntent("3"));
+
 		operations.clear();
-		operations.add(new IntentOperation(IntentOperation.Operator.REMOVE, intent4));
+		operations.add(Operator.ADD, intent4);
+		operations.add(Operator.ADD, intent5);
+		operations.add(Operator.ADD, intent6);
+		assertEquals(3, operations.size());
+
+		intents.executeOperations(operations);
+		assertEquals(4, intents.getAllIntents().size());
+		assertSame(intent4, intents.getIntent("1"));
+		assertSame(intent5, intents.getIntent("2"));
+		assertSame(intent3, intents.getIntent("3"));
+		assertSame(intent6, intents.getIntent("4"));
+	}
+
+	@Test
+	public void testRemoveOperation() {
+		IntentMap intents = new IntentMap();
+
+		Intent intent1 = new Intent("1");
+		ShortestPathIntent intent2 =
+				new ShortestPathIntent("2", 21L, 22L, 23L, 24L, 25L, 26L);
+		ConstrainedShortestPathIntent intent3 =
+				new ConstrainedShortestPathIntent("3", 31L, 32L, 33L, 34L, 35L, 36L, 1000.0);
+
+		IntentOperationList operations = new IntentOperationList();
+		operations.add(Operator.ADD, intent1);
+		operations.add(Operator.ADD, intent2);
+		operations.add(Operator.ADD, intent3);
+		intents.executeOperations(operations);
+		assertEquals(3, intents.getAllIntents().size());
+		assertSame(intent1, intents.getIntent("1"));
+		assertSame(intent2, intents.getIntent("2"));
+		assertSame(intent3, intents.getIntent("3"));
+
+		operations.clear();
+		operations.add(Operator.REMOVE, new Intent("1"));
+		operations.add(Operator.REMOVE, new Intent("3"));
+		intents.executeOperations(operations);
+		assertEquals(3, intents.getAllIntents().size());
+		assertSame(intent1, intents.getIntent("1"));
+		assertSame(intent2, intents.getIntent("2"));
+		assertSame(intent3, intents.getIntent("3"));
+		assertEquals(IntentState.DEL_REQ, intents.getIntent("1").getState());
+		assertEquals(IntentState.CREATED, intents.getIntent("2").getState());
+		assertEquals(IntentState.DEL_REQ, intents.getIntent("3").getState());
+	}
+
+	@Test
+	public void testErrorOperation() {
+		IntentMap intents = new IntentMap();
+		IntentOperationList operations = new IntentOperationList();
+		operations.add(Operator.ADD, new Intent("1", IntentState.CREATED));
+		operations.add(Operator.ADD, new Intent("2", IntentState.INST_REQ));
+		operations.add(Operator.ADD, new Intent("3", IntentState.INST_ACK));
+		operations.add(Operator.ADD, new Intent("4", IntentState.INST_NACK));
+		operations.add(Operator.ADD, new Intent("5", IntentState.REROUTE_REQ));
+		operations.add(Operator.ADD, new Intent("6", IntentState.DEL_REQ));
+		operations.add(Operator.ADD, new Intent("7", IntentState.DEL_ACK));
+		operations.add(Operator.ADD, new Intent("8", IntentState.DEL_PENDING));
+		intents.executeOperations(operations);
+		assertEquals(8, intents.getAllIntents().size());
+
+		operations.clear();
+		operations.add(Operator.ERROR, new ErrorIntent(ErrorType.PATH_NOT_FOUND, "", new Intent("1")));
+		operations.add(Operator.ERROR, new ErrorIntent(ErrorType.PATH_NOT_FOUND, "", new Intent("2")));
+		operations.add(Operator.ERROR, new ErrorIntent(ErrorType.PATH_NOT_FOUND, "", new Intent("3")));
+		operations.add(Operator.ERROR, new ErrorIntent(ErrorType.PATH_NOT_FOUND, "", new Intent("4")));
+		operations.add(Operator.ERROR, new ErrorIntent(ErrorType.PATH_NOT_FOUND, "", new Intent("5")));
+		operations.add(Operator.ERROR, new ErrorIntent(ErrorType.PATH_NOT_FOUND, "", new Intent("6")));
+		operations.add(Operator.ERROR, new ErrorIntent(ErrorType.PATH_NOT_FOUND, "", new Intent("7")));
+		operations.add(Operator.ERROR, new ErrorIntent(ErrorType.PATH_NOT_FOUND, "", new Intent("8")));
 		intents.executeOperations(operations);
 
-		// check
+		assertEquals(IntentState.INST_NACK, intents.getIntent("1").getState());
+		assertEquals(IntentState.INST_NACK, intents.getIntent("2").getState());
+		assertEquals(IntentState.INST_NACK, intents.getIntent("3").getState());
+		assertEquals(IntentState.INST_NACK, intents.getIntent("4").getState());
+		assertEquals(IntentState.INST_NACK, intents.getIntent("5").getState());
+		assertEquals(IntentState.DEL_PENDING, intents.getIntent("6").getState());
+		assertEquals(IntentState.DEL_ACK, intents.getIntent("7").getState());
+		assertEquals(IntentState.DEL_PENDING, intents.getIntent("8").getState());
+	}
 
-		assertEquals(3, intents.getAllIntents().size());
-		assertEquals(IntentState.DEL_REQ, intent1.getState());
-
-		// change intents' state which will be purged 
-
-		intent2.setState(IntentState.INST_NACK);
-		intent3.setState(IntentState.DEL_ACK);
-
-		// purge
+	@Test
+	public void testPurge() {
+		IntentMap intents = new IntentMap();
+		IntentOperationList operations = new IntentOperationList();
+		operations.add(Operator.ADD, new Intent("1", IntentState.CREATED));
+		operations.add(Operator.ADD, new Intent("2", IntentState.INST_REQ));
+		operations.add(Operator.ADD, new Intent("3", IntentState.INST_ACK));
+		operations.add(Operator.ADD, new Intent("4", IntentState.INST_NACK));
+		operations.add(Operator.ADD, new Intent("5", IntentState.REROUTE_REQ));
+		operations.add(Operator.ADD, new Intent("6", IntentState.DEL_REQ));
+		operations.add(Operator.ADD, new Intent("7", IntentState.DEL_ACK));
+		operations.add(Operator.ADD, new Intent("8", IntentState.DEL_PENDING));
+		intents.executeOperations(operations);
+		assertEquals(8, intents.getAllIntents().size());
 
 		intents.purge();
 
-		// check
+		assertEquals(6, intents.getAllIntents().size());
+		assertEquals("1", intents.getIntent("1").getId());
+		assertEquals("2", intents.getIntent("2").getId());
+		assertEquals("3", intents.getIntent("3").getId());
+		assertNull(intents.getIntent("4"));
+		assertEquals("5", intents.getIntent("5").getId());
+		assertEquals("6", intents.getIntent("6").getId());
+		assertNull("7", intents.getIntent("7"));
+		assertEquals("8", intents.getIntent("8").getId());
+	}
 
-		assertEquals(1, intents.getAllIntents().size());
-		assertEquals("1", intents.getAllIntents().iterator().next().getId());
+	@Test
+	public void testChangeStates() {
+		IntentMap intents = new IntentMap();
+		IntentOperationList operations = new IntentOperationList();
+		operations.add(Operator.ADD, new Intent("1", IntentState.CREATED));
+		operations.add(Operator.ADD, new Intent("2", IntentState.INST_REQ));
+		operations.add(Operator.ADD, new Intent("3", IntentState.INST_ACK));
+		operations.add(Operator.ADD, new Intent("4", IntentState.INST_NACK));
+		operations.add(Operator.ADD, new Intent("5", IntentState.REROUTE_REQ));
+		operations.add(Operator.ADD, new Intent("6", IntentState.DEL_REQ));
+		operations.add(Operator.ADD, new Intent("7", IntentState.DEL_ACK));
+		operations.add(Operator.ADD, new Intent("8", IntentState.DEL_PENDING));
+		intents.executeOperations(operations);
+		assertEquals(8, intents.getAllIntents().size());
+
+		IntentStateList states = new IntentStateList();
+		states.put("8", IntentState.CREATED);
+		states.put("1", IntentState.INST_REQ);
+		states.put("2", IntentState.INST_ACK);
+		states.put("3", IntentState.INST_NACK);
+		states.put("4", IntentState.REROUTE_REQ);
+		states.put("5", IntentState.DEL_REQ);
+		states.put("6", IntentState.DEL_ACK);
+		states.put("7", IntentState.DEL_PENDING);
+		intents.changeStates(states);
+
+		assertEquals(IntentState.INST_REQ, intents.getIntent("1").getState());
+		assertEquals(IntentState.INST_ACK, intents.getIntent("2").getState());
+		assertEquals(IntentState.INST_NACK, intents.getIntent("3").getState());
+		assertEquals(IntentState.REROUTE_REQ, intents.getIntent("4").getState());
+		assertEquals(IntentState.DEL_REQ, intents.getIntent("5").getState());
+		assertEquals(IntentState.DEL_ACK, intents.getIntent("6").getState());
+		assertEquals(IntentState.DEL_PENDING, intents.getIntent("7").getState());
+		assertEquals(IntentState.CREATED, intents.getIntent("8").getState());
 	}
 }