[ONOS-7493] Segment routing may uninstall forwarding with no next id

Change-Id: Id78b9ed94633b7e96fdeebe185e28d6de386e3ec
diff --git a/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/FabricInterpreterTest.java b/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/FabricInterpreterTest.java
index f0d27f35..8d97f20 100644
--- a/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/FabricInterpreterTest.java
+++ b/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/FabricInterpreterTest.java
@@ -30,6 +30,7 @@
 import org.onosproject.net.pi.runtime.PiActionParam;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 /**
  * Test for fabric interpreter.
@@ -125,6 +126,17 @@
         assertEquals(expectedAction, mappedAction);
     }
 
+    /**
+     * Map empty treatment for forwarding block to nop action.
+     */
+    @Test
+    public void testEmptyForwardingTreatment() throws Exception {
+        TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
+        PiAction mappedAction = interpreter.mapTreatment(treatment,
+                                                         FabricConstants.TBL_UNICAST_V4_ID);
+        assertNull(mappedAction);
+    }
+
     /* Next control block */
 
     /**
diff --git a/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipelineTest.java b/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipelineTest.java
index e65e30b..d29beaa 100644
--- a/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipelineTest.java
+++ b/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/pipeliner/FabricForwardingPipelineTest.java
@@ -169,6 +169,18 @@
     }
 
     @Test
+    public void testIPv4UnicastWithNoNextId() {
+        TrafficSelector selector = DefaultTrafficSelector.builder()
+                .matchEthType(Ethernet.TYPE_IPV4)
+                .matchIPDst(IPV4_UNICAST_ADDR)
+                .build();
+        TrafficSelector expectedSelector = DefaultTrafficSelector.builder()
+                .matchIPDst(IPV4_UNICAST_ADDR)
+                .build();
+        testSpecificForward(FabricConstants.TBL_UNICAST_V4_ID, expectedSelector, selector, null);
+    }
+
+    @Test
     @Ignore
     public void testIPv4Multicast() {
         TrafficSelector selector = DefaultTrafficSelector.builder()
@@ -234,15 +246,21 @@
 
     private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
                                      TrafficSelector selector, Integer nextId) {
-        PiActionParam nextIdParam = new PiActionParam(FabricConstants.ACT_PRM_NEXT_ID_ID,
-                                                      ImmutableByteSequence.copyFrom(nextId.byteValue()));
-        PiAction setNextIdAction = PiAction.builder()
-                .withId(FabricConstants.ACT_FORWARDING_SET_NEXT_ID_ID)
-                .withParameter(nextIdParam)
-                .build();
-        TrafficTreatment setNextIdTreatment = DefaultTrafficTreatment.builder()
-                .piTableAction(setNextIdAction)
-                .build();
+        TrafficTreatment setNextIdTreatment;
+        if (nextId == null) {
+            // Ref: RoutingRulePopulator.java->revokeIpRuleForRouter
+            setNextIdTreatment = DefaultTrafficTreatment.builder().build();
+        } else {
+            PiActionParam nextIdParam = new PiActionParam(FabricConstants.ACT_PRM_NEXT_ID_ID,
+                                                          ImmutableByteSequence.copyFrom(nextId.byteValue()));
+            PiAction setNextIdAction = PiAction.builder()
+                    .withId(FabricConstants.ACT_FORWARDING_SET_NEXT_ID_ID)
+                    .withParameter(nextIdParam)
+                    .build();
+            setNextIdTreatment = DefaultTrafficTreatment.builder()
+                    .piTableAction(setNextIdAction)
+                    .build();
+        }
 
         testSpecificForward(expectedTableId, expectedSelector, selector, nextId, setNextIdTreatment);
 
@@ -250,16 +268,19 @@
 
     private void testSpecificForward(PiTableId expectedTableId, TrafficSelector expectedSelector,
                                      TrafficSelector selector, Integer nextId, TrafficTreatment treatment) {
-        ForwardingObjective fwd = DefaultForwardingObjective.builder()
+        ForwardingObjective.Builder fwd = DefaultForwardingObjective.builder()
                 .withSelector(selector)
                 .withPriority(PRIORITY)
                 .fromApp(APP_ID)
                 .makePermanent()
-                .withFlag(ForwardingObjective.Flag.SPECIFIC)
-                .nextStep(nextId)
-                .add();
+                .withTreatment(treatment)
+                .withFlag(ForwardingObjective.Flag.SPECIFIC);
 
-        PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd);
+        if (nextId != null) {
+            fwd.nextStep(nextId);
+        }
+
+        PipelinerTranslationResult result = pipeliner.pipelinerForward.forward(fwd.add());
 
         List<FlowRule> flowRulesInstalled = (List<FlowRule>) result.flowRules();
         List<GroupDescription> groupsInstalled = (List<GroupDescription>) result.groups();