protected void initializePipeline(DeviceId deviceId) {
        // for inbound table transition
        connectTables(deviceId, Constants.STAT_INBOUND_TABLE, Constants.VTAP_INBOUND_TABLE);
        connectTables(deviceId, Constants.VTAP_INBOUND_TABLE, Constants.DHCP_TABLE);

        // for DHCP and vTag table transition
        connectTables(deviceId, Constants.DHCP_TABLE, Constants.VTAG_TABLE);

        // for vTag and ARP table transition
        connectTables(deviceId, Constants.VTAG_TABLE, Constants.ARP_TABLE);

        // for ARP and ACL table transition
        connectTables(deviceId, Constants.ARP_TABLE, Constants.ACL_INGRESS_TABLE);

        // for ACL and JUMP table transition
        connectTables(deviceId, Constants.ACL_EGRESS_TABLE, Constants.JUMP_TABLE);

        // for JUMP table transition
        // we need JUMP table for bypassing routing table which contains large
        // amount of flow rules which might cause performance degradation during
        // table lookup
        setupJumpTable(deviceId);

        // for setting up default FLAT table behavior which is NORMAL
        setupFlatTable(deviceId);

        // for outbound table transition
        connectTables(deviceId, Constants.STAT_OUTBOUND_TABLE,
                                Constants.VTAP_OUTBOUND_TABLE);
        connectTables(deviceId, Constants.VTAP_OUTBOUND_TABLE,
                                Constants.FORWARDING_TABLE);

        // for PRE_FLAT and FLAT table transition
        connectTables(deviceId, Constants.PRE_FLAT_TABLE, Constants.FLAT_TABLE);
    }
@Test
    public void testInitializePipeline() {

        fros = Sets.newConcurrentHashSet();

        target.initializePipeline(DEVICE_ID);
        assertEquals("Flow Rule size was not match", 12, fros.size());

        Map<Integer, Integer> fromToTableMap = Maps.newConcurrentMap();
        fromToTableMap.put(STAT_INBOUND_TABLE, VTAP_INBOUND_TABLE);
        fromToTableMap.put(VTAP_INBOUND_TABLE, DHCP_TABLE);
        fromToTableMap.put(DHCP_TABLE, VTAG_TABLE);
        fromToTableMap.put(VTAG_TABLE, ARP_TABLE);
        fromToTableMap.put(ARP_TABLE, ACL_INGRESS_TABLE);
        fromToTableMap.put(ACL_EGRESS_TABLE, JUMP_TABLE);
        fromToTableMap.put(STAT_OUTBOUND_TABLE, VTAP_OUTBOUND_TABLE);
        fromToTableMap.put(VTAP_OUTBOUND_TABLE, FORWARDING_TABLE);
        fromToTableMap.put(PRE_FLAT_TABLE, FLAT_TABLE);

        fros.stream().map(FlowRuleOperation::rule).forEach(fr -> {
            if (fr.tableId() != JUMP_TABLE && fr.tableId() != FLAT_TABLE) {
                assertEquals("To Table did not match,",
                        fromToTableMap.get(fr.tableId()),
                        fr.treatment().tableTransition().tableId());
            }
        });
    }