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
new file mode 100644
index 0000000..76bd030
--- /dev/null
+++ b/pipelines/fabric/src/test/java/org/onosproject/pipelines/fabric/FabricInterpreterTest.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.pipelines.fabric;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onlab.util.ImmutableByteSequence;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.pi.runtime.PiAction;
+import org.onosproject.net.pi.runtime.PiActionParam;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Test for fabric interpreter.
+ */
+public class FabricInterpreterTest {
+    private static final VlanId VLAN_100 = VlanId.vlanId("100");
+    private static final PortNumber PORT_1 = PortNumber.portNumber(1);
+    private static final MacAddress SRC_MAC = MacAddress.valueOf("00:00:00:00:00:01");
+    private static final MacAddress DST_MAC = MacAddress.valueOf("00:00:00:00:00:02");
+
+    private FabricInterpreter interpreter;
+
+    @Before
+    public void setup() {
+        interpreter = new FabricInterpreter();
+    }
+
+    /* Filtering control block */
+
+    /**
+     * Map treatment to push_internal_vlan action.
+     */
+    @Test
+    public void testFilteringTreatment1() throws Exception {
+        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                .pushVlan()
+                .setVlanId(VLAN_100)
+                .build();
+        PiAction mappedAction = interpreter.mapTreatment(treatment,
+                                                   FabricConstants.TBL_INGRESS_PORT_VLAN_ID);
+        PiActionParam param = new PiActionParam(FabricConstants.ACT_PRM_NEW_VLAN_ID_ID,
+                                                ImmutableByteSequence.copyFrom(VLAN_100.toShort()));
+        PiAction expectedAction = PiAction.builder()
+                .withId(FabricConstants.ACT_PUSH_INTERNAL_VLAN_ID)
+                .withParameter(param)
+                .build();
+
+        assertEquals(expectedAction, mappedAction);
+    }
+
+    /**
+     * Map treatment to set_vlan action.
+     */
+    @Test
+    public void testFilteringTreatment2() throws Exception {
+        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                .setVlanId(VLAN_100)
+                .build();
+        PiAction mappedAction = interpreter.mapTreatment(treatment,
+                                                         FabricConstants.TBL_INGRESS_PORT_VLAN_ID);
+        PiActionParam param = new PiActionParam(FabricConstants.ACT_PRM_NEW_VLAN_ID_ID,
+                                                ImmutableByteSequence.copyFrom(VLAN_100.toShort()));
+        PiAction expectedAction = PiAction.builder()
+                .withId(FabricConstants.ACT_SET_VLAN_ID)
+                .withParameter(param)
+                .build();
+
+        assertEquals(expectedAction, mappedAction);
+    }
+
+    /**
+     * Map treatment to nop action.
+     */
+    @Test
+    public void testFilteringTreatment3() throws Exception {
+        TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
+        PiAction mappedAction = interpreter.mapTreatment(treatment,
+                                                         FabricConstants.TBL_INGRESS_PORT_VLAN_ID);
+        PiAction expectedAction = PiAction.builder()
+                .withId(FabricConstants.ACT_NOP_ID)
+                .build();
+
+        assertEquals(expectedAction, mappedAction);
+    }
+
+    /* Forwarding control block */
+
+    /**
+     * Map treatment to duplicate_to_controller action.
+     */
+    @Test
+    public void testForwardingTreatment1() throws Exception {
+        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                .punt()
+                .build();
+        PiAction mappedAction = interpreter.mapTreatment(treatment,
+                                                         FabricConstants.TBL_ACL_ID);
+        PiAction expectedAction = PiAction.builder()
+                .withId(FabricConstants.ACT_DUPLICATE_TO_CONTROLLER_ID)
+                .build();
+
+        assertEquals(expectedAction, mappedAction);
+    }
+
+    /* Next control block */
+
+    /**
+     * Map treatment to output action.
+     */
+    @Test
+    public void testNextTreatment1() throws Exception {
+        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                .setOutput(PORT_1)
+                .build();
+        PiAction mappedAction = interpreter.mapTreatment(treatment,
+                                                         FabricConstants.TBL_SIMPLE_ID);
+        short portNumVal = (short) PORT_1.toLong();
+        PiActionParam param = new PiActionParam(FabricConstants.ACT_PRM_PORT_NUM_ID,
+                                                ImmutableByteSequence.copyFrom(portNumVal));
+        PiAction expectedAction = PiAction.builder()
+                .withId(FabricConstants.ACT_OUTPUT_ID)
+                .withParameter(param)
+                .build();
+
+        assertEquals(expectedAction, mappedAction);
+    }
+
+    /**
+     * Map treatment to output_ecmp action.
+     */
+    @Test
+    public void testNextTreatment2() throws Exception {
+        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                .setEthSrc(SRC_MAC)
+                .setEthDst(DST_MAC)
+                .setOutput(PORT_1)
+                .build();
+        PiAction mappedAction = interpreter.mapTreatment(treatment,
+                                                         FabricConstants.TBL_HASHED_ID);
+        short portNumVal = (short) PORT_1.toLong();
+        PiActionParam ethSrcParam = new PiActionParam(FabricConstants.ACT_PRM_SMAC_ID,
+                                                      ImmutableByteSequence.copyFrom(SRC_MAC.toBytes()));
+        PiActionParam ethDstParam = new PiActionParam(FabricConstants.ACT_PRM_DMAC_ID,
+                                                      ImmutableByteSequence.copyFrom(DST_MAC.toBytes()));
+        PiActionParam portParam = new PiActionParam(FabricConstants.ACT_PRM_PORT_NUM_ID,
+                                                ImmutableByteSequence.copyFrom(portNumVal));
+        PiAction expectedAction = PiAction.builder()
+                .withId(FabricConstants.ACT_L3_ROUTING_ID)
+                .withParameters(ImmutableList.of(ethSrcParam, ethDstParam, portParam))
+                .build();
+
+        assertEquals(expectedAction, mappedAction);
+    }
+
+    /**
+     * Map treatment to set_vlan_output action.
+     */
+    @Test
+    public void testNextTreatment3() throws Exception {
+        TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                .setVlanId(VLAN_100)
+                .setOutput(PORT_1)
+                .build();
+        PiAction mappedAction = interpreter.mapTreatment(treatment,
+                                                         FabricConstants.TBL_SIMPLE_ID);
+        short portNumVal = (short) PORT_1.toLong();
+        PiActionParam portParam = new PiActionParam(FabricConstants.ACT_PRM_PORT_NUM_ID,
+                                                    ImmutableByteSequence.copyFrom(portNumVal));
+        short vlanVal = VLAN_100.toShort();
+        PiActionParam vlanParam = new PiActionParam(FabricConstants.ACT_PRM_NEW_VLAN_ID_ID,
+                                                    ImmutableByteSequence.copyFrom(vlanVal));
+
+        PiAction expectedAction = PiAction.builder()
+                .withId(FabricConstants.ACT_SET_VLAN_OUTPUT_ID)
+                .withParameters(ImmutableList.of(vlanParam, portParam))
+                .build();
+
+        assertEquals(expectedAction, mappedAction);
+    }
+}
