FlowRule equals() incorporates FlowId to factor in treatment.

Reference: ONOS-481

Change-Id: Ia1fcba3f827c662c89801afc84916ffef78af66d
diff --git a/core/api/src/main/java/org/onosproject/net/flow/DefaultFlowRule.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultFlowRule.java
index e555794..cd937f4 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultFlowRule.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultFlowRule.java
@@ -203,7 +203,8 @@
             DefaultFlowRule that = (DefaultFlowRule) obj;
             return Objects.equals(deviceId, that.deviceId) &&
                     Objects.equals(priority, that.priority) &&
-                    Objects.equals(selector, that.selector);
+                    Objects.equals(selector, that.selector) &&
+                    Objects.equals(id, that.id());
 
         }
         return false;
diff --git a/core/api/src/test/java/org/onosproject/net/flow/DefaultFlowRuleTest.java b/core/api/src/test/java/org/onosproject/net/flow/DefaultFlowRuleTest.java
index 78c1645..dcfff60 100644
--- a/core/api/src/test/java/org/onosproject/net/flow/DefaultFlowRuleTest.java
+++ b/core/api/src/test/java/org/onosproject/net/flow/DefaultFlowRuleTest.java
@@ -17,12 +17,15 @@
 package org.onosproject.net.flow;
 
 import org.junit.Test;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.flow.instructions.Instructions;
 import org.onosproject.net.intent.IntentTestsMocks;
 
 import com.google.common.testing.EqualsTester;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutableBaseClass;
 import static org.onosproject.net.NetTestTools.APP_ID;
 import static org.onosproject.net.NetTestTools.did;
@@ -33,8 +36,12 @@
 public class DefaultFlowRuleTest {
     private static final IntentTestsMocks.MockSelector SELECTOR =
             new IntentTestsMocks.MockSelector();
-    private static final IntentTestsMocks.MockTreatment TREATMENT =
-            new IntentTestsMocks.MockTreatment();
+    private static final IntentTestsMocks.MockTreatment TREATMENT1 =
+            new IntentTestsMocks.MockTreatment(
+                    Instructions.createOutput(PortNumber.portNumber(1)));
+    private static final IntentTestsMocks.MockTreatment TREATMENT2 =
+            new IntentTestsMocks.MockTreatment(
+                    Instructions.createOutput(PortNumber.portNumber(2)));
 
     final FlowRule flowRule1 = new IntentTestsMocks.MockFlowRule(1);
     final FlowRule sameAsFlowRule1 = new IntentTestsMocks.MockFlowRule(1);
@@ -85,14 +92,14 @@
     public void testCreationWithFlowId() {
         final DefaultFlowRule rule =
                 new DefaultFlowRule(did("1"), SELECTOR,
-                        TREATMENT, 22, 33,
+                TREATMENT1, 22, 33,
                 44, false);
         assertThat(rule.deviceId(), is(did("1")));
         assertThat(rule.id().value(), is(33L));
         assertThat(rule.isPermanent(), is(false));
         assertThat(rule.priority(), is(22));
         assertThat(rule.selector(), is(SELECTOR));
-        assertThat(rule.treatment(), is(TREATMENT));
+        assertThat(rule.treatment(), is(TREATMENT1));
         assertThat(rule.timeout(), is(44));
     }
 
@@ -103,13 +110,25 @@
     public void testCreationWithAppId() {
         final DefaultFlowRule rule =
                 new DefaultFlowRule(did("1"), SELECTOR,
-                        TREATMENT, 22, APP_ID,
+                TREATMENT1, 22, APP_ID,
                         44, false);
         assertThat(rule.deviceId(), is(did("1")));
         assertThat(rule.isPermanent(), is(false));
         assertThat(rule.priority(), is(22));
         assertThat(rule.selector(), is(SELECTOR));
-        assertThat(rule.treatment(), is(TREATMENT));
+        assertThat(rule.treatment(), is(TREATMENT1));
         assertThat(rule.timeout(), is(44));
     }
+
+    /**
+     * Tests equality that factors in TrafficTreatment through the flowId.
+     */
+    @Test
+    public void testActionEquals() {
+        final DefaultFlowRule rule1 = new DefaultFlowRule(did("1"), SELECTOR,
+                TREATMENT1, 22, APP_ID, 44, false);
+        final DefaultFlowRule rule2 = new DefaultFlowRule(did("1"), SELECTOR,
+                TREATMENT2, 22, APP_ID, 44, false);
+        assertThat(rule1, not(rule2));
+    }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java b/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
index 6d3605a..4b046e0 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
@@ -80,9 +80,19 @@
      * Mock traffic treatment class used for satisfying API requirements.
      */
     public static class MockTreatment implements TrafficTreatment {
+
+        private List<Instruction> instructions = new ArrayList<>();
+
+        public MockTreatment() {
+        }
+
+        public MockTreatment(Instruction... insts) {
+            this.instructions.addAll(Arrays.asList(insts));
+        }
+
         @Override
         public List<Instruction> instructions() {
-            return new ArrayList<>();
+            return this.instructions;
         }
     }