diff --git a/pipelines/fabric/impl/src/test/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/FabricPipelinerTest.java b/pipelines/fabric/impl/src/test/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/FabricPipelinerTest.java
index 31db010..a2fa47b 100644
--- a/pipelines/fabric/impl/src/test/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/FabricPipelinerTest.java
+++ b/pipelines/fabric/impl/src/test/java/org/onosproject/pipelines/fabric/impl/behaviour/pipeliner/FabricPipelinerTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-present Open Networking Foundation
+ * Copyright 2021-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.
@@ -13,64 +13,132 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.onosproject.pipelines.fabric.impl.behaviour.pipeliner;
 
+import org.easymock.Capture;
+import org.easymock.CaptureType;
+import org.junit.Before;
 import org.junit.Test;
-import org.onlab.packet.IpPrefix;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.MplsLabel;
-import org.onlab.packet.VlanId;
+import org.onlab.packet.Ethernet;
 import org.onosproject.TestApplicationId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.flow.DefaultFlowRule;
 import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.FlowRuleService;
 import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.criteria.Criteria;
+import org.onosproject.net.flow.criteria.PiCriterion;
+import org.onosproject.net.pi.runtime.PiAction;
+import org.onosproject.net.pi.runtime.PiActionParam;
+import org.onosproject.pipelines.fabric.FabricConstants;
 import org.onosproject.pipelines.fabric.impl.behaviour.FabricCapabilities;
 
-import static org.easymock.EasyMock.createNiceMock;
+import java.io.IOException;
+import java.util.Optional;
+
+import static org.easymock.EasyMock.capture;
+import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.newCapture;
 import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertTrue;
 
 public class FabricPipelinerTest {
-    static final ApplicationId APP_ID = TestApplicationId.create("FabricPipelinerTest");
-    static final ApplicationId XCONNECT_APP_ID = TestApplicationId.create("FabricPipelinerTest.xconnect");
-    static final DeviceId DEVICE_ID = DeviceId.deviceId("device:bmv2:11");
-    static final int PRIORITY = 100;
-    static final PortNumber PORT_1 = PortNumber.portNumber(1);
-    static final PortNumber PORT_2 = PortNumber.portNumber(2);
-    static final VlanId VLAN_100 = VlanId.vlanId("100");
-    static final VlanId VLAN_200 = VlanId.vlanId("200");
-    static final MacAddress HOST_MAC = MacAddress.valueOf("00:00:00:00:00:01");
-    static final MacAddress ROUTER_MAC = MacAddress.valueOf("00:00:00:00:02:01");
-    static final IpPrefix IPV4_UNICAST_ADDR = IpPrefix.valueOf("10.0.0.1/32");
-    static final IpPrefix IPV4_MCAST_ADDR = IpPrefix.valueOf("224.0.0.1/32");
-    static final IpPrefix IPV6_UNICAST_ADDR = IpPrefix.valueOf("2000::1/32");
-    static final IpPrefix IPV6_MCAST_ADDR = IpPrefix.valueOf("ff00::1/32");
-    static final MplsLabel MPLS_10 = MplsLabel.mplsLabel(10);
-    static final Integer NEXT_ID_1 = 1;
-    static final TrafficSelector VLAN_META = DefaultTrafficSelector.builder()
-            .matchVlanId(VLAN_100)
-            .build();
 
-    FabricCapabilities capabilitiesHashed;
-    FabricCapabilities capabilitiesSimple;
+    private static final ApplicationId APP_ID = TestApplicationId.create("FabricPipelinerTest");
+    private static final DeviceId DEVICE_ID = DeviceId.deviceId("device:1");
+    private static final int DEFAULT_FLOW_PRIORITY = 100;
+    private static final int CPU_PORT = 320;
+    private static final byte FWD_IPV4_ROUTING = 2;
+    private static final int DEFAULT_VLAN = 4094;
+    public static final byte[] ONE = new byte[]{1};
+    public static final byte[] ZERO = new byte[]{0};
 
-    void doSetup() {
-        this.capabilitiesHashed = createNiceMock(FabricCapabilities.class);
-        this.capabilitiesSimple = createNiceMock(FabricCapabilities.class);
-        expect(capabilitiesHashed.hasHashedTable()).andReturn(true).anyTimes();
-        expect(capabilitiesHashed.supportDoubleVlanTerm()).andReturn(true).anyTimes();
-        expect(capabilitiesSimple.hasHashedTable()).andReturn(false).anyTimes();
-        expect(capabilitiesSimple.supportDoubleVlanTerm()).andReturn(true).anyTimes();
-        replay(capabilitiesHashed);
-        replay(capabilitiesSimple);
+    private FabricPipeliner pipeliner;
+    private FlowRuleService flowRuleService;
+
+    @Before
+    public void setup() throws IOException {
+        FabricCapabilities capabilities = createMock(FabricCapabilities.class);
+        expect(capabilities.cpuPort()).andReturn(Optional.of(CPU_PORT)).anyTimes();
+        replay(capabilities);
+
+        // Services mock
+        flowRuleService = createMock(FlowRuleService.class);
+
+        pipeliner = new FabricPipeliner(capabilities);
+        pipeliner.flowRuleService = flowRuleService;
+        pipeliner.appId = APP_ID;
+        pipeliner.deviceId = DEVICE_ID;
     }
 
     @Test
-    public void fakeTest() {
-        // Needed otherwise Bazel complains about a test class without test cases.
-        assert true;
+    public void testInitializePipeline() {
+        final Capture<FlowRule> capturedCpuIgVlanRule = newCapture(CaptureType.ALL);
+        final Capture<FlowRule> capturedCpuFwdClsRule = newCapture(CaptureType.ALL);
+
+        // ingress_port_vlan table for cpu port
+        final TrafficSelector cpuIgVlanSelector = DefaultTrafficSelector.builder()
+                .add(Criteria.matchInPort(PortNumber.portNumber(CPU_PORT)))
+                .add(PiCriterion.builder()
+                        .matchExact(FabricConstants.HDR_VLAN_IS_VALID, ZERO)
+                        .build())
+                .build();
+        final TrafficTreatment cpuIgVlanTreatment = DefaultTrafficTreatment.builder()
+                .piTableAction(PiAction.builder()
+                        .withId(FabricConstants.FABRIC_INGRESS_FILTERING_PERMIT_WITH_INTERNAL_VLAN)
+                        .withParameter(new PiActionParam(FabricConstants.VLAN_ID, DEFAULT_VLAN))
+                        .build())
+                .build();
+        final FlowRule expectedCpuIgVlanRule = DefaultFlowRule.builder()
+                .withSelector(cpuIgVlanSelector)
+                .withTreatment(cpuIgVlanTreatment)
+                .forTable(FabricConstants.FABRIC_INGRESS_FILTERING_INGRESS_PORT_VLAN)
+                .makePermanent()
+                .withPriority(DEFAULT_FLOW_PRIORITY)
+                .forDevice(DEVICE_ID)
+                .fromApp(APP_ID)
+                .build();
+
+        final TrafficSelector cpuFwdClsSelector = DefaultTrafficSelector.builder()
+                .matchInPort(PortNumber.portNumber(CPU_PORT))
+                .matchPi(PiCriterion.builder()
+                        .matchExact(FabricConstants.HDR_IP_ETH_TYPE, Ethernet.TYPE_IPV4)
+                        .build())
+                .build();
+        final TrafficTreatment cpuFwdClsTreatment = DefaultTrafficTreatment.builder()
+                .piTableAction(PiAction.builder()
+                        .withId(FabricConstants.FABRIC_INGRESS_FILTERING_SET_FORWARDING_TYPE)
+                        .withParameter(new PiActionParam(FabricConstants.FWD_TYPE, FWD_IPV4_ROUTING))
+                        .build())
+                .build();
+        final FlowRule expectedCpuFwdClsRule = DefaultFlowRule.builder()
+                .withSelector(cpuFwdClsSelector)
+                .withTreatment(cpuFwdClsTreatment)
+                .forTable(FabricConstants.FABRIC_INGRESS_FILTERING_FWD_CLASSIFIER)
+                .makePermanent()
+                .withPriority(DEFAULT_FLOW_PRIORITY)
+                .forDevice(DEVICE_ID)
+                .fromApp(APP_ID)
+                .build();
+        flowRuleService.applyFlowRules(
+                capture(capturedCpuIgVlanRule),
+                capture(capturedCpuFwdClsRule));
+
+        replay(flowRuleService);
+        pipeliner.initializePipeline();
+
+        assertTrue(expectedCpuIgVlanRule.exactMatch(capturedCpuIgVlanRule.getValue()));
+        assertTrue(expectedCpuFwdClsRule.exactMatch(capturedCpuFwdClsRule.getValue()));
+
+        verify(flowRuleService);
+        reset(flowRuleService);
     }
 }
