# Copyright 2021-present Intel Corporation.
#
# 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.
"""
Thrift SAI QosMap interface tester
"""
from sai_thrift.sai_headers import *

from sai_base_test import *


# test DSCP stepping in the loop from 0 to 64
DSCP_TEST_STEP = 1

QOS_TYPE_DICT = {
    SAI_QOS_MAP_TYPE_DSCP_TO_TC: (
        "dscp", "tc"),
    SAI_QOS_MAP_TYPE_DSCP_TO_COLOR: (
        "dscp", "color"),
    SAI_QOS_MAP_TYPE_TC_TO_QUEUE: (
        "tc", "queue_index"),
    SAI_QOS_MAP_TYPE_DOT1P_TO_COLOR: (
        "dot1p", "color"),
    SAI_QOS_MAP_TYPE_DOT1P_TO_TC: (
        "dot1p", "tc"),
    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_QUEUE: (
        "prio", "queue_index"),
    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP: (
        "prio", "pg"),
    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP: (
        "tc", "pg"),
    SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P: (
        "tc", "dot1p", "color"),
    SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DSCP: (
        "tc", "dscp", "color")}


def combine_ingress_pfc_tc_to_pg_mapping(pfc_prio_list, pg_list, tc_pg_list):
    ''' Function creates mapping
        PFC PRIORITY -> PRIORITY GROUP based on pg and tc_pg mapping.
    Args:
        pfc_prio_list (list): pfc_prio list of elements
        pg_list (list): pg list of elements
        tc_pg_list (list): tc pg list of elements

    Returns:
        list: mapping list of pfc_prio to pg elements
    '''
    mapping = []
    for i in pfc_prio_list:
        mapping.append([pfc_prio_list[i], pg_list[tc_pg_list[i]]])
    return mapping


def verify_qos_map(client, qosmap_id, qos_type, key_list, data_list):
    ''' Function verifies the HW QosMap type and map_to_value_list
    Args:
        client (client): client
        qosmap_id (obj_id): qos map object id
        qos_type (uint): qos map type
        key_list (list): qos map key list
        data_list (list): qos map data list
    Returns:
        bool: True if succesfully verified
    '''
    result = True
    attr = sai_thrift_get_qos_map_attribute(
        client,
        qosmap_id,
        type=qos_type,
        map_to_value_list=sai_thrift_qos_map_list_t(
            count=100,
            maplist=[]))

    if attr['type'] != qos_type:
        print("WARNING unexpected qos_map_type=%d, expected %d"
              % (attr['type'].count, qos_type))
        return False
    if len(key_list) != attr['map_to_value_list'].count:
        print(
            "WARNING unexpected map_to_value_list.count=%d, expected %d"
            % (attr['map_to_value_list'].count, len(key_list)))
        return False

    expected_key = QOS_TYPE_DICT[qos_type][0]
    expected_value = QOS_TYPE_DICT[qos_type][1]

    if len(QOS_TYPE_DICT[qos_type]) == 3:
        expected_key2 = QOS_TYPE_DICT[qos_type][2]

    for i, data in enumerate(attr['map_to_value_list'].maplist):
        key_dict = {"color": data.key.color,
                    "dscp": data.key.dscp,
                    "dot1p": data.key.dot1p,
                    "prio": data.key.prio,
                    "tc": data.key.tc}
        value_dict = {"color": data.value.color,
                      "dscp": data.value.dscp,
                      "dot1p": data.value.dot1p,
                      "pg": data.value.pg,
                      "prio": data.value.prio,
                      "tc": data.value.tc,
                      "queue_index": data.value.queue_index}
        if len(QOS_TYPE_DICT[qos_type]) == 2:
            if ((key_dict[expected_key] != key_list[i]) or
                    (value_dict[expected_value] != data_list[i])):
                result = False
                break
        elif len(QOS_TYPE_DICT[qos_type]) == 3:
            if ((key_dict[expected_key] != key_list[i][0]) or
                    (key_dict[expected_key2] != key_list[i][1]) or
                    (value_dict[expected_value] != data_list[i])):
                result = False
                break
        else:
            print("WARNING!!! - UNSUPPORTED qos type")
            result = False
            break
    return result


def create_qos_map_to_value_list(map_type, key_list, data_list):
    ''' Creates the qos map value list
    Args:
        map_type (uint): qos map type
        key_list (list): qos map key list
        data_list (list): qos map data list
    Returns:
        list: qos map value list
    '''
    map_list = []
    i = 0
    if len(key_list) != len(data_list):
        print("WARNING length of both lists should be equal")
        return 0
    for qos_type_dict_key in QOS_TYPE_DICT:
        if ((map_type == qos_type_dict_key) and
                (len(QOS_TYPE_DICT[qos_type_dict_key]) == 2)):
            for key_list_data in key_list:
                value_list_data = data_list[i]
                mapping = sai_thrift_qos_map_t(
                    key=sai_thrift_qos_map_params_t(
                        **{QOS_TYPE_DICT[qos_type_dict_key][0]:
                           key_list_data}),
                    value=sai_thrift_qos_map_params_t(
                        **{QOS_TYPE_DICT[qos_type_dict_key][1]:
                           value_list_data}))
                map_list.append(mapping)
                i += 1
        elif ((map_type == qos_type_dict_key) and
              (len(QOS_TYPE_DICT[qos_type_dict_key]) == 3)):
            for key_list_data1, key_list_data2 in key_list:
                value_list_data = data_list[i]
                mapping = sai_thrift_qos_map_t(
                    key=sai_thrift_qos_map_params_t(
                        **{QOS_TYPE_DICT[qos_type_dict_key][0]:
                           key_list_data1,
                           QOS_TYPE_DICT[qos_type_dict_key][2]:
                           key_list_data2}),
                    value=sai_thrift_qos_map_params_t(
                        **{QOS_TYPE_DICT[qos_type_dict_key][1]:
                           value_list_data}))
                map_list.append(mapping)
                i += 1
    qos_map_list = sai_thrift_qos_map_list_t(count=len(map_list),
                                             maplist=map_list)
    return qos_map_list


def update_and_verify_qos_map(client,
                              mapid,
                              map_type,
                              key_list,
                              data_list):
    ''' updates and verifies the qos map object with
        the provided key and data value lists
    Args:
        client (client): RPC client
        mapid (obj_id) : qos map object id
        map_type (uint): qos map type
        key_list (list): qos map key list
        data_list (list): qos map data list
    Returns:
        bool: True if succesfully updated and verified
    '''
    if mapid == 0:
        print("WARNING mapid not valid")
        return False
    if len(key_list) != len(data_list):
        print("WARNING length of both lists should be equal")
        return False
    qos_map_list = create_qos_map_to_value_list(map_type, key_list, data_list)
    status = sai_thrift_set_qos_map_attribute(client,
                                              mapid,
                                              map_to_value_list=qos_map_list)
    if status != SAI_STATUS_SUCCESS:
        print("WARNING Failed to update qos_map attribute")
        return False
    if verify_qos_map(client, mapid, map_type, key_list,
                      data_list) is False:
        print("WARNING! failed to verify updated qos_map 0x%x" % (mapid))
        return False
    return True


def create_and_verify_qos_map(client, map_type, key_list, data_list,
                              verify=True):
    ''' creates and verifies the qos map object with
        the provided key and data value lists
    Args:
        client (client): RPC client
        map_type (uint): qos map type
        key_list (list): qos map key list
        data_list (list): qos map data list
        verify (bool): verify request if True
    Returns:
        obj_id: created object id or 0 if failed to create or verify
    '''
    if len(key_list) != len(data_list):
        print("WARNING length of both lists should be equal")
        return 0
    qos_map_list = create_qos_map_to_value_list(map_type, key_list,
                                                data_list)
    qos_map_id = sai_thrift_create_qos_map(client,
                                           type=int(map_type),
                                           map_to_value_list=qos_map_list)
    if (qos_map_id != 0) and verify:
        if verify_qos_map(client, qos_map_id, map_type, key_list,
                          data_list) is False:
            print("WARNING! failed to verify the qos_map 0x%x" % (qos_map_id))
            sai_thrift_remove_qos_map(client, qos_map_id)
            qos_map_id = 0
    return qos_map_id


@group("draft")
class L2QosMapBaseClass(SaiHelperBase):
    """Verifies SAI bridge port flood test case"""
    def setUp(self):
        super(L2QosMapBaseClass, self).setUp()
        self.bp_port_list = []
        self.vlan_member_list = []
        self.test_dev_ports = []
        self.test_ports = [self.port0, self.port1, self.port2, self.port3]
        self.dev_test_port_list = [
            self.dev_port0, self.dev_port1, self.dev_port2, self.dev_port3
        ]
        vlan_id = 1
        i = 0
        for port in self.test_ports:
            sai_thrift_set_port_attribute(self.client,
                                          port,
                                          port_vlan_id=vlan_id)
            bp_port = sai_thrift_create_bridge_port(
                self.client,
                bridge_id=self.default_1q_bridge,
                port_id=port,
                type=SAI_BRIDGE_PORT_TYPE_PORT,
                admin_state=True)
            setattr(self, 'port%d_bp' % (i), bp_port)
            self.bp_port_list.append(bp_port)
            vlan_member = sai_thrift_create_vlan_member(
                self.client,
                vlan_id=self.default_vlan_id,
                bridge_port_id=bp_port,
                vlan_tagging_mode=SAI_VLAN_TAGGING_MODE_TAGGED)
            self.vlan_member_list.append(vlan_member)
            i += 1

    def tearDown(self):
        sai_thrift_flush_fdb_entries(
            self.client,
            entry_type=SAI_FDB_FLUSH_ENTRY_TYPE_ALL)
        for vlan_member in self.vlan_member_list:
            sai_thrift_remove_vlan_member(self.client, vlan_member)
        for bp_port in self.bp_port_list:
            sai_thrift_remove_bridge_port(self.client, bp_port)
        for port in self.test_ports:
            sai_thrift_set_port_attribute(
                self.client, port, port_vlan_id=0)
        super(L2QosMapBaseClass, self).tearDown()

    def getPortQueueIndexStats(self, port, index, qstats):
        ''' Returns the port queue index stats.
        Args:
            port (list): list of port object ids
            index (uint): port queue index
            qstats (list): list of requested port queue statistics
        Returns:
            uint: port queue counters statistics
        '''
        total_cnt = 0
        sai_list = sai_thrift_u32_list_t(count=100, uint32list=[])
        attr = sai_thrift_get_port_attribute(self.client,
                                             port,
                                             qos_queue_list=sai_list)
        queue_list = attr['qos_queue_list'].idlist
        queue = queue_list[index]
        attr = sai_thrift_get_queue_attribute(self.client, queue, index=True)
        self.assertTrue(attr['index'] == index, "Failed to get the queue")
        for q_stat in qstats:
            stats = query_counter(
                    self, sai_thrift_get_queue_stats, queue)
            total_cnt += stats[q_stat]
        return total_cnt


@group("draft")
class L3QosMapBaseClass(SaiHelperBase):
    ''' QOS Map Tests Base class '''
    def setUp(self):
        dmac0 = '00:11:22:33:44:06'
        dmac1 = '00:11:22:33:44:04'
        nhop_ip0 = '10.10.10.10'
        nhop_ip1 = '10.10.10.11'
        nhop_ip2 = '10.10.10.12'
        nhop_ip3 = '10.10.10.13'
        super(L3QosMapBaseClass, self).setUp()
        self.ppg_list = [0] * 8
        self.test_case_name = ""
        self.test_mapping = [0] * 4
        self.test_dev_ports = []
        self.test_ports = [self.port0, self.port1, self.port2, self.port3]
        self.dev_test_port_list = [
            self.dev_port0, self.dev_port1, self.dev_port2, self.dev_port3
        ]
        self.port0_rif = sai_thrift_create_router_interface(
            self.client,
            type=SAI_ROUTER_INTERFACE_TYPE_PORT,
            virtual_router_id=self.default_vrf,
            port_id=self.port0,
            admin_v4_state=True,
            admin_v6_state=True)
        self.port1_rif = sai_thrift_create_router_interface(
            self.client,
            type=SAI_ROUTER_INTERFACE_TYPE_PORT,
            virtual_router_id=self.default_vrf,
            port_id=self.port1,
            admin_v4_state=True,
            admin_v6_state=True)
        self.port2_rif = sai_thrift_create_router_interface(
            self.client,
            type=SAI_ROUTER_INTERFACE_TYPE_PORT,
            virtual_router_id=self.default_vrf,
            port_id=self.port2,
            admin_v4_state=True,
            admin_v6_state=True)
        self.port3_rif = sai_thrift_create_router_interface(
            self.client,
            type=SAI_ROUTER_INTERFACE_TYPE_PORT,
            virtual_router_id=self.default_vrf,
            port_id=self.port3,
            admin_v4_state=True,
            admin_v6_state=True)
        # # test neighbor creation
        self.neighbor_entry0 = sai_thrift_neighbor_entry_t(
            self.switch_id, self.port0_rif, sai_ipaddress(nhop_ip0))
        sai_thrift_create_neighbor_entry(self.client,
                                         self.neighbor_entry0,
                                         dst_mac_address=dmac1)
        self.neighbor_entry1 = sai_thrift_neighbor_entry_t(
            self.switch_id, self.port1_rif, sai_ipaddress(nhop_ip1))
        sai_thrift_create_neighbor_entry(self.client,
                                         self.neighbor_entry1,
                                         dst_mac_address=dmac1)
        self.neighbor_entry2 = sai_thrift_neighbor_entry_t(
            self.switch_id, self.port2_rif, sai_ipaddress(nhop_ip2))
        sai_thrift_create_neighbor_entry(self.client,
                                         self.neighbor_entry2,
                                         dst_mac_address=dmac1)
        self.neighbor_entry3 = sai_thrift_neighbor_entry_t(
            self.switch_id, self.port3_rif, sai_ipaddress(nhop_ip3))
        sai_thrift_create_neighbor_entry(self.client,
                                         self.neighbor_entry3,
                                         dst_mac_address=dmac1)
        self.nhop1 = sai_thrift_create_next_hop(
            self.client,
            ip=sai_ipaddress('10.10.10.11'),
            router_interface_id=self.port1_rif,
            type=SAI_NEXT_HOP_TYPE_IP)
        self.route_entry1 = sai_thrift_route_entry_t(
            vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.11/32'))
        sai_thrift_create_route_entry(self.client,
                                      self.route_entry1,
                                      next_hop_id=self.nhop1)
        # IPv6 route
        self.nhop0 = sai_thrift_create_next_hop(
            self.client,
            ip=sai_ipaddress('10.10.10.1'),
            router_interface_id=self.port2_rif,
            type=SAI_NEXT_HOP_TYPE_IP)
        self.neighbor_entry6 = sai_thrift_neighbor_entry_t(
            rif_id=self.port2_rif, ip_address=sai_ipaddress('10.10.10.1'))
        sai_thrift_create_neighbor_entry(self.client,
                                         self.neighbor_entry6,
                                         dst_mac_address=dmac0)
        self.route_entry1_ipv6 = sai_thrift_route_entry_t(
            vr_id=self.default_vrf,
            destination=sai_ipprefix(
                '1234:5678:9abc:def0:4422:1133:5577:1111/128'))
        sai_thrift_create_route_entry(self.client,
                                      self.route_entry1_ipv6,
                                      next_hop_id=self.nhop0)

    def tearDown(self):
        sai_thrift_remove_route_entry(self.client, self.route_entry1)
        sai_thrift_remove_route_entry(self.client, self.route_entry1_ipv6)
        sai_thrift_remove_next_hop(self.client, self.nhop0)
        sai_thrift_remove_next_hop(self.client, self.nhop1)
        sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry0)
        sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry1)
        sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry2)
        sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry3)
        sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry6)
        sai_thrift_remove_router_interface(self.client, self.port0_rif)
        sai_thrift_remove_router_interface(self.client, self.port1_rif)
        sai_thrift_remove_router_interface(self.client, self.port2_rif)
        sai_thrift_remove_router_interface(self.client, self.port3_rif)
        super(L3QosMapBaseClass, self).tearDown()

    def getPortQueueIndexStats(self, port, index, qstats):
        ''' Returns the port queue index stats.
        Args:
            port (list): list of port object ids
            index (uint): port queue index
            qstats (list): list of requested port queue statistics

        Returns:
            uint: port queue counters statistics
        '''
        total_cnt = 0
        sai_list = sai_thrift_u32_list_t(count=100, uint32list=[])
        attr = sai_thrift_get_port_attribute(self.client,
                                             port,
                                             qos_queue_list=sai_list)
        queue_list = attr['qos_queue_list'].idlist
        queue = queue_list[index]
        attr = sai_thrift_get_queue_attribute(self.client, queue, index=True)
        self.assertTrue(attr['index'] == index, "Failed to get the queue")
        for q_stat in qstats:
            stats = query_counter(
                    self, sai_thrift_get_queue_stats, queue)
            total_cnt += stats[q_stat]
        return total_cnt

    def getQueueStats(self, queues, qstats):
        ''' Returns the queue stats.
        Args:
            queues (list): list of queue object ids
            qstats (list): list of requested queue statistics
        Returns:
            uint: queue counters statistics
        '''
        total_cnt = 0
        for queue_oid in queues:
            stats = query_counter(
                    self, sai_thrift_get_queue_stats, queue_oid)
            for q_stat in qstats:
                total_cnt += stats[q_stat]
        return total_cnt

    def comparePortPPGStats(self, stats1, stats2):
        ''' Compares the tro ppg stats.
        Args:
            stats1 (list): stats 1 to be compared
            stats2 (list): stats 2 to be compared with stats 1
        Returns:
            bool: True if stats are equal.
        '''
        for port in range(0, len(self.test_dev_ports)):
            for ppg in range(8):
                if stats1[port][ppg] != stats2[port][ppg]:
                    print("comparePortPPGStats")
                    print("expected:", stats1)
                    print("received:", stats2)
                    print("PORT%d ppg=%d" % (port, ppg), "stats1[port][ppg]=",
                          stats1[port][ppg], "stats2[port][ppg])=",
                          stats2[port][ppg])
                    print("Not Equal")
                    return False
        return True

    def getPortPPGStats(self, ports):
        ''' Returns the prority groups ingress stats
            for given ports.
        Args:
            ports (list): list of dev port ids
        Returns:
            uint: ports priority group statistics
        '''
        stats = [0] * 4
        for port in range(0, len(ports)):
            stats[port] = [0] * 8
            for ppg in range(8):
                ppg_oid = self.ppg_list[port][ppg]
                cnt = self.getPpGroupStats(
                    [ppg_oid], ['SAI_INGRESS_PRIORITY_GROUP_STAT_PACKETS'])
                stats[port][ppg] = cnt
        return stats

    def getPpGroupStats(self, ppg_oids, ppg_stats):
        ''' Returns the prority groups stats
            for priority group object ids.
        Args:
            ppg_oids (list): list of priority group object ids
            ppg_stats (list): requested list of stats to be returned
        Returns:
            uint: ports priority group statistics
        '''
        total_cnt = 0
        for ppg_oid in ppg_oids:
            stats = query_counter(
                    self, sai_thrift_get_ingress_priority_group_stats, ppg_oid)
            for ppg_stat in ppg_stats:
                total_cnt += stats[ppg_stat]
        return total_cnt

    def setPortMultipleQosMapIds(self,
                                 port,
                                 qos_map_dict):
        ''' Sets the multiple qos map ids attributes
            for a given port.
        Args:
            port (obj_id): port object id
            qos_map_dict (dict): qos map object ids dictionary
        '''
        params = [
            'qos_pfc_priority_to_priority_group_map', 'qos_dot1p_to_tc_map',
            'qos_tc_to_priority_group_map', 'qos_dscp_to_tc_map',
            'qos_pfc_priority_to_queue_map'
        ]
        for key in qos_map_dict:
            for p in params:
                setattr(self, 't_%s' % p, None)
            temp_name = 't_' + key
            if key == 'qos_pfc_priority_to_priority_group_map':
                setattr(self, temp_name, qos_map_dict[key])
            if key == 'qos_dot1p_to_tc_map':
                setattr(self, temp_name, qos_map_dict[key])
            if key == 'qos_tc_to_priority_group_map':
                setattr(self, temp_name, qos_map_dict[key])
            if key == 'qos_dscp_to_tc_map':
                setattr(self, temp_name, qos_map_dict[key])
            if key == 'qos_pfc_priority_to_queue_map':
                setattr(self, temp_name, qos_map_dict[key])
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=getattr(
                    self, 't_qos_tc_to_priority_group_map'),
                qos_pfc_priority_to_priority_group_map=getattr(
                    self, 't_qos_pfc_priority_to_priority_group_map'),
                qos_pfc_priority_to_queue_map=getattr(
                    self, 't_qos_pfc_priority_to_queue_map'),
                qos_dot1p_to_tc_map=getattr(self, 't_qos_dot1p_to_tc_map'),
                qos_dscp_to_tc_map=getattr(self, 't_qos_dscp_to_tc_map'))


@group("draft")
class L3QosDscpToTcTest(L3QosMapBaseClass):
    """ L3 Test qos map Dscp to Tc Test attributes """
    def setUp(self):
        super(L3QosDscpToTcTest, self).setUp()

    def runTest(self):
        self.l3IPv4QosMapDscpToTcDefaultMappingTest()
        self.l3IPv6QosMapDscpToTcDefaultMappingTest()
        self.l3IPv4QosMapMultipleDscpToSingleTcMappingTest()
        self.l3IPv6QosMapMultipleDscpToSingleTcMappingTest()
        self.l3IPv4QosMapOneDscpToOneTcMappingTest()
        self.l3IPv6QosMapOneDscpToOneTcMappingTest()
        self.l3IPv4QosSameDscpToTcMappingManyPortsTest()
        self.l3IPv6QosSameDscpToTcMappingManyPortsTest()
        self.l3IPv4QosVariousDscpToTcMappingManyPortsTest()
        self.l3IPv6QosVariousDscpToTcMappingManyPortsTest()

    def tearDown(self):
        super(L3QosDscpToTcTest, self).tearDown()

    def l3IPv4QosVariousDscpToTcMappingManyPortsTest(self):
        '''
        L3 IPv4 DSCP to TC mapping for various ingress ports test.
        '''
        print("l3IPv4QosVariousDscpToTcMappingManyPortsTest")
        test_cases = []
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 0,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 1,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 2,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 3,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 4,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 5,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 6,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 7,
            'tc': 1,
            'queue': 1
        })
        # fall info default tc
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 8,
            'tc': 0,
            'queue': 0
        })
        # fall info default tc
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 9,
            'tc': 0,
            'queue': 0
        })
        # fall info default tc
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 0,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 1,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 2,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 3,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 4,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 5,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 6,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 7,
            'tc': 3,
            'queue': 3
        })
        # fall info default tc
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 8,
            'tc': 0,
            'queue': 0
        })
        # fall info default tc
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 9,
            'tc': 0,
            'queue': 0
        })
        # fall info default tc
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 0,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 1,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 2,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 3,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 4,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 5,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 6,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 7,
            'tc': 5,
            'queue': 5
        })
        # fall info default tc
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 8,
            'tc': 0,
            'queue': 0
        })
        # fall info default tc
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 9,
            'tc': 0,
            'queue': 0
        })
        # fall info default tc
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })
        egress_ports = [self.port1]
        try:
            # setup dscp to tc mapping
            # Port 0 qos map
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [0, 0, 0, 0, 1, 1, 1, 1]
            p0_qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            # Verify QosMap value list
            self.assertTrue(p0_qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            # Port 2 qos map
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [2, 2, 2, 2, 3, 3, 3, 3]
            p2_qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            self.assertTrue(p2_qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            # Port 3 qos map
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [4, 4, 4, 4, 5, 5, 5, 5]
            p3_qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            self.assertTrue(p3_qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            # setup Port 1 tc to queue index mapping
            p1_ingress_tc_list = [0, 1, 2, 3, 4, 5]
            p1_ingress_queue_list = [0, 1, 2, 3, 4, 5]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, p1_ingress_tc_list,
                p1_ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            # SET Port 0 dscp to TC mapping
            status = sai_thrift_set_port_attribute(
                self.client,
                self.port0,
                qos_dscp_to_tc_map=p0_qos_dscp_to_tc_map_id)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(self.client,
                                                 self.port0,
                                                 qos_dscp_to_tc_map=True)
            self.assertEqual(attr['qos_dscp_to_tc_map'],
                             p0_qos_dscp_to_tc_map_id)
            # SET Port 2 dscp to TC mapping
            status = sai_thrift_set_port_attribute(
                self.client,
                self.port2,
                qos_dscp_to_tc_map=p2_qos_dscp_to_tc_map_id)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(self.client,
                                                 self.port2,
                                                 qos_dscp_to_tc_map=True)
            self.assertEqual(attr['qos_dscp_to_tc_map'],
                             p2_qos_dscp_to_tc_map_id)
            # SET Port 3 dscp to TC mapping
            status = sai_thrift_set_port_attribute(
                self.client,
                self.port3,
                qos_dscp_to_tc_map=p3_qos_dscp_to_tc_map_id)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(self.client,
                                                 self.port3,
                                                 qos_dscp_to_tc_map=True,
                                                 qos_tc_to_queue_map=True)
            self.assertEqual(attr['qos_dscp_to_tc_map'],
                             p3_qos_dscp_to_tc_map_id)
            for port in egress_ports:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_to_queue_map=qos_tc_to_queue_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'],
                                 qos_tc_to_queue_map_id)
            for test in test_cases:
                ip_tos = test['dscp'] << 2
                pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                        eth_src='00:22:22:22:22:22',
                                        ip_dst='10.10.10.11',
                                        ip_src='192.168.0.1',
                                        ip_tos=ip_tos,
                                        ip_id=105,
                                        ip_ttl=64)
                exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                            eth_src=ROUTER_MAC,
                                            ip_dst='10.10.10.11',
                                            ip_src='192.168.0.1',
                                            ip_tos=ip_tos,
                                            ip_id=105,
                                            ip_ttl=63)
                initial_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending packet port %d (ip_tos=%d) ->"
                      " port %d (tc=%d => queue=%d)"
                      % (test['tx_port'], ip_tos, self.dev_port1, test['tc'],
                         test['queue']))
                send_packet(self, test['tx_port'], pkt)
                verify_packet(self, exp_pkt, self.dev_port1)
                post_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    initial_q_cnt + 1, post_q_cnt,
                    'queue {} packets counter {} != {}'.format(
                        test['queue'], initial_q_cnt + 1, post_q_cnt))
        finally:
            for port in self.test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)
            sai_thrift_remove_qos_map(self.client, p0_qos_dscp_to_tc_map_id)
            sai_thrift_remove_qos_map(self.client, p2_qos_dscp_to_tc_map_id)
            sai_thrift_remove_qos_map(self.client, p3_qos_dscp_to_tc_map_id)

    def l3IPv4QosSameDscpToTcMappingManyPortsTest(self):
        '''
        L3 IPv4 same DSCP to TC mapping for various ingress ports test.
        '''
        print("l3IPv4QosSameDscpToTcMappingManyPortsTest")
        # default DSCP to TC mapping
        test_cases = []
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 0,
            'tc': 7,
            'queue': 7
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 1,
            'tc': 6,
            'queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 2,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 3,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 4,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 5,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 6,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 7,
            'tc': 0,
            'queue': 0
        })
        # fall info default mapping
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 8,
            'tc': 0,
            'queue': 0
        })
        # fall info default mapping
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 9,
            'tc': 0,
            'queue': 0
        })
        # fall info default mapping
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 0,
            'tc': 7,
            'queue': 7
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 1,
            'tc': 6,
            'queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 2,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 3,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 4,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 5,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 6,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 7,
            'tc': 0,
            'queue': 0
        })
        # fall info default mapping
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 8,
            'tc': 0,
            'queue': 0
        })
        # fall info default mapping
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 9,
            'tc': 0,
            'queue': 0
        })
        # fall info default mapping
        test_cases.append({
            'tx_port': self.dev_port2,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 0,
            'tc': 7,
            'queue': 7
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 1,
            'tc': 6,
            'queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 2,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 3,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 4,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 5,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 6,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 7,
            'tc': 0,
            'queue': 0
        })
        # fall info default mapping
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 8,
            'tc': 0,
            'queue': 0
        })
        # fall info default mapping
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 9,
            'tc': 0,
            'queue': 0
        })
        # fall info default mapping
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })
        ingress_ports = [self.port0, self.port2, self.port3]
        egress_ports = [self.port1]
        try:
            # setup dscp to tc mapping
            # Port 0, 2 and 3  qos map
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [7, 6, 5, 4, 3, 2, 1, 0]
            qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            self.assertTrue(qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            # setup Port 1 tc to queue index mapping
            p1_ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            p1_ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, p1_ingress_tc_list,
                p1_ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            for port in ingress_ports:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=qos_dscp_to_tc_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'],
                                 qos_dscp_to_tc_map_id)
            for port in egress_ports:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_to_queue_map=qos_tc_to_queue_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'],
                                 qos_tc_to_queue_map_id)
            for test in test_cases:
                ip_tos = test['dscp'] << 2
                pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                        eth_src='00:22:22:22:22:22',
                                        ip_dst='10.10.10.11',
                                        ip_src='192.168.0.1',
                                        ip_tos=ip_tos,
                                        ip_id=105,
                                        ip_ttl=64)
                exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                            eth_src=ROUTER_MAC,
                                            ip_dst='10.10.10.11',
                                            ip_src='192.168.0.1',
                                            ip_tos=ip_tos,
                                            ip_id=105,
                                            ip_ttl=63)
                initial_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending packet port %d (ip_tos=%d) ->"
                      " port %d (tc=%d => queue=%d)"
                      % (test['tx_port'], ip_tos, self.dev_port1, test['tc'],
                         test['queue']))
                send_packet(self, test['tx_port'], pkt)
                verify_packet(self, exp_pkt, self.dev_port1)
                post_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    initial_q_cnt + 1, post_q_cnt,
                    'queue {} packets counter {} != {}'.format(
                        test['queue'], initial_q_cnt + 1, post_q_cnt))
        finally:
            for port in self.test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)
            sai_thrift_remove_qos_map(self.client, qos_dscp_to_tc_map_id)

    def l3IPv4QosMapOneDscpToOneTcMappingTest(self):
        '''
        L3 IPv4 one DSCP to one TC mapping for ingress ports test.
        '''
        print("l3IPv4QosMapOneDscpToOneTcMappingTest")
        # default DSCP to TC mapping
        test_cases = []
        test_cases.append({'dscp': 0, 'tc': 0, 'queue': 0})
        test_cases.append({'dscp': 1, 'tc': 1, 'queue': 1})
        test_cases.append({'dscp': 2, 'tc': 2, 'queue': 2})
        test_cases.append({'dscp': 3, 'tc': 3, 'queue': 3})
        test_cases.append({'dscp': 4, 'tc': 4, 'queue': 4})
        test_cases.append({'dscp': 5, 'tc': 5, 'queue': 5})
        test_cases.append({'dscp': 6, 'tc': 6, 'queue': 6})
        test_cases.append({'dscp': 7, 'tc': 7, 'queue': 7})
        try:
            # setup dscp to tc mapping
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            self.assertTrue(qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            # setup tc to queue index mapping
            ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            # set/get
            test_ports = [self.port0, self.port1]
            for port in [self.port0]:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=qos_dscp_to_tc_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'],
                                 qos_dscp_to_tc_map_id)
            for port in [self.port1]:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_to_queue_map=qos_tc_to_queue_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'],
                                 qos_tc_to_queue_map_id)
            for test in test_cases:
                ip_tos = test['dscp'] << 2
                pkt = simple_tcp_packet(
                    eth_dst=ROUTER_MAC,
                    eth_src='00:22:22:22:22:22',
                    ip_dst='10.10.10.11',
                    ip_src='192.168.0.1',
                    ip_tos=ip_tos,
                    ip_id=105,
                    ip_ttl=64)
                exp_pkt = simple_tcp_packet(
                    eth_dst='00:11:22:33:44:04',
                    eth_src=ROUTER_MAC,
                    ip_dst='10.10.10.11',
                    ip_src='192.168.0.1',
                    ip_tos=ip_tos,
                    ip_id=105,
                    ip_ttl=63)
                initial_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending packet port %d (ip_tos=%d) ->"
                      " port %d (tc=%d, queue=%d)"
                      % (self.dev_port0, ip_tos, self.dev_port1, test['tc'],
                         test['queue']))
                send_packet(self, self.dev_port0, pkt)
                verify_packet(self, exp_pkt, self.dev_port1)
                post_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    initial_q_cnt + 1, post_q_cnt,
                    'queue {} packets counter {} != {}'.format(
                        test['queue'], initial_q_cnt + 1, post_q_cnt))
        finally:
            for port in test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)
            sai_thrift_remove_qos_map(self.client, qos_dscp_to_tc_map_id)

    def l3IPv4QosMapMultipleDscpToSingleTcMappingTest(self):
        '''
        L3 IPv4 multiple DSCP to single TC mapping for ingress port test.
        '''
        print("l3IPv4QosMapMultipleDscpToSingleTcMappingTest")
        test_cases = []
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 0,
            'tc': 1,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 1,
            'tc': 1,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 2,
            'tc': 1,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 3,
            'tc': 1,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 4,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 5,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 6,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 7,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 8,
            'tc': 6,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 9,
            'tc': 6,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 10,
            'tc': 6,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 11,
            'tc': 6,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 12,
            'tc': 6,
            'queue': 0
        })
        try:
            # setup dscp to tc mapping
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [1, 1, 1, 1, 6, 6, 6, 6]
            qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            self.assertTrue(qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            # setup tc to queue index mapping
            ingress_tc_list = [1, 6]
            ingress_queue_list = [2, 5]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            # set/get
            ingress_ports = [self.port0, self.port2, self.port3]
            egress_ports = [self.port1]
            for port in ingress_ports:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=qos_dscp_to_tc_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'],
                                 qos_dscp_to_tc_map_id)
            for port in egress_ports:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_to_queue_map=qos_tc_to_queue_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'],
                                 qos_tc_to_queue_map_id)
            for test in test_cases:
                ip_tos = test['dscp'] << 2
                pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                        eth_src='00:22:22:22:22:22',
                                        ip_dst='10.10.10.11',
                                        ip_src='192.168.0.1',
                                        ip_tos=ip_tos,
                                        ip_id=105,
                                        ip_ttl=64)
                exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                            eth_src=ROUTER_MAC,
                                            ip_dst='10.10.10.11',
                                            ip_src='192.168.0.1',
                                            ip_tos=ip_tos,
                                            ip_id=105,
                                            ip_ttl=63)
                initial_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending packet port %d (ip_tos=%d) ->"
                      " port %d (tc=%d => queue=%d)"
                      % (test['tx_port'], ip_tos, self.dev_port1, test['tc'],
                         test['queue']))
                send_packet(self, test['tx_port'], pkt)
                verify_packet(self, exp_pkt, self.dev_port1)
                post_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    initial_q_cnt + 1, post_q_cnt,
                    'queue {} packets counter {} != {}'.format(
                        test['queue'], initial_q_cnt + 1, post_q_cnt))
        finally:
            for port in self.test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)
            sai_thrift_remove_qos_map(self.client, qos_dscp_to_tc_map_id)

    def l3IPv6QosMapMultipleDscpToSingleTcMappingTest(self):
        '''
        L3 IPv6 multiple DSCP to single TC mapping for ingress port test.
        '''
        print("l3IPv6QosMapMultipleDscpToSingleTcMappingTest")
        test_cases = []
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 0,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 1,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 2,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 3,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 4,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 5,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 6,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 7,
            'tc': 6,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 8,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 9,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 11,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 12,
            'tc': 0,
            'queue': 0
        })
        try:
            # setup dscp to tc mapping
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [6, 6, 6, 6, 6, 6, 6, 6]
            qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            self.assertTrue(qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            # setup tc to queue index mapping
            ingress_tc_list = [6]
            ingress_queue_list = [5]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            # set/get
            test_ports = [self.port0, self.port2]
            for port in test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=qos_dscp_to_tc_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'],
                                 qos_dscp_to_tc_map_id)
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_to_queue_map=qos_tc_to_queue_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'],
                                 qos_tc_to_queue_map_id)
            for test in test_cases:
                ipv6_tc = test['dscp'] << 2
                pkt = simple_tcpv6_packet(
                    eth_dst=ROUTER_MAC,
                    eth_src='00:22:22:22:22:22',
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=64,
                    ipv6_tc=ipv6_tc,
                    pktlen=100)
                exp_pkt = simple_tcpv6_packet(
                    eth_dst='00:11:22:33:44:06',
                    eth_src=ROUTER_MAC,
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=63,
                    ipv6_tc=ipv6_tc,
                    pktlen=100)
                initial_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending packet port %d (dscp=%d) ->"
                      " port %d (tc=%d queue=%d)"
                      % (test['tx_port'], test['dscp'], self.dev_port2,
                         test['tc'], test['queue']))
                send_packet(self, test['tx_port'], pkt)
                verify_packet(self, exp_pkt, self.dev_port2)
                post_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    initial_q_cnt + 1, post_q_cnt,
                    'queue {} packets counter {} != {}'.format(
                        test['queue'], initial_q_cnt + 1, post_q_cnt))
        finally:
            for port in test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)
            sai_thrift_remove_qos_map(self.client, qos_dscp_to_tc_map_id)

    def l3IPv6QosMapOneDscpToOneTcMappingTest(self):
        '''
        L3 IPv6 one DSCP to single TC mapping for ingress port test.
        '''
        print("l3IPv6QosMapOneDscpToOneTcMappingTest")
        test_cases = []
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 0,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 1,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 2,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 3,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 4,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 5,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 6,
            'tc': 6,
            'queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 7,
            'tc': 7,
            'queue': 7
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 8,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 9,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })  # default
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 11,
            'tc': 0,
            'queue': 0
        })  # default
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 12,
            'tc': 0,
            'queue': 0
        })  # default
        try:
            # setup dscp to tc mapping
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7, 9]
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7, 1]
            qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            self.assertTrue(qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            # setup tc to queue index mapping
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7, 1]
            ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7, 1]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            # set/get
            test_ports = [self.port0, self.port2]
            for port in test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=qos_dscp_to_tc_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'],
                                 qos_dscp_to_tc_map_id)
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_to_queue_map=qos_tc_to_queue_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'],
                                 qos_tc_to_queue_map_id)
            for test in test_cases:
                ipv6_tc = test['dscp'] << 2
                pkt = simple_tcpv6_packet(
                    eth_dst=ROUTER_MAC,
                    eth_src='00:22:22:22:22:22',
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=64,
                    ipv6_tc=ipv6_tc,
                    pktlen=100)
                exp_pkt = simple_tcpv6_packet(
                    eth_dst='00:11:22:33:44:06',
                    eth_src=ROUTER_MAC,
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=63,
                    ipv6_tc=ipv6_tc,
                    pktlen=100)
                initial_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending packet port %d (dscp=%d) ->"
                      " port %d (tc=%d queue=%d)"
                      % (test['tx_port'], test['dscp'], self.dev_port2,
                         test['tc'], test['queue']))
                send_packet(self, test['tx_port'], pkt)
                verify_packet(self, exp_pkt, self.dev_port2)
                post_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    initial_q_cnt + 1, post_q_cnt,
                    'queue {} packets counter {} != {}'.format(
                        test['queue'], initial_q_cnt + 1, post_q_cnt))
        finally:
            for port in test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)
            sai_thrift_remove_qos_map(self.client, qos_dscp_to_tc_map_id)

    def l3IPv6QosSameDscpToTcMappingManyPortsTest(self):
        '''
        L3 IPv6 same DSCP to TC mapping for various ingress port test.
        '''
        print("l3IPv6QosSameDscpToTcMappingManyPortsTest")
        test_cases = []
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 0,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 1,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 2,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 3,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 4,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 5,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 6,
            'tc': 6,
            'queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 7,
            'tc': 7,
            'queue': 7
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })  # default
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 0,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 1,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 2,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 3,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 4,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 5,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 6,
            'tc': 6,
            'queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 7,
            'tc': 7,
            'queue': 7
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })  # default
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 0,
            'tc': 0,
            'queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 1,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 2,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 3,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 4,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 5,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 6,
            'tc': 6,
            'queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 7,
            'tc': 7,
            'queue': 7
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })  # default
        try:
            # setup dscp to tc mapping
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            self.assertTrue(qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            # setup tc to queue index mapping
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            ingress_test_ports = [self.port0, self.port1, self.port3]
            egress_test_ports = [self.port2]
            for port in ingress_test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=qos_dscp_to_tc_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'],
                                 qos_dscp_to_tc_map_id)
            for port in egress_test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_to_queue_map=qos_tc_to_queue_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'],
                                 qos_tc_to_queue_map_id)
            for test in test_cases:
                ipv6_tc = test['dscp'] << 2
                pkt = simple_tcpv6_packet(
                    eth_dst=ROUTER_MAC,
                    eth_src='00:22:22:22:22:22',
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=64,
                    ipv6_tc=ipv6_tc,
                    pktlen=100)
                exp_pkt = simple_tcpv6_packet(
                    eth_dst='00:11:22:33:44:06',
                    eth_src=ROUTER_MAC,
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=63,
                    ipv6_tc=ipv6_tc,
                    pktlen=100)
                initial_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending packet port %d (dscp=%d) ->"
                      " port %d (tc=%d queue=%d)"
                      % (test['tx_port'], test['dscp'], self.dev_port2,
                         test['tc'], test['queue']))
                send_packet(self, test['tx_port'], pkt)
                verify_packet(self, exp_pkt, self.dev_port2)
                post_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    initial_q_cnt + 1, post_q_cnt,
                    'queue {} packets counter {} != {}'.format(
                        test['queue'], initial_q_cnt + 1, post_q_cnt))
        finally:
            for port in self.test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)
            sai_thrift_remove_qos_map(self.client, qos_dscp_to_tc_map_id)

    def l3IPv6QosVariousDscpToTcMappingManyPortsTest(self):
        '''
        L3 IPv6 various DSCP to TC mapping for various ingress port test.
        '''
        print("l3IPv6QosVariousDscpToTcMappingManyPortsTest")
        test_cases = []
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 0,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 1,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 2,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 3,
            'tc': 1,
            'queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 4,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 5,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 6,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 7,
            'tc': 2,
            'queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })  # default
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 0,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 1,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 2,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 3,
            'tc': 3,
            'queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 4,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 5,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 6,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 7,
            'tc': 4,
            'queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port1,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })  # default
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 0,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 1,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 2,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 3,
            'tc': 5,
            'queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 4,
            'tc': 6,
            'queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 5,
            'tc': 6,
            'queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 6,
            'tc': 6,
            'queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 7,
            'tc': 6,
            'queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port3,
            'dscp': 10,
            'tc': 0,
            'queue': 0
        })  # default
        try:
            # setup dscp to tc mapping
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [1, 1, 1, 1, 2, 2, 2, 2]
            p0_qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            self.assertTrue(p0_qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [3, 3, 3, 3, 4, 4, 4, 4]
            p1_qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            self.assertTrue(p1_qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            ingress_dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [5, 5, 5, 5, 6, 6, 6, 6]
            p3_qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
                ingress_tc_list)
            self.assertTrue(p3_qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            # setup tc to queue index mapping
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            # set/get
            egress_test_ports = [self.port2]
            # setup port 0
            status = sai_thrift_set_port_attribute(
                self.client,
                self.port0,
                qos_dscp_to_tc_map=p0_qos_dscp_to_tc_map_id)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(self.client,
                                                 self.port0,
                                                 qos_dscp_to_tc_map=True)
            self.assertEqual(attr['qos_dscp_to_tc_map'],
                             p0_qos_dscp_to_tc_map_id)
            # setup port 1
            status = sai_thrift_set_port_attribute(
                self.client,
                self.port1,
                qos_dscp_to_tc_map=p1_qos_dscp_to_tc_map_id)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(self.client,
                                                 self.port1,
                                                 qos_dscp_to_tc_map=True)
            self.assertEqual(attr['qos_dscp_to_tc_map'],
                             p1_qos_dscp_to_tc_map_id)
            # setup port 3
            status = sai_thrift_set_port_attribute(
                self.client,
                self.port3,
                qos_dscp_to_tc_map=p3_qos_dscp_to_tc_map_id)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(self.client,
                                                 self.port3,
                                                 qos_dscp_to_tc_map=True)
            self.assertEqual(attr['qos_dscp_to_tc_map'],
                             p3_qos_dscp_to_tc_map_id)
            for port in egress_test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_to_queue_map=qos_tc_to_queue_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'],
                                 qos_tc_to_queue_map_id)
            for test in test_cases:
                ipv6_tc = test['dscp'] << 2
                pkt = simple_tcpv6_packet(
                    eth_dst=ROUTER_MAC,
                    eth_src='00:22:22:22:22:22',
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=64,
                    ipv6_tc=ipv6_tc,
                    pktlen=100)
                exp_pkt = simple_tcpv6_packet(
                    eth_dst='00:11:22:33:44:06',
                    eth_src=ROUTER_MAC,
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=63,
                    ipv6_tc=ipv6_tc,
                    pktlen=100)
                initial_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending packet port %d (dscp=%d) ->"
                      " port %d (tc=%d, queue=%d)"
                      % (test['tx_port'], test['dscp'], self.dev_port2,
                         test['tc'], test['queue']))
                send_packet(self, test['tx_port'], pkt)
                verify_packet(self, exp_pkt, self.dev_port2)
                post_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    initial_q_cnt + 1, post_q_cnt,
                    'queue {} packets counter {} != {}'.format(
                        test['queue'], initial_q_cnt + 1, post_q_cnt))
        finally:
            for port in self.test_ports:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=int(
                        SAI_NULL_OBJECT_ID))
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)
            sai_thrift_remove_qos_map(self.client, p0_qos_dscp_to_tc_map_id)
            sai_thrift_remove_qos_map(self.client, p1_qos_dscp_to_tc_map_id)
            sai_thrift_remove_qos_map(self.client, p3_qos_dscp_to_tc_map_id)

    def l3IPv6QosMapDscpToTcDefaultMappingTest(self):
        '''
        L3 IPv6 DSCP to TC default mapping ingress port test.
        '''
        print("l3IPv6QosMapDscpToTcDefaultMappingTest")
        # default DSCP to TC mapping
        test_cases = []
        test_cases.append({'dscp': 0, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 1, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 2, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 3, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 4, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 5, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 6, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 7, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 10, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 12, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 0, 'port_default_tc': 1, 'queue': 1})
        test_cases.append({'dscp': 1, 'port_default_tc': 2, 'queue': 2})
        test_cases.append({'dscp': 2, 'port_default_tc': 3, 'queue': 3})
        test_cases.append({'dscp': 3, 'port_default_tc': 4, 'queue': 4})
        test_cases.append({'dscp': 4, 'port_default_tc': 5, 'queue': 5})
        test_cases.append({'dscp': 5, 'port_default_tc': 6, 'queue': 6})
        test_cases.append({'dscp': 6, 'port_default_tc': 7, 'queue': 7})
        test_cases.append({'dscp': 7, 'port_default_tc': 1, 'queue': 1})
        test_cases.append({'dscp': 10, 'port_default_tc': 1, 'queue': 1})
        test_cases.append({'dscp': 12, 'port_default_tc': 1, 'queue': 1})
        # setup tc -> queue mapping to make sure we always faii into default tc
        # = 0
        ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
        qos_tc_to_queue_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
            ingress_queue_list)
        self.assertTrue(qos_tc_to_queue_map_id != 0,
                        "Failed to create qos_map")

        status = sai_thrift_set_port_attribute(
            self.client,
            self.port2,
            qos_tc_to_queue_map=qos_tc_to_queue_map_id)
        self.assertEqual(status, SAI_STATUS_SUCCESS,
                         "Failed to set port attribute")
        attr = sai_thrift_get_port_attribute(self.client,
                                             self.port2,
                                             qos_tc_to_queue_map=True)
        self.assertEqual(attr['qos_tc_to_queue_map'], qos_tc_to_queue_map_id)

        for port in [self.port0, self.port1, self.port2, self.port3]:
            attr = sai_thrift_get_port_attribute(self.client,
                                                 port,
                                                 qos_dscp_to_tc_map=True,
                                                 qos_default_tc=True)
            self.assertEqual(attr['qos_dscp_to_tc_map'], 0)
            self.assertEqual(attr['qos_default_tc'], 0)
        try:
            for test in test_cases:
                ipv6_tc = test['dscp'] << 2
                pkt = simple_tcpv6_packet(
                    eth_dst=ROUTER_MAC,
                    eth_src='00:22:22:22:22:22',
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=64,
                    ipv6_tc=ipv6_tc,
                    pktlen=100)
                exp_pkt = simple_tcpv6_packet(
                    eth_dst='00:11:22:33:44:06',
                    eth_src=ROUTER_MAC,
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=63,
                    ipv6_tc=ipv6_tc,
                    pktlen=100)
                # setup port default_tc
                sai_thrift_set_port_attribute(
                    self.client,
                    self.port0,
                    qos_default_tc=test['port_default_tc'])
                attr = sai_thrift_get_port_attribute(self.client,
                                                     self.port0,
                                                     qos_default_tc=True)
                self.assertEqual(attr['qos_default_tc'],
                                 test['port_default_tc'])
                initial_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending packet port %d (dscp=%d) ->"
                      " port %d (port_default_tc=%d queue=%d)"
                      % (self.dev_port0, test['dscp'], self.dev_port1,
                         test['port_default_tc'], test['queue']))
                send_packet(self, self.dev_port0, pkt)
                verify_packet(self, exp_pkt, self.dev_port2)
                post_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    initial_q_cnt + 1, post_q_cnt,
                    'queue {} packets counter {} != {}'.format(
                        test['queue'], initial_q_cnt + 1, post_q_cnt))
        finally:
            sai_thrift_set_port_attribute(self.client,
                                          self.port0,
                                          qos_default_tc=0)
            sai_thrift_set_port_attribute(
                self.client,
                self.port2,
                qos_tc_to_queue_map=int(SAI_NULL_OBJECT_ID))
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)

    def l3IPv4QosMapDscpToTcDefaultMappingTest(self):
        '''
        L3 IPv4 DSCP to TC default mapping for ingress port test.
        '''
        print("l3IPv4QosMapDscpToTcDefaultMappingTest")
        # default DSCP to TC mapping
        test_cases = []
        test_cases.append({'dscp': 0, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 1, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 2, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 3, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 4, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 5, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 6, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 7, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 8, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 32, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 16, 'port_default_tc': 0, 'queue': 0})
        test_cases.append({'dscp': 0, 'port_default_tc': 5, 'queue': 5})
        test_cases.append({'dscp': 1, 'port_default_tc': 5, 'queue': 5})
        test_cases.append({'dscp': 2, 'port_default_tc': 5, 'queue': 5})
        test_cases.append({'dscp': 3, 'port_default_tc': 5, 'queue': 5})
        test_cases.append({'dscp': 4, 'port_default_tc': 5, 'queue': 5})
        test_cases.append({'dscp': 5, 'port_default_tc': 7, 'queue': 7})
        test_cases.append({'dscp': 6, 'port_default_tc': 7, 'queue': 7})
        test_cases.append({'dscp': 7, 'port_default_tc': 7, 'queue': 7})
        test_cases.append({'dscp': 8, 'port_default_tc': 7, 'queue': 7})
        test_cases.append({'dscp': 32, 'port_default_tc': 7, 'queue': 7})
        test_cases.append({'dscp': 16, 'port_default_tc': 7, 'queue': 7})
        # setup tc to queue index mapping
        ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
        qos_tc_to_queue_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
            ingress_queue_list)
        self.assertTrue(qos_tc_to_queue_map_id != 0,
                        "Failed to create qos_map")
        status = sai_thrift_set_port_attribute(
            self.client,
            self.port1,
            qos_tc_to_queue_map=qos_tc_to_queue_map_id)
        self.assertEqual(status, SAI_STATUS_SUCCESS,
                         "Failed to set port attribute")
        attr = sai_thrift_get_port_attribute(self.client,
                                             self.port1,
                                             qos_tc_to_queue_map=True)
        self.assertEqual(attr['qos_tc_to_queue_map'], qos_tc_to_queue_map_id)

        for port in [self.port0, self.port1, self.port2, self.port3]:
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(self.client,
                                                 port,
                                                 qos_dscp_to_tc_map=True,
                                                 qos_default_tc=True)
            self.assertEqual(attr['qos_dscp_to_tc_map'], 0)
            self.assertEqual(attr['qos_default_tc'], 0)
        try:
            for test in test_cases:
                ip_tos = test['dscp'] << 2
                pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                        eth_src='00:22:22:22:22:22',
                                        ip_dst='10.10.10.11',
                                        ip_src='192.168.0.1',
                                        ip_tos=ip_tos,
                                        ip_id=105,
                                        ip_ttl=64)
                exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                            eth_src=ROUTER_MAC,
                                            ip_dst='10.10.10.11',
                                            ip_src='192.168.0.1',
                                            ip_tos=ip_tos,
                                            ip_id=105,
                                            ip_ttl=63)
                # setup port default_tc
                sai_thrift_set_port_attribute(
                    self.client,
                    self.port0,
                    qos_default_tc=test['port_default_tc'])
                attr = sai_thrift_get_port_attribute(self.client,
                                                     self.port0,
                                                     qos_default_tc=True)
                self.assertEqual(attr['qos_default_tc'],
                                 test['port_default_tc'])
                initial_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending packet port %d (tos=%d) ->"
                      " port %d (port_default_tc=%d queue=%d)"
                      % (self.dev_port0, ip_tos, self.dev_port1,
                         test['port_default_tc'], test['queue']))
                send_packet(self, self.dev_port0, pkt)
                verify_packet(self, exp_pkt, self.dev_port1)
                post_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['queue'], ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    initial_q_cnt + 1, post_q_cnt,
                    'queue {} packets counter {} != {}'.format(
                        test['queue'], initial_q_cnt + 1, post_q_cnt))
                print("\tok")
        finally:
            sai_thrift_set_port_attribute(self.client,
                                          self.port0,
                                          qos_default_tc=0)
            sai_thrift_set_port_attribute(
                self.client,
                self.port1,
                qos_tc_to_queue_map=int(SAI_NULL_OBJECT_ID))
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)


@group("draft")
class QosDscpToColorTest(L3QosMapBaseClass):
    ''' Qos DSCP to Color test class.
    '''
    def setUp(self):
        super(QosDscpToColorTest, self).setUp()
        # setup dscp to tc mapping
        # map all 64 ingress dscps to tc=5 (can be any number)
        ingress_dscp_list = []
        ingress_tc_list = []
        ingress_color_list = []
        p1_ingress_color_list = []
        p2_ingress_color_list = []
        p3_ingress_color_list = []
        for dscp in range(0, 64):
            ingress_dscp_list.append(dscp)
            ingress_tc_list.append(5)
            color = int(dscp / 22)
            p1_color = (color + 1) % 3
            p2_color = (color + 2) % 3
            p3_color = (color + 3) % 3
            ingress_color_list.append(color)
            p1_ingress_color_list.append(p1_color)
            p2_ingress_color_list.append(p2_color)
            p3_ingress_color_list.append(p3_color)
        self.qos_dscp_to_tc_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
            ingress_tc_list)
        self.assertTrue(self.qos_dscp_to_tc_map_id != 0,
                        "Failed to create qos_map")
        # setup dscp to color mapping
        # map all 64 ingress dscps to color = dscp / 22
        self.p0_qos_dscp_to_color_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DSCP_TO_COLOR, ingress_dscp_list,
            ingress_color_list)
        self.assertTrue(self.p0_qos_dscp_to_color_map_id != 0,
                        "Failed to create qos_map")
        self.p1_qos_dscp_to_color_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DSCP_TO_COLOR, ingress_dscp_list,
            p1_ingress_color_list)
        self.assertTrue(self.p1_qos_dscp_to_color_map_id != 0,
                        "Failed to create qos_map")
        self.p2_qos_dscp_to_color_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DSCP_TO_COLOR, ingress_dscp_list,
            p2_ingress_color_list)
        self.assertTrue(self.p2_qos_dscp_to_color_map_id != 0,
                        "Failed to create qos_map")
        self.p3_qos_dscp_to_color_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DSCP_TO_COLOR, ingress_dscp_list,
            p3_ingress_color_list)
        self.assertTrue(self.p3_qos_dscp_to_color_map_id != 0,
                        "Failed to create qos_map")
        # on egress lets map all tc with color red and yellow to 0
        # and all tc with color green to 63.
        egress_tc_color_list = [
            [0, 0],
            [1, 0],
            [2, 0],
            [3, 0],
            [4, 0],
            [5, 0],
            [6, 0],
            [7, 0],
            [0, 1],
            [1, 1],
            [2, 1],
            [3, 1],
            [4, 1],
            [5, 1],
            [6, 1],
            [7, 1],
            [0, 2],
            [1, 2],
            [2, 2],
            [3, 2],
            [4, 2],
            [5, 2],
            [6, 2],
            [7, 2],
        ]
        egress_dscp_list = [
            63, 63, 63, 63, 63, 63, 63, 63,
            15, 15, 15, 15, 15, 15, 15, 15,
            11, 11, 11, 11, 11, 11, 11, 11,
        ]
        self.qos_tc_color_to_dscp_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DSCP,
            egress_tc_color_list, egress_dscp_list)
        self.assertTrue(self.qos_tc_color_to_dscp_map_id != 0,
                        "Failed to create qos_map")
        # ingress settings
        # set Port 0 DSCP -> TC mapping
        status = sai_thrift_set_port_attribute(
            self.client,
            self.port0,
            qos_dscp_to_tc_map=self.qos_dscp_to_tc_map_id)
        self.assertEqual(status, SAI_STATUS_SUCCESS,
                         "Failed to set port attribute")
        attr = sai_thrift_get_port_attribute(self.client,
                                             self.port0,
                                             qos_dscp_to_tc_map=True)
        self.assertEqual(attr['qos_dscp_to_tc_map'],
                         self.qos_dscp_to_tc_map_id)
        # egress settings
        # set the TC AND COLOR -> DSCP mapping
        # for port 1 for IPv4 and port2 for IPv6
        for port in [self.port1, self.port2]:
            # set Port 1 TC AND COLOR -> DSCP mapping
            status = sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_and_color_to_dscp_map=self.qos_tc_color_to_dscp_map_id)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(
                self.client, self.port1, qos_tc_and_color_to_dscp_map=True)
            self.assertEqual(attr['qos_tc_and_color_to_dscp_map'],
                             self.qos_tc_color_to_dscp_map_id)

    def runTest(self):
        self.l3IPv4QosMapDscpToColorDefaultMappingTest()
        self.l3IPv6QosMapDscpToColorDefaultMappingTest()
        self.l3IPv4QosMapManyDscpToSameColorTest()
        self.l3IPv6QosMapManyDscpToSameColorTest()
        self.l3IPv4QosMapSameDscpToColorManyIngressPortsTest()
        self.l3IPv6QosMapSameDscpToColorManyIngressPortsTest()
        self.l3IPv4QosMapVariousDscpToColorManyIngressPortsTest()
        self.l3IPv6QosMapVariousDscpToColorManyIngressPortsTest()

    def tearDown(self):
        for port in [self.port0, self.port1, self.port2]:
            sai_thrift_set_port_attribute(self.client,
                                          port,
                                          qos_dscp_to_tc_map=0)
            sai_thrift_set_port_attribute(self.client,
                                          port,
                                          qos_tc_and_color_to_dscp_map=0)
        sai_thrift_remove_qos_map(self.client, self.qos_dscp_to_tc_map_id)
        sai_thrift_remove_qos_map(self.client,
                                  self.qos_tc_color_to_dscp_map_id)
        sai_thrift_remove_qos_map(self.client,
                                  self.p0_qos_dscp_to_color_map_id)
        sai_thrift_remove_qos_map(self.client,
                                  self.p1_qos_dscp_to_color_map_id)
        sai_thrift_remove_qos_map(self.client,
                                  self.p2_qos_dscp_to_color_map_id)
        sai_thrift_remove_qos_map(self.client,
                                  self.p3_qos_dscp_to_color_map_id)
        super(QosDscpToColorTest, self).tearDown()

    def l3IPv4QosMapDscpToColorDefaultMappingTest(self):
        '''
        L3 IPv4 DSCP to COLOR default mapping for ingress port test.
        '''
        print("l3IPv4QosMapDscpToColorDefaultMappingTest")
        for ingress_dscp in range(0, 64):
            ingress_ip_tos = ingress_dscp << 2
            # only color green maps to dscp 63
            egress_ip_tos = 63 << 2
            pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                    eth_src='00:22:22:22:22:22',
                                    ip_dst='10.10.10.11',
                                    ip_src='192.168.0.1',
                                    ip_tos=ingress_ip_tos,
                                    ip_id=105,
                                    ip_ttl=64)
            exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                        eth_src=ROUTER_MAC,
                                        ip_dst='10.10.10.11',
                                        ip_src='192.168.0.1',
                                        ip_tos=egress_ip_tos,
                                        ip_id=105,
                                        ip_ttl=63)
            send_packet(self, self.dev_port0, pkt)
            verify_packet(self, exp_pkt, self.dev_port1)

    def l3IPv6QosMapDscpToColorDefaultMappingTest(self):
        '''
        L3 IPv6 DSCP to COLOR default mapping for ingress port test.
        '''
        print("l3IPv6QosMapDscpToColorDefaultMappingTest")
        for ingress_dscp in range(0, 64):
            egress_dscp = 63
            ingress_ipv6_tc = ingress_dscp << 2
            egress_ipv6_tc = egress_dscp << 2
            pkt = simple_tcpv6_packet(
                eth_dst=ROUTER_MAC,
                eth_src='00:22:22:22:22:22',
                ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                ipv6_src='2000::1',
                ipv6_hlim=64,
                ipv6_tc=ingress_ipv6_tc,
                pktlen=100)
            exp_pkt = simple_tcpv6_packet(
                eth_dst='00:11:22:33:44:06',
                eth_src=ROUTER_MAC,
                ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                ipv6_src='2000::1',
                ipv6_hlim=63,
                ipv6_tc=egress_ipv6_tc,
                pktlen=100)
            send_packet(self, self.dev_port0, pkt)
            verify_packet(self, exp_pkt, self.dev_port2)

    def l3IPv4QosMapManyDscpToSameColorTest(self):
        '''
        L3 IPv4 many DSCP to same COLOR mapping for ingress port test.
        '''
        print("l3IPv4QosMapManyDscpToSameColorTest")
        # ingress settings
        # set Port 0 DSCP -> COLOR mapping
        status = sai_thrift_set_port_attribute(
            self.client,
            self.port0,
            qos_dscp_to_color_map=self.p0_qos_dscp_to_color_map_id)
        self.assertEqual(status, SAI_STATUS_SUCCESS,
                         "Failed to set port attribute")
        attr = sai_thrift_get_port_attribute(self.client,
                                             self.port0,
                                             qos_dscp_to_color_map=True)
        self.assertEqual(attr['qos_dscp_to_color_map'],
                         self.p0_qos_dscp_to_color_map_id)
        for ingress_dscp in range(0, 64):
            ingress_ip_tos = ingress_dscp << 2
            if ingress_dscp < 22:
                egress_dscp = 63
            elif ingress_dscp < 44:
                egress_dscp = 15
            else:
                egress_dscp = 11
            egress_ip_tos = egress_dscp << 2
            pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                    eth_src='00:22:22:22:22:22',
                                    ip_dst='10.10.10.11',
                                    ip_src='192.168.0.1',
                                    ip_tos=ingress_ip_tos,
                                    ip_id=105,
                                    ip_ttl=64)
            exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                        eth_src=ROUTER_MAC,
                                        ip_dst='10.10.10.11',
                                        ip_src='192.168.0.1',
                                        ip_tos=egress_ip_tos,
                                        ip_id=105,
                                        ip_ttl=63)
            send_packet(self, self.dev_port0, pkt)
            verify_packet(self, exp_pkt, self.dev_port1)

    def l3IPv6QosMapManyDscpToSameColorTest(self):
        '''
        L3 IPv6 many DSCP to same COLOR mapping for ingress port test.
        '''
        print("l3IPv6QosMapManyDscpToSameColorTest")
        # ingress settings
        # set Port 0 DSCP -> COLOR mapping
        status = sai_thrift_set_port_attribute(
            self.client,
            self.port0,
            qos_dscp_to_color_map=self.p0_qos_dscp_to_color_map_id)
        self.assertEqual(status, SAI_STATUS_SUCCESS,
                         "Failed to set port attribute")
        attr = sai_thrift_get_port_attribute(self.client,
                                             self.port0,
                                             qos_dscp_to_color_map=True)
        self.assertEqual(attr['qos_dscp_to_color_map'],
                         self.p0_qos_dscp_to_color_map_id)
        for ingress_dscp in range(0, 64):
            if ingress_dscp < 22:
                egress_dscp = 63
            elif ingress_dscp < 44:
                egress_dscp = 15
            else:
                egress_dscp = 11
            ingress_ipv6_tc = ingress_dscp << 2
            egress_ipv6_tc = egress_dscp << 2
            pkt = simple_tcpv6_packet(
                eth_dst=ROUTER_MAC,
                eth_src='00:22:22:22:22:22',
                ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                ipv6_src='2000::1',
                ipv6_hlim=64,
                ipv6_tc=ingress_ipv6_tc,
                pktlen=100)
            exp_pkt = simple_tcpv6_packet(
                eth_dst='00:11:22:33:44:06',
                eth_src=ROUTER_MAC,
                ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                ipv6_src='2000::1',
                ipv6_hlim=63,
                ipv6_tc=egress_ipv6_tc,
                pktlen=100)
            send_packet(self, self.dev_port0, pkt)
            verify_packet(self, exp_pkt, self.dev_port2)

    def l3IPv4QosMapSameDscpToColorManyIngressPortsTest(self):
        '''
        L3 IPv4 many DSCP to COLOR mapping for various ingress port test.
        '''
        print("l3IPv4QosMapSameDscpToColorManyIngressPortsTest")
        # ingress settings
        # set Port 0, 2, 3 DSCP -> COLOR mapping
        for port in [self.port0, self.port2, self.port3]:
            status = sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_dscp_to_color_map=self.p0_qos_dscp_to_color_map_id)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(
                self.client, port, qos_dscp_to_color_map=True)
            self.assertEqual(attr['qos_dscp_to_color_map'],
                             self.p0_qos_dscp_to_color_map_id)
        for port in [self.dev_port0, self.dev_port2, self.dev_port3]:
            for ingress_dscp in range(0, 64):
                ingress_ip_tos = ingress_dscp << 2
                if ingress_dscp < 22:
                    egress_dscp = 63
                elif ingress_dscp < 44:
                    egress_dscp = 15
                else:
                    egress_dscp = 11
                egress_ip_tos = egress_dscp << 2
                pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                        eth_src='00:22:22:22:22:22',
                                        ip_dst='10.10.10.11',
                                        ip_src='192.168.0.1',
                                        ip_tos=ingress_ip_tos,
                                        ip_id=105,
                                        ip_ttl=64)
                exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                            eth_src=ROUTER_MAC,
                                            ip_dst='10.10.10.11',
                                            ip_src='192.168.0.1',
                                            ip_tos=egress_ip_tos,
                                            ip_id=105,
                                            ip_ttl=63)
                send_packet(self, port, pkt)
                verify_packet(self, exp_pkt, self.dev_port1)

    def l3IPv6QosMapSameDscpToColorManyIngressPortsTest(self):
        '''
        L3 IPv6 same DSCP to COLOR mapping for various ingress port test.
        '''
        print("l3IPv6QosMapSameDscpToColorManyIngressPortsTest")
        # ingress settings
        for port in [self.port0, self.port1, self.port3]:
            status = sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_dscp_to_color_map=self.p0_qos_dscp_to_color_map_id)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(
                self.client, port, qos_dscp_to_color_map=True)
            self.assertEqual(attr['qos_dscp_to_color_map'],
                             self.p0_qos_dscp_to_color_map_id)
        for port in [self.dev_port0, self.dev_port1, self.dev_port3]:
            for ingress_dscp in range(0, 64):
                if ingress_dscp < 22:
                    egress_dscp = 63
                elif ingress_dscp < 44:
                    egress_dscp = 15
                else:
                    egress_dscp = 11
                ingress_ipv6_tc = ingress_dscp << 2
                egress_ipv6_tc = egress_dscp << 2
                pkt = simple_tcpv6_packet(
                    eth_dst=ROUTER_MAC,
                    eth_src='00:22:22:22:22:22',
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=64,
                    ipv6_tc=ingress_ipv6_tc,
                    pktlen=100)
                exp_pkt = simple_tcpv6_packet(
                    eth_dst='00:11:22:33:44:06',
                    eth_src=ROUTER_MAC,
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=63,
                    ipv6_tc=egress_ipv6_tc,
                    pktlen=100)
                send_packet(self, port, pkt)
                verify_packet(self, exp_pkt, self.dev_port2)

    def l3IPv4QosMapVariousDscpToColorManyIngressPortsTest(self):
        '''
        L3 IPv4 various DSCP to COLOR mapping for various ingress port test.
        '''
        print("l3IPv4QosMapVariousDscpToColorManyIngressPortsTest")
        try:
            # ingress settings
            # set Port 0, 2, 3 DSCP -> COLOR mapping
            for port, dscp_color in [
                    [self.port0, self.p0_qos_dscp_to_color_map_id],
                    [self.port2, self.p2_qos_dscp_to_color_map_id],
                    [self.port3, self.p3_qos_dscp_to_color_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_color_map=dscp_color)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(
                    self.client, port, qos_dscp_to_color_map=True)
                self.assertEqual(attr['qos_dscp_to_color_map'], dscp_color)
            egress_port = self.dev_port1
            test_dev_port_list = [self.dev_port0, self.dev_port1,
                                  self.dev_port2, self.dev_port3]
            for p_idx, port in enumerate(test_dev_port_list):
                if port == egress_port:
                    continue
                for ingress_dscp in range(0, 64):
                    if ingress_dscp < 22:
                        egress_dscp_list = [63, 15, 11, 63]
                    elif ingress_dscp < 44:
                        egress_dscp_list = [15, 11, 63, 15]
                    else:
                        egress_dscp_list = [11, 63, 15, 11]
                    egress_dscp = egress_dscp_list[p_idx]
                    ingress_ip_tos = ingress_dscp << 2
                    egress_ip_tos = egress_dscp << 2
                    pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                            eth_src='00:22:22:22:22:22',
                                            ip_dst='10.10.10.11',
                                            ip_src='192.168.0.1',
                                            ip_tos=ingress_ip_tos,
                                            ip_id=105,
                                            ip_ttl=64)
                    exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                                eth_src=ROUTER_MAC,
                                                ip_dst='10.10.10.11',
                                                ip_src='192.168.0.1',
                                                ip_tos=egress_ip_tos,
                                                ip_id=105,
                                                ip_ttl=63)
                    send_packet(self, port, pkt)
                    verify_packet(self, exp_pkt, egress_port)
        finally:
            for port in [self.port0, self.port2, self.port3]:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_dscp_to_color_map=0)

    def l3IPv6QosMapVariousDscpToColorManyIngressPortsTest(self):
        '''
        L3 IPv6 various DSCP to COLOR mapping for various ingress port test.
        '''
        print("l3IPv6QosMapVariousDscpToColorManyIngressPortsTest")
        try:
            # ingress settings
            # set Port 0,1,3 DSCP -> COLOR mapping
            for port, dscp_color in [
                    [self.port0, self.p0_qos_dscp_to_color_map_id],
                    [self.port1, self.p1_qos_dscp_to_color_map_id],
                    [self.port3, self.p3_qos_dscp_to_color_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_color_map=dscp_color)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(
                    self.client, port, qos_dscp_to_color_map=True)
                self.assertEqual(attr['qos_dscp_to_color_map'], dscp_color)
            egress_port = self.dev_port2
            test_dev_port_list = [self.dev_port0, self.dev_port1,
                                  self.dev_port2, self.dev_port3]
            for p_idx, port in enumerate(test_dev_port_list):
                if port == egress_port:
                    continue
                for ingress_dscp in range(0, 64):
                    if ingress_dscp < 22:
                        egress_dscp_list = [63, 15, 11, 63]
                    elif ingress_dscp < 44:
                        egress_dscp_list = [15, 11, 63, 15]
                    else:
                        egress_dscp_list = [11, 63, 15, 11]
                    ingress_ipv6_tc = ingress_dscp << 2
                    egress_dscp = egress_dscp_list[p_idx]
                    egress_ipv6_tc = egress_dscp << 2
                    pkt = simple_tcpv6_packet(
                        eth_dst=ROUTER_MAC,
                        eth_src='00:22:22:22:22:22',
                        ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                        ipv6_src='2000::1',
                        ipv6_hlim=64,
                        ipv6_tc=ingress_ipv6_tc,
                        pktlen=100)
                    exp_pkt = simple_tcpv6_packet(
                        eth_dst='00:11:22:33:44:06',
                        eth_src=ROUTER_MAC,
                        ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                        ipv6_src='2000::1',
                        ipv6_hlim=63,
                        ipv6_tc=egress_ipv6_tc,
                        pktlen=100)
                    send_packet(self, port, pkt)
                    verify_packet(self, exp_pkt, egress_port)
        finally:
            for port in [self.port0, self.port1, self.port3]:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_dscp_to_color_map=0)


@group("draft")
class QosTcToPriorityGroupTestPFC(L3QosMapBaseClass):
    ''' QOS map TC to priority group test class
    '''
    def setUp(self):
        super(QosTcToPriorityGroupTestPFC, self).setUp()
        # setup dscp -> tc
        # testing QosTcToPriorityGroupTest
        # SAI_PORT_ATTR_QOS_DSCP_TO_TC_MAP
        # SAI_PORT_ATTR_QOS_PFC_PRIORITY_TO_PRIORITY_GROUP_MAP
        # setup tc -> tos
        # setup tos -> pgp
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_pfc_to_queue_map_id = []
        ingress_key_list = [0, 1, 2, 3, 4, 5, 6, 7]
        ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.qos_dscp_tc_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_key_list,
            ingress_tc_list)
        self.assertTrue(self.qos_dscp_tc_map_id != 0,
                        "Failed to create qos_map")
        self.dot1_to_tc_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_TC, ingress_key_list,
            ingress_tc_list)
        self.assertTrue(self.dot1_to_tc_map_id != 0,
                        "Failed to create qos_map")
        self.ppg_list = []
        self.ppg_list = [0] * 8
        p = 0
        for port in [self.port0, self.port1, self.port2, self.port3]:
            self.ppg_list[p] = []
            for ppg_index in range(8):
                ppg = sai_thrift_create_ingress_priority_group(
                    self.client, port, ppg_index)
                self.assertNotEqual(ppg, 0, "Failed to create priority group")
                self.ppg_list[p].append(ppg)
            p += 1
            # verify number of ppg groups
            attr = sai_thrift_get_port_attribute(
                self.client, port, number_of_ingress_priority_groups=True)
            nbr_groups = attr['number_of_ingress_priority_groups']
            ingress_priority_group_list = sai_thrift_u32_list_t(
                count=nbr_groups, uint32list=[])
            attr = sai_thrift_get_port_attribute(
                self.client,
                port,
                ingress_priority_group_list=ingress_priority_group_list)
            self.assertTrue(
                attr['ingress_priority_group_list'].count == nbr_groups,
                "Failed to verify ingress priority groups")
            self.assertTrue(nbr_groups == 8,
                            "Failed to verify ingress priority groups")
        ingress_pfc_prio_list = [0]
        ingress_pg_list = [0]
        self.pfc_to_pg_map_id = [0] * 8
        test_dev_ports = [self.dev_port0, self.dev_port1,
                          self.dev_port2, self.dev_port3]
        for port in range(0, len(test_dev_ports)):
            self.pfc_to_pg_map_id[port] = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP,
                ingress_pfc_prio_list, ingress_pg_list)
            self.assertTrue(self.pfc_to_pg_map_id[port] != 0,
                            "Failed to create qos_map")
        self.tc_to_pg_map_id = [0] * 8
        ingress_tc_list = [0]
        ingress_pg_list = [0]
        for port in range(0, len(test_dev_ports)):
            self.tc_to_pg_map_id[port] = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                ingress_tc_list, ingress_pg_list)
            self.assertTrue(self.tc_to_pg_map_id[port] != 0,
                            "Failed to create qos_map")
        # test default IPv4 frame
        self.ipv4_pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                          eth_src='00:22:22:22:22:22',
                                          ip_dst='10.10.10.11',
                                          ip_src='192.168.0.1',
                                          ip_dscp=0,
                                          ip_id=105,
                                          ip_ttl=64)
        self.ipv6_pkt = simple_tcpv6_packet(
            eth_dst=ROUTER_MAC,
            eth_src='00:22:22:22:22:22',
            ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
            ipv6_src='2000::1',
            ipv6_hlim=64,
            ipv6_tc=0,
            pktlen=100)
        self.eth_pkt = simple_arp_packet(pktlen=60, vlan_vid=1, vlan_pcp=0)

    def runTest(self):
        # PFC to Priority Group tests
        # Test case 1
        self.defaultNoPfcToPpgMappingIP()
        self.defaultNoPfcToPpgMappingEth()
        # Test case 2
        self.multiplePfcToSamePpgMappingIP()
        self.multiplePfcToSamePpgMappingEth()
        # Test case 3
        self.oneToOnePfcToPpgMappingIP()
        self.oneToOnePfcToPpgMappingEth()
        # Test case 4
        self.samePfcToPpgMapOnManyIngressPortsIPv4()
        self.samePfcToPpgMapOnManyIngressPortsIPv6()
        self.samePfcToPpgMapOnManyIngressPortsEth()
        # Test case 5
        self.variousPfcToPpgMapOnManyIngressPortsIPv4()
        self.variousPfcToPpgMapOnManyIngressPortsIPv6()
        self.variousPfcToPpgMapOnManyIngressPortsEth()
        # Test case 6
        self.noPfcToPpgMappingIPv4()
        self.noPfcToPpgMappingIPv6()
        self.noPfcToPpgMappingEth()

    def tearDown(self):
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        try:
            for port in [self.port0, self.port1, self.port2, self.port3]:
                self.setPortMultipleQosMapIds(
                    port,
                    qos_map_dict)

            sai_thrift_remove_qos_map(self.client, self.qos_dscp_tc_map_id)
        finally:
            i = 0
            test_dev_ports = [self.dev_port0, self.dev_port1, self.dev_port2,
                              self.dev_port3]
            for port in range(0, len(test_dev_ports)):
                sai_thrift_remove_qos_map(self.client,
                                          self.pfc_to_pg_map_id[port])
                sai_thrift_remove_qos_map(self.client,
                                          self.tc_to_pg_map_id[port])
                for ppg in self.ppg_list[port]:
                    sai_thrift_remove_ingress_priority_group(
                        self.client, ppg)
                    i += 1
            super(QosTcToPriorityGroupTestPFC, self).tearDown()

    def defaultNoPfcToPpgMappingIP(self):
        """
        Function configures the PFC to Priority Group test data
        for default No pfc -> ppg mapping test case
        """
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # default test_case
        self.test_case_name = "default No pfc -> ppg mapping"
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        # no port qos_map updated
        pfc_pg_list[0] = [0, 0, 0, 0, 0, 0, 0, 0]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def defaultNoPfcToPpgMappingEth(self):
        """
        Function configures the PFC to Priority Group test data
        for default No pfc -> ppg mapping
        """
        qos_map_type = SAI_QOS_MAP_TYPE_DOT1P_TO_TC
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # default test_case
        self.test_case_name = "default No pfc -> ppg mapping"
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        # no port qos_map updated
        pfc_pg_list[0] = [0, 0, 0, 0, 0, 0, 0, 0]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def multiplePfcToSamePpgMappingIP(self):
        """
        Function configures the PFC to Priority Group test data
        for multiple pfc -> same ppg mapping
        """
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # multiple pfc -> same ppg
        self.test_case_name = "multiple pfc -> same ppg mapping"
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [3, 3, 3, 3, 5, 5, 5, 5]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def multiplePfcToSamePpgMappingEth(self):
        """
        Function configures the PFC to Priority Group test data
        for multiple pfc -> same ppg mapping
        """
        qos_map_type = SAI_QOS_MAP_TYPE_DOT1P_TO_TC
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # multiple pfc -> same ppg
        self.test_case_name = "multiple pfc -> same ppg mapping"
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [3, 3, 3, 3, 5, 5, 5, 5]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def oneToOnePfcToPpgMappingIP(self):
        """
        Function configures the PFC to Priority Group test data
        for one to one pfc -> ppg mapping
        """
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # one to one mapping
        self.test_case_name = "one to one pfc -> ppg mapping"
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)

            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def oneToOnePfcToPpgMappingEth(self):
        """
        Function configures the PFC to Priority Group test data
        for one to one pfc -> ppg mapping
        """
        qos_map_type = SAI_QOS_MAP_TYPE_DOT1P_TO_TC
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # one to one mapping
        self.test_case_name = "one to one pfc -> ppg mapping"
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def samePfcToPpgMapOnManyIngressPortsIPv4(self):
        """
        Function configures the PFC to Priority Group test data
        for same pfc -> ppg map on many ingress ports
        """
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # same pfc -> ppg on different ingress ports
        self.test_case_name = "same pfc -> ppg map on many ingress ports"
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [6, 4, 1, 0, 7, 5, 2, 3]
        pfc_pg_list[1] = pfc_pg_list[0]
        pfc_pg_list[2] = pfc_pg_list[0]
        pfc_pg_list[3] = pfc_pg_list[0]
        mapping = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_dev_ports = [
            self.dev_port0, self.dev_port1, self.dev_port2, self.dev_port3]
        for ingress_port in range(0, len(self.test_dev_ports)):
            self.test_mapping[ingress_port] = mapping
            self.test_pfc_to_pg_map_id[
                ingress_port] = self.pfc_to_pg_map_id[0]
            self.test_tc_to_pg_map_id[ingress_port] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def samePfcToPpgMapOnManyIngressPortsIPv6(self):
        """
        Function configures the PFC to Priority Group test data
        for same pfc -> ppg map on many ingress ports
        """
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # same pfc -> ppg on different ingress ports
        self.test_case_name = "same pfc -> ppg map on many ingress ports"
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [6, 4, 1, 0, 7, 5, 2, 3]
        pfc_pg_list[1] = pfc_pg_list[0]
        pfc_pg_list[2] = pfc_pg_list[0]
        pfc_pg_list[3] = pfc_pg_list[0]
        mapping = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_dev_ports = [
            self.dev_port0, self.dev_port1, self.dev_port2, self.dev_port3]
        for ingress_port in range(0, len(self.test_dev_ports)):
            self.test_mapping[ingress_port] = mapping
            self.test_pfc_to_pg_map_id[
                ingress_port] = self.pfc_to_pg_map_id[0]
            self.test_tc_to_pg_map_id[ingress_port] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def samePfcToPpgMapOnManyIngressPortsEth(self):
        """
        Function configures the PFC to Priority Group test data
        for same pfc -> ppg map on many ingress ports
        """
        qos_map_type = SAI_QOS_MAP_TYPE_DOT1P_TO_TC
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # same pfc -> ppg on different ingress ports
        self.test_case_name = "same pfc -> ppg map on many ingress ports"
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [6, 4, 1, 0, 7, 5, 2, 3]
        pfc_pg_list[1] = pfc_pg_list[0]
        pfc_pg_list[2] = pfc_pg_list[0]
        pfc_pg_list[3] = pfc_pg_list[0]
        mapping = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_dev_ports = [
            self.dev_port0, self.dev_port1, self.dev_port2, self.dev_port3
        ]
        for ingress_port in range(0, len(self.test_dev_ports)):
            self.test_mapping[ingress_port] = mapping
            self.test_pfc_to_pg_map_id[
                ingress_port] = self.pfc_to_pg_map_id[0]
            self.test_tc_to_pg_map_id[ingress_port] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def variousPfcToPpgMapOnManyIngressPortsIPv4(self):
        """
        Function configures the PFC to Priority Group test data
        for various pfc -> ppg map on many ingress ports
        """
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # different pfc -> ppg on different ingress ports
        self.test_case_name = ("various pfc -> ppg map on many ingress " +
                               "ports")
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [0, 0, 0, 0, 1, 1, 1, 1]
        pfc_pg_list[1] = [2, 2, 2, 2, 3, 3, 3, 3]
        pfc_pg_list[2] = [4, 4, 4, 4, 5, 5, 5, 5]
        pfc_pg_list[3] = [6, 6, 6, 6, 7, 7, 7, 7]
        # this mapping works on model
        pfc_pg_list[0] = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[1] = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[2] = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[3] = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0, self.dev_port1,
                               self.dev_port2, self.dev_port3]
        for ingress_port in range(0, len(self.test_dev_ports)):
            mapping = combine_ingress_pfc_tc_to_pg_mapping(
                pfc_list, pfc_pg_list[ingress_port], tc_pg_list)
            self.test_mapping[ingress_port] = mapping
            self.test_pfc_to_pg_map_id[
                ingress_port] = self.pfc_to_pg_map_id[ingress_port]
            self.test_tc_to_pg_map_id[ingress_port] = self.tc_to_pg_map_id[
                ingress_port]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def variousPfcToPpgMapOnManyIngressPortsIPv6(self):
        """
        Function configures the PFC to Priority Group test data
        for various pfc -> ppg map on many ingress ports
        """
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # different pfc -> ppg on different ingress ports
        self.test_case_name = ("various pfc -> ppg map on many ingress " +
                               "ports")
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [0, 0, 0, 0, 1, 1, 1, 1]
        pfc_pg_list[1] = [2, 2, 2, 2, 3, 3, 3, 3]
        pfc_pg_list[2] = [4, 4, 4, 4, 5, 5, 5, 5]
        pfc_pg_list[3] = [6, 6, 6, 6, 7, 7, 7, 7]
        # this mapping works on model
        pfc_pg_list[0] = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[1] = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[2] = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[3] = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0, self.dev_port1,
                               self.dev_port2, self.dev_port3]
        for ingress_port in range(0, len(self.test_dev_ports)):
            mapping = combine_ingress_pfc_tc_to_pg_mapping(
                pfc_list, pfc_pg_list[ingress_port], tc_pg_list)
            self.test_mapping[ingress_port] = mapping
            self.test_pfc_to_pg_map_id[
                ingress_port] = self.pfc_to_pg_map_id[ingress_port]
            self.test_tc_to_pg_map_id[ingress_port] = self.tc_to_pg_map_id[
                ingress_port]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def variousPfcToPpgMapOnManyIngressPortsEth(self):
        """
        Function configures the PFC to Priority Group test data
        for various pfc -> ppg map on many ingress ports
        """
        qos_map_type = SAI_QOS_MAP_TYPE_DOT1P_TO_TC
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # different pfc -> ppg on different ingress ports
        self.test_case_name = ("various pfc -> ppg map on many ingress " +
                               "ports")
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [0, 0, 0, 0, 1, 1, 1, 1]
        pfc_pg_list[1] = [2, 2, 2, 2, 3, 3, 3, 3]
        pfc_pg_list[2] = [4, 4, 4, 4, 5, 5, 5, 5]
        pfc_pg_list[3] = [6, 6, 6, 6, 7, 7, 7, 7]
        # this mapping works on model
        pfc_pg_list[0] = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[1] = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[2] = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[3] = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0, self.dev_port1,
                               self.dev_port2, self.dev_port3]
        for ingress_port in range(0, len(self.test_dev_ports)):
            mapping = combine_ingress_pfc_tc_to_pg_mapping(
                pfc_list, pfc_pg_list[ingress_port], tc_pg_list)
            self.test_mapping[ingress_port] = mapping
            self.test_pfc_to_pg_map_id[
                ingress_port] = self.pfc_to_pg_map_id[ingress_port]
            self.test_tc_to_pg_map_id[ingress_port] = self.tc_to_pg_map_id[
                ingress_port]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def noPfcToPpgMappingIPv4(self):
        """
        Function configures the PFC to Priority Group test data
        for no pfc -> ppg mapping
        """
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # no pfc_ppg mapping defined
        self.test_case_name = "no pfc -> ppg mapping "
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [0, 0, 0, 0, 0, 0, 0, 0]  # no pfc to ppg updated
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                print(key, ppg)
                ingress_ip_tos = key << 2
                pkts = 1 + port
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def noPfcToPpgMappingIPv6(self):
        """
        Function configures the PFC to Priority Group test data
        for no pfc -> ppg mapping
        """
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # no pfc_ppg mapping defined
        self.test_case_name = "no pfc -> ppg mapping "
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [0, 0, 0, 0, 0, 0, 0, 0]  # no pfc to ppg updated
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)

            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                print(key, ppg)
                ingress_ip_tos = key << 2
                pkts = 1 + port
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def noPfcToPpgMappingEth(self):
        """
        Function configures the PFC to Priority Group test data
        for no pfc -> ppg mapping
        """
        qos_map_type = SAI_QOS_MAP_TYPE_DOT1P_TO_TC
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        pfc_pg_list = [0] * 4
        # no pfc_ppg mapping defined
        self.test_case_name = "no pfc -> ppg mapping "
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list[0] = [0, 0, 0, 0, 0, 0, 0, 0]  # no pfc to ppg updated
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list[0], tc_pg_list)
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            # for L2 set the SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            if pfc_pg_list[ingress_port] == 0:
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)

            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                print(key, ppg)
                pkts = 1 + port
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(8)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")


@group("draft")
class QosTcToPriorityGroupTestTC(L3QosMapBaseClass):
    ''' QOS map TC to priority group test class
    '''
    def setUp(self):
        super(QosTcToPriorityGroupTestTC, self).setUp()
        # setup dscp -> tc
        # testing QosTcToPriorityGroupTest
        # SAI_PORT_ATTR_QOS_DSCP_TO_TC_MAP
        # SAI_PORT_ATTR_QOS_PFC_PRIORITY_TO_PRIORITY_GROUP_MAP
        # setup tc -> tos
        # setup tos -> pgp
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_pfc_to_queue_map_id = []
        ingress_key_list = [0, 1, 2, 3, 4, 5, 6, 7]
        ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.qos_dscp_tc_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_key_list,
            ingress_tc_list)
        self.assertTrue(self.qos_dscp_tc_map_id != 0,
                        "Failed to create qos_map")
        self.dot1_to_tc_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_TC, ingress_key_list,
            ingress_tc_list)
        self.assertTrue(self.dot1_to_tc_map_id != 0,
                        "Failed to create qos_map")
        self.ppg_list = []
        self.ppg_list = [0] * 8
        p = 0
        for port in [self.port0, self.port1, self.port2, self.port3]:
            self.ppg_list[p] = []
            for ppg_index in range(8):
                ppg = sai_thrift_create_ingress_priority_group(
                    self.client, port, ppg_index)
                self.assertNotEqual(ppg, 0, "Failed to create priority group")
                self.ppg_list[p].append(ppg)
            p += 1
            # verify number of ppg groups
            attr = sai_thrift_get_port_attribute(
                self.client, port, number_of_ingress_priority_groups=True)
            nbr_groups = attr['number_of_ingress_priority_groups']
            ingress_priority_group_list = sai_thrift_u32_list_t(
                count=nbr_groups, uint32list=[])
            attr = sai_thrift_get_port_attribute(
                self.client,
                port,
                ingress_priority_group_list=ingress_priority_group_list)
            self.assertTrue(
                attr['ingress_priority_group_list'].count == nbr_groups,
                "Failed to verify ingress priority groups")
            self.assertTrue(nbr_groups == 8,
                            "Failed to verify ingress priority groups")
        ingress_pfc_prio_list = [0]
        ingress_pg_list = [0]
        self.pfc_to_pg_map_id = [0] * 8
        test_dev_ports = [self.dev_port0, self.dev_port1,
                          self.dev_port2, self.dev_port3]
        for port in range(0, len(test_dev_ports)):
            self.pfc_to_pg_map_id[port] = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP,
                ingress_pfc_prio_list, ingress_pg_list)
            self.assertTrue(self.pfc_to_pg_map_id[port] != 0,
                            "Failed to create qos_map")
        self.tc_to_pg_map_id = [0] * 8
        ingress_tc_list = [0]
        ingress_pg_list = [0]
        for port in range(0, len(test_dev_ports)):
            self.tc_to_pg_map_id[port] = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                ingress_tc_list, ingress_pg_list)
            self.assertTrue(self.tc_to_pg_map_id[port] != 0,
                            "Failed to create qos_map")
        # test default IPv4 frame
        self.ipv4_pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                          eth_src='00:22:22:22:22:22',
                                          ip_dst='10.10.10.11',
                                          ip_src='192.168.0.1',
                                          ip_dscp=0,
                                          ip_id=105,
                                          ip_ttl=64)
        self.exp_ipv4_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                              eth_src=ROUTER_MAC,
                                              ip_dst='10.10.10.11',
                                              ip_src='192.168.0.1',
                                              ip_dscp=0,
                                              ip_id=105,
                                              ip_ttl=63)
        self.ipv6_pkt = simple_tcpv6_packet(
            eth_dst=ROUTER_MAC,
            eth_src='00:22:22:22:22:22',
            ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
            ipv6_src='2000::1',
            ipv6_hlim=64,
            ipv6_tc=0,
            pktlen=100)
        self.exp_ipv6_pkt = simple_tcpv6_packet(
            eth_dst='00:11:22:33:44:06',
            eth_src=ROUTER_MAC,
            ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
            ipv6_src='2000::1',
            ipv6_hlim=63,
            ipv6_tc=0,
            pktlen=100)
        self.eth_pkt = simple_arp_packet(pktlen=60, vlan_vid=1, vlan_pcp=0)
        self.exp_eth_pkt = simple_arp_packet(pktlen=60, vlan_vid=1, vlan_pcp=0,
                                             eth_dst='ff:ff:ff:ff:ff:ff',
                                             eth_src='00:06:07:08:09:0a')

    def runTest(self):
        # TC to Priority Group tests
        # Test case 1
        self.defaultNoTcToPpgMappingIP()
        self.defaultNoTcToPpgMappingEth()
        # Test case 2
        self.multipleTcToSamePpgMappingIP()
        self.multipleTcToSamePpgMappingEth()
        # Test case 3
        self.oneToOneTcToPpgMappingIP()
        self.oneToOneTcToPpgMappingEth()
        # Test case 4
        self.sameTcToPpgMapOnDifferentIngressPortsIP()
        self.sameTcToPpgMapOnDifferentIngressPortsEth()
        # Test case 5
        self.variousTcToPpgMappingOnDifferentIngressPortsIP()
        self.variousTcToPpgMappingOnDifferentIngressPortsEth()
        # Test case 6
        self.noPfcToPpgMappingIP()
        self.noPfcToPpgMappingEth()

    def tearDown(self):
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        try:
            for port in [self.port0, self.port1, self.port2, self.port3]:
                self.setPortMultipleQosMapIds(
                    port,
                    qos_map_dict)

            sai_thrift_remove_qos_map(self.client, self.qos_dscp_tc_map_id)
        finally:
            i = 0
            test_dev_ports = [self.dev_port0, self.dev_port1, self.dev_port2,
                              self.dev_port3]
            for port in range(0, len(test_dev_ports)):
                sai_thrift_remove_qos_map(self.client,
                                          self.pfc_to_pg_map_id[port])
                sai_thrift_remove_qos_map(self.client,
                                          self.tc_to_pg_map_id[port])
                for ppg in self.ppg_list[port]:
                    sai_thrift_remove_ingress_priority_group(
                        self.client, ppg)
                    i += 1
            super(QosTcToPriorityGroupTestTC, self).tearDown()

    def defaultNoTcToPpgMappingIP(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for default No tc -> ppg mapping test case
        Args:
            qos_map_type (uint): qos map type test variant
        '''
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        self.test_case_name = "default No tc -> ppg mapping"
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[0] = [0, 0, 0, 0, 0, 0, 0, 0]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list, tc_pg_list[0])
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def defaultNoTcToPpgMappingEth(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for default No tc -> ppg mapping test case
        Args:
            qos_map_type (uint): qos map type test variant
        '''
        qos_map_type = SAI_QOS_MAP_TYPE_DOT1P_TO_TC
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        self.test_case_name = "default No tc -> ppg mapping"
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[0] = [0, 0, 0, 0, 0, 0, 0, 0]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list, tc_pg_list[0])
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def multipleTcToSamePpgMappingIP(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for multiple tc -> same ppg mapping test case
        Args:
            qos_map_type (uint): qos map type test variant
        '''
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        # multiple tc -> same ppg
        self.test_case_name = "multiple tc -> same ppg mapping"
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[0] = [7, 7, 7, 7, 3, 3, 3, 3]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list, tc_pg_list[0])
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def multipleTcToSamePpgMappingEth(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for multiple tc -> same ppg mapping test case
        Args:
            qos_map_type (uint): qos map type test variant
        '''
        qos_map_type = SAI_QOS_MAP_TYPE_DOT1P_TO_TC
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        # multiple tc -> same ppg
        self.test_case_name = "multiple tc -> same ppg mapping"
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[0] = [7, 7, 7, 7, 3, 3, 3, 3]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list, tc_pg_list[0])
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def oneToOneTcToPpgMappingIP(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for one to one tc -> ppg mapping test case
        Args:
            qos_map_type (uint): qos map type test variant
        '''
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        # one to one mapping
        self.test_case_name = "one to one tc -> ppg mapping"
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[0] = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list, tc_pg_list[0])
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def oneToOneTcToPpgMappingEth(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for one to one tc -> ppg mapping test case

        Args:
            qos_map_type (uint): qos map type test variant
        '''
        qos_map_type = SAI_QOS_MAP_TYPE_DOT1P_TO_TC
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        # one to one mapping
        self.test_case_name = "one to one tc -> ppg mapping"
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[0] = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_mapping[0] = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list, tc_pg_list[0])
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def sameTcToPpgMapOnDifferentIngressPortsIP(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for same tc -> ppg map on different ingress ports
        Args:
            qos_map_type (uint): qos map type test variant
        '''
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        # same tc -> ppg on different ingress ports
        self.test_case_name = ("same tc -> ppg map on different" +
                               "ingress ports")
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[0] = [7, 7, 0, 4, 2, 1, 6, 3]
        tc_pg_list[1] = tc_pg_list[0]
        tc_pg_list[2] = tc_pg_list[0]
        tc_pg_list[3] = tc_pg_list[0]
        mapping = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list, tc_pg_list[0])
        self.test_dev_ports = [self.dev_port0, self.dev_port1,
                               self.dev_port2, self.dev_port3]
        for ingress_port in range(0, len(self.test_dev_ports)):
            self.test_mapping[ingress_port] = mapping
            self.test_pfc_to_pg_map_id[
                ingress_port] = self.pfc_to_pg_map_id[0]
            self.test_tc_to_pg_map_id[ingress_port] = self.tc_to_pg_map_id[
                0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def sameTcToPpgMapOnDifferentIngressPortsEth(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for same tc -> ppg map on different ingress ports

        Args:
            qos_map_type (uint): qos map type test variant
        '''
        qos_map_type = SAI_QOS_MAP_TYPE_DOT1P_TO_TC
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        # same tc -> ppg on different ingress ports
        self.test_case_name = ("same tc -> ppg map on different" +
                               "ingress ports")
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[0] = [7, 7, 0, 4, 2, 1, 6, 3]
        tc_pg_list[1] = tc_pg_list[0]
        tc_pg_list[2] = tc_pg_list[0]
        tc_pg_list[3] = tc_pg_list[0]
        mapping = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list, tc_pg_list[0])
        self.test_dev_ports = [self.dev_port0, self.dev_port1,
                               self.dev_port2, self.dev_port3]
        for ingress_port in range(0, len(self.test_dev_ports)):
            self.test_mapping[ingress_port] = mapping
            self.test_pfc_to_pg_map_id[
                ingress_port] = self.pfc_to_pg_map_id[0]
            self.test_tc_to_pg_map_id[ingress_port] = self.tc_to_pg_map_id[
                0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def variousTcToPpgMappingOnDifferentIngressPortsIP(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for various tc -> ppg mapping on different ingress ports test case
        Args:
            qos_map_type (uint): qos map type test variant
        '''
        qos_map_type = SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        # different tc -> ppg on different ingress ports
        self.test_case_name = ("various tc -> ppg mapping on different " +
                               "ingress ports")
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        # below mapping is not supported on model
        tc_pg_list[0] = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[1] = [1, 1, 7, 6, 3, 4, 2, 7]
        tc_pg_list[2] = [2, 1, 4, 3, 2, 6, 4, 0]
        tc_pg_list[3] = [3, 1, 7, 3, 5, 4, 2, 6]

        # below mapping works on model
        tc_pg_list[0] = [1, 1, 7, 6, 3, 4, 2, 7]
        tc_pg_list[1] = [1, 1, 7, 6, 3, 4, 2, 7]
        tc_pg_list[2] = [1, 1, 7, 6, 3, 4, 2, 7]
        tc_pg_list[3] = [1, 1, 7, 6, 3, 4, 2, 7]
        self.test_dev_ports = [self.dev_port0, self.dev_port1,
                               self.dev_port2, self.dev_port3]
        for ingress_port in range(0, len(self.test_dev_ports)):
            mapping = combine_ingress_pfc_tc_to_pg_mapping(
                pfc_list, pfc_pg_list, tc_pg_list[ingress_port])
            self.test_mapping[ingress_port] = mapping
            self.test_pfc_to_pg_map_id[
                ingress_port] = self.pfc_to_pg_map_id[ingress_port]
            self.test_tc_to_pg_map_id[ingress_port] = self.tc_to_pg_map_id[
                ingress_port]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def variousTcToPpgMappingOnDifferentIngressPortsEth(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for various tc -> ppg mapping on different ingress ports test case
        Args:
            qos_map_type (uint): qos map type test variant
        '''
        qos_map_type = SAI_QOS_MAP_TYPE_DOT1P_TO_TC
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        # different tc -> ppg on different ingress ports
        self.test_case_name = ("various tc -> ppg mapping on different " +
                               "ingress ports")
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        # below mapping is not supported on model
        tc_pg_list[0] = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[1] = [1, 1, 7, 6, 3, 4, 2, 7]
        tc_pg_list[2] = [2, 1, 4, 3, 2, 6, 4, 0]
        tc_pg_list[3] = [3, 1, 7, 3, 5, 4, 2, 6]
        # below mapping works on model
        tc_pg_list[0] = [1, 1, 7, 6, 3, 4, 2, 7]
        tc_pg_list[1] = [1, 1, 7, 6, 3, 4, 2, 7]
        tc_pg_list[2] = [1, 1, 7, 6, 3, 4, 2, 7]
        tc_pg_list[3] = [1, 1, 7, 6, 3, 4, 2, 7]
        self.test_dev_ports = [self.dev_port0, self.dev_port1,
                               self.dev_port2, self.dev_port3]
        for ingress_port in range(0, len(self.test_dev_ports)):
            mapping = combine_ingress_pfc_tc_to_pg_mapping(
                pfc_list, pfc_pg_list, tc_pg_list[ingress_port])
            self.test_mapping[ingress_port] = mapping
            self.test_pfc_to_pg_map_id[
                ingress_port] = self.pfc_to_pg_map_id[ingress_port]
            self.test_tc_to_pg_map_id[ingress_port] = self.tc_to_pg_map_id[
                ingress_port]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_pfc_priority_to_priority_group_map=self.
                test_pfc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                pkts = 1 + port
                expected_cnt[port][ppg] += pkts
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")

    def noPfcToPpgMappingIP(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for no pfc -> ppg mapping test case
        Args:
            qos_map_type (uint): qos map type test variant
        '''
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        # no pfc_ppg mapping defined
        self.test_case_name = "no pfc -> ppg mapping"
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 0, 0, 0, 0, 0, 0, 0]  # no pfc to ppg updated
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[0] = [0, 1, 2, 3, 4, 5, 6, 7]
        mapping = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list, tc_pg_list[0])
        self.test_mapping[0] = mapping
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                print(key, ppg)
                ingress_ip_tos = key << 2
                pkts = 1 + port
                self.ipv4_pkt[IP].tos = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv4_pkt, pkts)
        self.dataplane.flush()
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")
        send_packet(self, self.dev_port3, self.ipv4_pkt)
        verify_packet(self, self.exp_ipv4_pkt, self.dev_port1)
        self.dataplane.flush()
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                ingress_ip_tos = key << 2
                pkts = 1 + port
                self.ipv6_pkt.tc = ingress_ip_tos
                send_packet(self, ingress_port, self.ipv6_pkt, pkts)
        self.dataplane.flush()
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")
        send_packet(self, self.dev_port3, self.ipv6_pkt)
        verify_packet(self, self.exp_ipv6_pkt, self.dev_port2)
        self.dataplane.flush()

    def noPfcToPpgMappingEth(
            self,
            qos_map_type=SAI_PORT_ATTR_QOS_DOT1P_TO_TC_MAP):
        ''' Function configures the TC to Priority Group test data
            for no pfc -> ppg mapping test case
        Args:
            qos_map_type (uint): qos map type test variant
        '''
        self.test_dev_ports = [self.dev_port0]
        self.test_pfc_to_pg_map_id = [0] * 4
        self.test_tc_to_pg_map_id = [0] * 4
        self.test_mapping = [0] * 4
        tc_pg_list = [0] * 4
        # no pfc_ppg mapping defined
        self.test_case_name = "no pfc -> ppg mapping"
        pfc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        pfc_pg_list = [0, 0, 0, 0, 0, 0, 0, 0]  # no pfc to ppg updated
        tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        tc_pg_list[0] = [0, 1, 2, 3, 4, 5, 6, 7]
        mapping = combine_ingress_pfc_tc_to_pg_mapping(
            pfc_list, pfc_pg_list, tc_pg_list[0])
        self.test_mapping[0] = mapping
        self.test_pfc_to_pg_map_id[0] = self.pfc_to_pg_map_id[0]
        self.test_tc_to_pg_map_id[0] = self.tc_to_pg_map_id[0]
        qos_map_dict = {
            "qos_pfc_priority_to_priority_group_map": 0,
            "qos_dot1p_to_tc_map": 0,
            "qos_tc_to_priority_group_map": 0,
            "qos_dscp_to_tc_map": 0}
        for port in self.test_ports:
            self.setPortMultipleQosMapIds(
                port,
                qos_map_dict)
        for ingress_port in range(0, len(self.test_dev_ports)):
            pfc_to_pg_map_id = self.test_pfc_to_pg_map_id[ingress_port]
            tc_to_pg_map_id = self.test_tc_to_pg_map_id[ingress_port]
            if (pfc_to_pg_map_id == 0) or (tc_to_pg_map_id == 0):
                continue
            # update QOS MAP PFC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, pfc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP, pfc_list,
                    pfc_pg_list), True,
                "Failed verify updated qos_map attribute")
            # update QOS MAP TC TO PRIORITY GROUP
            self.assertEqual(
                update_and_verify_qos_map(
                    self.client, tc_to_pg_map_id,
                    SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                    tc_list, tc_pg_list[ingress_port]), True,
                "Failed verify updated qos_map attribute")
        p = 0
        for port in self.test_ports:
            if self.test_pfc_to_pg_map_id[p] == 0:
                continue
            if qos_map_type == SAI_QOS_MAP_TYPE_DOT1P_TO_TC:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dot1p_to_tc_map=self.dot1_to_tc_map_id)
            else:
                sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_dscp_to_tc_map=self.qos_dscp_tc_map_id)
            # set the QOS PFC TO PRIORITY GROUP mapping
            sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_to_priority_group_map=self.test_tc_to_pg_map_id[p])
            p += 1
        # get the initial counters
        expected_cnt = self.getPortPPGStats(self.test_dev_ports)
        for port in range(0, len(self.test_dev_ports)):
            ingress_port = self.test_dev_ports[port]
            for key, ppg in self.test_mapping[port]:
                print(key, ppg)
                pkts = 1 + port
                self.eth_pkt[Ether][Dot1Q].prio = key
                send_packet(self, ingress_port, self.eth_pkt, pkts)
        self.dataplane.flush()
        print("Verify port/ppg pktcounters")
        time.sleep(5)
        post_cnt = self.getPortPPGStats(self.test_dev_ports)
        self.assertEqual(
            self.comparePortPPGStats(expected_cnt, post_cnt), True)
        print("\tok")
        self.dataplane.flush()


@group("draft")
class QosTcAndColorToDscpTest(L3QosMapBaseClass):
    ''' QOS TC and COLOR to DSCP test '''
    def setUp(self):
        super(QosTcAndColorToDscpTest, self).setUp()
        # setup dscp to tc and color mapping
        ingress_dscp_list = []
        p0_ingress_tc_list = []
        p1_ingress_tc_list = []
        p2_ingress_tc_list = []
        p3_ingress_tc_list = []
        for dscp in range(0, 64):
            ingress_dscp_list.append(dscp)
            # ingress_tc_list.append(5)
            if dscp < 24:
                p0_tc = dscp % 8
                p1_tc = (dscp + 1) % 8
                p2_tc = (dscp + 2) % 8
                p3_tc = (dscp + 3) % 8
            else:
                p0_tc = int(dscp / 8)
                p1_tc = int((dscp + 1) / 8) % 8
                p2_tc = int((dscp + 2) / 8) % 8
                p3_tc = int((dscp + 3) / 8) % 8
            p0_ingress_tc_list.append(p0_tc)
            p1_ingress_tc_list.append(p1_tc)
            p2_ingress_tc_list.append(p2_tc)
            p3_ingress_tc_list.append(p3_tc)
        # define ingress DSCP -> TC per port
        self.p0_qos_dscp_to_tc_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
            p0_ingress_tc_list)
        self.assertTrue(self.p0_qos_dscp_to_tc_map_id != 0,
                        "Failed to create qos_map")
        self.p1_qos_dscp_to_tc_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
            p1_ingress_tc_list)
        self.assertTrue(self.p1_qos_dscp_to_tc_map_id != 0,
                        "Failed to create qos_map")
        self.p2_qos_dscp_to_tc_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
            p2_ingress_tc_list)
        self.assertTrue(self.p2_qos_dscp_to_tc_map_id != 0,
                        "Failed to create qos_map")
        self.p3_qos_dscp_to_tc_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DSCP_TO_TC, ingress_dscp_list,
            p3_ingress_tc_list)
        self.assertTrue(self.p3_qos_dscp_to_tc_map_id != 0,
                        "Failed to create qos_map")
        # ingress settings
        # set Port 0 DSCP -> TC mapping
        # Ports 1, 2, 3 will be assigned in tests
        for port in [self.port0]:
            status = sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_dscp_to_tc_map=self.p0_qos_dscp_to_tc_map_id)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(self.client,
                                                 port,
                                                 qos_dscp_to_tc_map=True)
            self.assertEqual(attr['qos_dscp_to_tc_map'],
                             self.p0_qos_dscp_to_tc_map_id)
        # an example egress tc and color -> dscp
        # egress dscp = color * tc
        # defines mapping for egress dscp from 0 to 23
        egress_tc_color_list = [
            [0, 0],
            [1, 0],
            [2, 0],
            [3, 0],
            [4, 0],
            [5, 0],
            [6, 0],
            [7, 0],
            [0, 1],
            [1, 1],
            [2, 1],
            [3, 1],
            [4, 1],
            [5, 1],
            [6, 1],
            [7, 1],
            [0, 2],
            [1, 2],
            [2, 2],
            [3, 2],
            [4, 2],
            [5, 2],
            [6, 2],
            [7, 2],
        ]
        egress_dscp_list = [
            0, 1, 2, 3, 4, 5, 6, 7,
            8, 9, 10, 11, 12, 13, 14, 15,
            16, 17, 18, 19, 20, 21, 22, 23
        ]
        self.qos_tc_color_to_dscp_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DSCP,
            egress_tc_color_list, egress_dscp_list)
        self.assertTrue(self.qos_tc_color_to_dscp_map_id != 0,
                        "Failed to create qos_map")

    def runTest(self):
        self.l3IPv4QosMapTcColorToDscpDefaultMappingTest()
        self.l3IPv6QosMapTcColorToDscpDefaultMappingTest()
        self.l3IPv4QosMapTcColorToDscpMappingTest()
        self.l3IPv6QosMapTcColorToDscpMappingTest()
        self.l3IPv4QosMapTcColorToDscpManyIngressPortsTest()
        self.l3IPv6QosMapTcColorToDscpManyIngressPortsTest()
        self.l3IPv4QosMapVariousTcColorToDscpManyIngressPortsTest()
        self.l3IPv6QosMapVariousTcColorToDscpManyIngressPortsTest()

    def tearDown(self):
        for port in [self.port0, self.port1, self.port2, self.port3]:
            sai_thrift_set_port_attribute(self.client,
                                          port,
                                          qos_dscp_to_tc_map=0)
            sai_thrift_set_port_attribute(self.client,
                                          port,
                                          qos_tc_and_color_to_dscp_map=0)
        sai_thrift_remove_qos_map(self.client,
                                  self.qos_tc_color_to_dscp_map_id)
        sai_thrift_remove_qos_map(self.client, self.p0_qos_dscp_to_tc_map_id)
        sai_thrift_remove_qos_map(self.client, self.p1_qos_dscp_to_tc_map_id)
        sai_thrift_remove_qos_map(self.client, self.p2_qos_dscp_to_tc_map_id)
        sai_thrift_remove_qos_map(self.client, self.p3_qos_dscp_to_tc_map_id)
        super(QosTcAndColorToDscpTest, self).tearDown()

    def l3IPv4QosMapTcColorToDscpDefaultMappingTest(self):
        ''' L3 IPv4 no TC + Color -> DSCP mapping defined (Default Case)
            Test verifies that switch does not override the
            original packet dscp value '''
        print("l3IPv4QosMapTcColorToDscpDefaultMappingTest")
        for ingress_dscp in range(0, 64, DSCP_TEST_STEP):
            ingress_ip_tos = ingress_dscp << 2
            egress_ip_tos = ingress_ip_tos
            pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                    eth_src='00:22:22:22:22:22',
                                    ip_dst='10.10.10.11',
                                    ip_src='192.168.0.1',
                                    ip_tos=ingress_ip_tos,
                                    ip_id=105,
                                    ip_ttl=64)
            exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                        eth_src=ROUTER_MAC,
                                        ip_dst='10.10.10.11',
                                        ip_src='192.168.0.1',
                                        ip_tos=egress_ip_tos,
                                        ip_id=105,
                                        ip_ttl=63)
            send_packet(self, self.dev_port0, pkt)
            verify_packet(self, exp_pkt, self.dev_port1)

    def l3IPv6QosMapTcColorToDscpDefaultMappingTest(self):
        ''' L3 IPv6 no TC + Color -> DSCP mapping defined (Default Case)
            Test verifies that switch does not override the
            original packet dscp value '''
        print("l3IPv6QosMapTcColorToDscpDefaultMappingTest")
        for ingress_dscp in range(0, 64, DSCP_TEST_STEP):
            egress_dscp = ingress_dscp
            ingress_ipv6_tc = ingress_dscp << 2
            egress_ipv6_tc = egress_dscp << 2
            pkt = simple_tcpv6_packet(
                eth_dst=ROUTER_MAC,
                eth_src='00:22:22:22:22:22',
                ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                ipv6_src='2000::1',
                ipv6_hlim=64,
                ipv6_tc=ingress_ipv6_tc,
                pktlen=100)
            exp_pkt = simple_tcpv6_packet(
                eth_dst='00:11:22:33:44:06',
                eth_src=ROUTER_MAC,
                ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                ipv6_src='2000::1',
                ipv6_hlim=63,
                ipv6_tc=egress_ipv6_tc,
                pktlen=100)
            send_packet(self, self.dev_port0, pkt)
            verify_packet(self, exp_pkt, self.dev_port2)

    def l3IPv4QosMapTcColorToDscpMappingTest(self):
        ''' L3 IPv4
            TC + Color -> DSCP mapping defined
            Test verifies that switch does override the
            original packet dscp value accordingly to QOS mapping'''
        print("l3IPv4QosMapTcColorToDscpMappingTest")
        try:
            # egress settings
            # set the TC AND COLOR -> DSCP mapping
            # for port 1 for IPv4 and port2 for IPv6
            for port in [self.port1]:
                # set Port 1 TC AND COLOR -> DSCP mapping
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_and_color_to_dscp_map=self.
                    qos_tc_color_to_dscp_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(
                    self.client, port, qos_tc_and_color_to_dscp_map=True)
                self.assertEqual(attr['qos_tc_and_color_to_dscp_map'],
                                 self.qos_tc_color_to_dscp_map_id)
            for ingress_dscp in range(0, 64, DSCP_TEST_STEP):
                if ingress_dscp < 24:
                    egress_dscp = ingress_dscp % 8
                else:
                    egress_dscp = int(ingress_dscp / 8)
                ingress_ip_tos = ingress_dscp << 2
                egress_ip_tos = egress_dscp << 2
                pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                        eth_src='00:22:22:22:22:22',
                                        ip_dst='10.10.10.11',
                                        ip_src='192.168.0.1',
                                        ip_tos=ingress_ip_tos,
                                        ip_id=105,
                                        ip_ttl=64)
                exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                            eth_src=ROUTER_MAC,
                                            ip_dst='10.10.10.11',
                                            ip_src='192.168.0.1',
                                            ip_tos=egress_ip_tos,
                                            ip_id=105,
                                            ip_ttl=63)
                send_packet(self, self.dev_port0, pkt)
                verify_packet(self, exp_pkt, self.dev_port1)
        finally:
            all_ports = [self.port0, self.port1, self.port2, self.port3]
            for port in all_ports:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_tc_and_color_to_dscp_map=0)

    def l3IPv6QosMapTcColorToDscpMappingTest(self):
        ''' L3 IPv6
            TC + Color -> DSCP mapping defined
            Test verifies that switch does override the
            original packet dscp value accordingly to QOS mapping'''
        print("l3IPv6QosMapTcColorToDscpMappingTest")
        try:
            # egress settings
            # set the TC AND COLOR -> DSCP mapping
            # for port 1 for IPv4 and port2 for IPv6
            for port in [self.port2]:
                # set Port 1 TC AND COLOR -> DSCP mapping
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_and_color_to_dscp_map=self.
                    qos_tc_color_to_dscp_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(
                    self.client, port, qos_tc_and_color_to_dscp_map=True)
                self.assertEqual(attr['qos_tc_and_color_to_dscp_map'],
                                 self.qos_tc_color_to_dscp_map_id)
            for ingress_dscp in range(0, 64, DSCP_TEST_STEP):
                if ingress_dscp < 24:
                    egress_dscp = ingress_dscp % 8
                else:
                    egress_dscp = int(ingress_dscp / 8)
                ingress_ipv6_tc = ingress_dscp << 2
                egress_ipv6_tc = egress_dscp << 2
                pkt = simple_tcpv6_packet(
                    eth_dst=ROUTER_MAC,
                    eth_src='00:22:22:22:22:22',
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=64,
                    ipv6_tc=ingress_ipv6_tc,
                    pktlen=100)
                exp_pkt = simple_tcpv6_packet(
                    eth_dst='00:11:22:33:44:06',
                    eth_src=ROUTER_MAC,
                    ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                    ipv6_src='2000::1',
                    ipv6_hlim=63,
                    ipv6_tc=egress_ipv6_tc,
                    pktlen=100)
                send_packet(self, self.dev_port0, pkt)
                verify_packet(self, exp_pkt, self.dev_port2)
        finally:
            for port in [self.port1, self.port2]:
                # set Port 1 TC AND COLOR -> DSCP mapping
                sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_and_color_to_dscp_map=0)

    def l3IPv4QosMapTcColorToDscpManyIngressPortsTest(self):
        ''' L3 IPv4
            TC + Color -> DSCP same mapping defined on various egress ports
            Test verifies that switch does override the
            original packet dscp value accordingly to QOS mapping.
        '''
        print("l3IPv4QosMapTcColorToDscpManyIngressPortsTest")
        try:
            # egress settings
            # set the TC AND COLOR -> DSCP mapping
            # for port 1 for IPv4 and port2 for IPv6
            # INFO setting both ingress TC and COLOR unsupported
            for port, dscp_to_tc in [
                    [self.port0, self.p0_qos_dscp_to_tc_map_id],
                    [self.port2, self.p0_qos_dscp_to_tc_map_id],
                    [self.port3, self.p0_qos_dscp_to_tc_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=dscp_to_tc)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'], dscp_to_tc)
            for port in [self.port1]:
                # set Port 1 TC AND COLOR -> DSCP mapping
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_and_color_to_dscp_map=self.
                    qos_tc_color_to_dscp_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(
                    self.client, port, qos_tc_and_color_to_dscp_map=True)
                self.assertEqual(attr['qos_tc_and_color_to_dscp_map'],
                                 self.qos_tc_color_to_dscp_map_id)
            for port in [self.dev_port0, self.dev_port2, self.dev_port3]:
                for ingress_dscp in range(0, 64, DSCP_TEST_STEP):
                    if ingress_dscp < 24:
                        egress_dscp = ingress_dscp % 8
                    else:
                        egress_dscp = int(ingress_dscp / 8)
                    ingress_ip_tos = ingress_dscp << 2
                    egress_ip_tos = egress_dscp << 2
                    pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                            eth_src='00:22:22:22:22:22',
                                            ip_dst='10.10.10.11',
                                            ip_src='192.168.0.1',
                                            ip_tos=ingress_ip_tos,
                                            ip_id=105,
                                            ip_ttl=64)
                    exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                                eth_src=ROUTER_MAC,
                                                ip_dst='10.10.10.11',
                                                ip_src='192.168.0.1',
                                                ip_tos=egress_ip_tos,
                                                ip_id=105,
                                                ip_ttl=63)
                    send_packet(self, port, pkt)
                    verify_packet(self, exp_pkt, self.dev_port1)
        finally:
            all_ports = [self.port0, self.port1, self.port2, self.port3]
            for port in all_ports:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_dscp_to_tc_map=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_tc_and_color_to_dscp_map=0)

    def l3IPv6QosMapTcColorToDscpManyIngressPortsTest(self):
        ''' L3 IPv6
            TC + Color -> DSCP same mapping defined on various ingress ports
            Test verifies that switch does override the
            original packet dscp value accordingly to QOS mapping.
        '''
        print("l3IPv6QosMapTcColorToDscpManyIngressPortsTest")
        try:
            # set ingress DSCP -> tc
            for port, dscp_to_tc in [
                    [self.port0, self.p0_qos_dscp_to_tc_map_id],
                    [self.port1, self.p0_qos_dscp_to_tc_map_id],
                    [self.port3, self.p0_qos_dscp_to_tc_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=dscp_to_tc)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'], dscp_to_tc)
            # egress settings
            # set the TC AND COLOR -> DSCP mapping
            # for port 1 for IPv4 and port2 for IPv6
            for port in [self.port2]:
                # set Port 1 TC AND COLOR -> DSCP mapping
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_and_color_to_dscp_map=self.
                    qos_tc_color_to_dscp_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(
                    self.client, port, qos_tc_and_color_to_dscp_map=True)
                self.assertEqual(attr['qos_tc_and_color_to_dscp_map'],
                                 self.qos_tc_color_to_dscp_map_id)
            for port in [self.dev_port0, self.dev_port1, self.dev_port3]:
                for ingress_dscp in range(0, 64, DSCP_TEST_STEP):
                    if ingress_dscp < 24:
                        egress_dscp = ingress_dscp % 8
                    else:
                        egress_dscp = int(ingress_dscp / 8)
                    ingress_ipv6_tc = ingress_dscp << 2
                    egress_ipv6_tc = egress_dscp << 2
                    pkt = simple_tcpv6_packet(
                        eth_dst=ROUTER_MAC,
                        eth_src='00:22:22:22:22:22',
                        ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                        ipv6_src='2000::1',
                        ipv6_hlim=64,
                        ipv6_tc=ingress_ipv6_tc,
                        pktlen=100)
                    exp_pkt = simple_tcpv6_packet(
                        eth_dst='00:11:22:33:44:06',
                        eth_src=ROUTER_MAC,
                        ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                        ipv6_src='2000::1',
                        ipv6_hlim=63,
                        ipv6_tc=egress_ipv6_tc,
                        pktlen=100)
                    send_packet(self, port, pkt)
                    verify_packet(self, exp_pkt, self.dev_port2)
        finally:
            for port in [self.port1, self.port2]:
                # set Port 1 TC AND COLOR -> DSCP mapping
                sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_and_color_to_dscp_map=0)

    def l3IPv4QosMapVariousTcColorToDscpManyIngressPortsTest(self):
        ''' L3 IPv4
            TC + Color -> DSCP various mapping defined on various ingress ports
            Test verifies that switch does override the
            original packet dscp value accordingly to QOS mapping.
        '''
        print("l3IPv4QosMapVariousTcColorToDscpManyIngressPortsTest")
        try:
            # egress settings
            # set the TC AND COLOR -> DSCP mapping
            # for port 1 for IPv4 and port2 for IPv6
            for port, dscp_to_tc in [
                    [self.port0, self.p0_qos_dscp_to_tc_map_id],
                    [self.port2, self.p2_qos_dscp_to_tc_map_id],
                    [self.port3, self.p3_qos_dscp_to_tc_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=dscp_to_tc)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'], dscp_to_tc)
            for port in [self.port1]:
                # set Port 1 TC AND COLOR -> DSCP mapping
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_and_color_to_dscp_map=self.
                    qos_tc_color_to_dscp_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(
                    self.client, port, qos_tc_and_color_to_dscp_map=True)
                self.assertEqual(attr['qos_tc_and_color_to_dscp_map'],
                                 self.qos_tc_color_to_dscp_map_id)
            test_dev_port_list = [self.dev_port0, self.dev_port1,
                                  self.dev_port2, self.dev_port3]
            for p_idx, port in enumerate(test_dev_port_list):
                if port == self.dev_port1:
                    continue
                for ingress_dscp in range(0, 64, DSCP_TEST_STEP):
                    if ingress_dscp < 24:
                        egress_dscp = (ingress_dscp + p_idx) % 8
                    else:
                        egress_dscp = int((ingress_dscp + p_idx) / 8) % 8
                    ingress_ip_tos = ingress_dscp << 2
                    egress_ip_tos = egress_dscp << 2
                    pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
                                            eth_src='00:22:22:22:22:22',
                                            ip_dst='10.10.10.11',
                                            ip_src='192.168.0.1',
                                            ip_tos=ingress_ip_tos,
                                            ip_id=105,
                                            ip_ttl=64)
                    exp_pkt = simple_tcp_packet(eth_dst='00:11:22:33:44:04',
                                                eth_src=ROUTER_MAC,
                                                ip_dst='10.10.10.11',
                                                ip_src='192.168.0.1',
                                                ip_tos=egress_ip_tos,
                                                ip_id=105,
                                                ip_ttl=63)
                    send_packet(self, port, pkt)
                    verify_packet(self, exp_pkt, self.dev_port1)
        finally:
            all_ports = [self.port0, self.port1, self.port2, self.port3]
            for port in all_ports:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_dscp_to_tc_map=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_tc_and_color_to_dscp_map=0)

    def l3IPv6QosMapVariousTcColorToDscpManyIngressPortsTest(self):
        ''' L3 IPv6
            TC + Color -> DSCP various mapping defined on various ingress ports
            Test verifies that switch does override the
            original packet dscp value accordingly to QOS mapping.
        '''
        print("l3IPv6QosMapVariousTcColorToDscpManyIngressPortsTest")
        try:
            # set ingress DSCP -> tc
            for port, dscp_to_tc in [
                    [self.port0, self.p0_qos_dscp_to_tc_map_id],
                    [self.port1, self.p1_qos_dscp_to_tc_map_id],
                    [self.port3, self.p3_qos_dscp_to_tc_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dscp_to_tc_map=dscp_to_tc)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'], dscp_to_tc)
            # egress settings
            # set the TC AND COLOR -> DSCP mapping
            # for port 1 for IPv4 and port2 for IPv6
            for port in [self.port2]:
                # set Port 1 TC AND COLOR -> DSCP mapping
                status = sai_thrift_set_port_attribute(
                    self.client,
                    port,
                    qos_tc_and_color_to_dscp_map=self.
                    qos_tc_color_to_dscp_map_id)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(
                    self.client, port, qos_tc_and_color_to_dscp_map=True)
                self.assertEqual(attr['qos_tc_and_color_to_dscp_map'],
                                 self.qos_tc_color_to_dscp_map_id)
            test_dev_port_list = [self.dev_port0, self.dev_port1,
                                  self.dev_port2, self.dev_port3]
            for p_idx, port in enumerate(test_dev_port_list):
                if port == self.dev_port2:
                    continue
                for ingress_dscp in range(0, 64, DSCP_TEST_STEP):
                    if ingress_dscp < 24:
                        egress_dscp = (ingress_dscp + p_idx) % 8
                    else:
                        egress_dscp = int((ingress_dscp + p_idx) / 8) % 8
                    ingress_ipv6_tc = ingress_dscp << 2
                    egress_ipv6_tc = egress_dscp << 2
                    pkt = simple_tcpv6_packet(
                        eth_dst=ROUTER_MAC,
                        eth_src='00:22:22:22:22:22',
                        ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                        ipv6_src='2000::1',
                        ipv6_hlim=64,
                        ipv6_tc=ingress_ipv6_tc,
                        pktlen=100)
                    exp_pkt = simple_tcpv6_packet(
                        eth_dst='00:11:22:33:44:06',
                        eth_src=ROUTER_MAC,
                        ipv6_dst='1234:5678:9abc:def0:4422:1133:5577:1111',
                        ipv6_src='2000::1',
                        ipv6_hlim=63,
                        ipv6_tc=egress_ipv6_tc,
                        pktlen=100)
                    send_packet(self, port, pkt)
                    verify_packet(self, exp_pkt, self.dev_port2)
        finally:
            all_ports = [self.port0, self.port1, self.port2, self.port3]
            for port in all_ports:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_dscp_to_tc_map=0)
                sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_and_color_to_dscp_map=0)


@group("draft")
class L2QosMapPcpToColorTest(L2QosMapBaseClass):
    ''' L2 PCP -> COLOR QOS mapping test base class '''
    def setUp(self):
        super(L2QosMapPcpToColorTest, self).setUp()
        print("Create dot1p -> tc qos mapping")
        ingress_dot1p_list = [0, 1, 2, 3, 4, 5, 6, 7]
        ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
        self.qos_dot1p_to_tc_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_TC, ingress_dot1p_list,
            ingress_tc_list)
        self.assertTrue(self.qos_dot1p_to_tc_map_id != 0,
                        "Failed to create qos_map")
        print("Create dot1p -> color qos mapping")
        ingress_dot1p_list = [0, 1, 2, 3, 4, 5, 6, 7]
        ingress_color_list = [0, 0, 0, 1, 1, 1, 2, 2]
        # ingress_color_list = [1, 1, 1, 1, 1, 1, 1, 1]
        self.qos_dot1p_to_color_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_COLOR, ingress_dot1p_list,
            ingress_color_list)
        self.assertTrue(self.qos_dot1p_to_color_map_id != 0,
                        "Failed to create qos_map")
        # Used by l2QosMapDifferentPCPToColorMultiIngresssPortTest
        # QOS map defined for individual ports
        ingress_dot1p_list = [0, 1, 2, 3, 4, 5, 6, 7]
        ingress_color_list = [0, 0, 0, 0, 0, 0, 0, 0]
        self.p1_qos_dot1p_to_color_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_COLOR, ingress_dot1p_list,
            ingress_color_list)
        self.assertTrue(self.p1_qos_dot1p_to_color_map_id != 0,
                        "Failed to create qos_map")
        ingress_dot1p_list = [0, 1, 2, 3, 4, 5, 6, 7]
        ingress_color_list = [1, 1, 1, 1, 1, 1, 1, 1]
        self.p2_qos_dot1p_to_color_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_COLOR, ingress_dot1p_list,
            ingress_color_list)
        self.assertTrue(self.p2_qos_dot1p_to_color_map_id != 0,
                        "Failed to create qos_map")
        ingress_dot1p_list = [0, 1, 2, 3, 4, 5, 6, 7]
        ingress_color_list = [2, 2, 2, 2, 2, 2, 2, 2]
        self.p3_qos_dot1p_to_color_map_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_COLOR, ingress_dot1p_list,
            ingress_color_list)
        self.assertTrue(self.p3_qos_dot1p_to_color_map_id != 0,
                        "Failed to create qos_map")
        # define egress tc, color -> pcp settings
        egress_tc_color_list = [
            [0, 0],
            [1, 0],
            [2, 0],
            [3, 0],
            [4, 0],
            [5, 0],
            [6, 0],
            [7, 0],
            [0, 1],
            [1, 1],
            [2, 1],
            [3, 1],
            [4, 1],
            [5, 1],
            [6, 1],
            [7, 1],
            [0, 2],
            [1, 2],
            [2, 2],
            [3, 2],
            [4, 2],
            [5, 2],
            [6, 2],
            [7, 2]
        ]
        egress_pcp_list = [
            1, 1, 1, 1, 1, 1, 1, 1,
            2, 2, 2, 2, 2, 2, 2, 2,
            3, 3, 3, 3, 3, 3, 3, 3,
        ]
        self.p1_qos_tc_color_to_dot1q_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P,
            egress_tc_color_list, egress_pcp_list)
        self.assertTrue(self.p1_qos_tc_color_to_dot1q_id != 0,
                        "Failed to create qos_map")
        egress_pcp_list = [
            3, 3, 3, 3, 3, 3, 3, 3,  # p2 egress pcp for green
            4, 4, 4, 4, 4, 4, 4, 4,  # p2 egress pcp for yellow
            5, 5, 5, 5, 5, 5, 5, 5,  # p2 egress pcp for red
        ]
        self.p2_qos_tc_color_to_dot1q_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P,
            egress_tc_color_list, egress_pcp_list)
        self.assertTrue(self.p2_qos_tc_color_to_dot1q_id != 0,
                        "Failed to create qos_map")
        egress_pcp_list = [
            5, 5, 5, 5, 5, 5, 5, 5,  # p3 egress pcp for green
            6, 6, 6, 6, 6, 6, 6, 6,  # p3 egress pcp for yellow
            7, 7, 7, 7, 7, 7, 7, 7,  # p3 egress pcp for red
        ]
        self.p3_qos_tc_color_to_dot1q_id = create_and_verify_qos_map(
            self.client, SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P,
            egress_tc_color_list, egress_pcp_list)
        self.assertTrue(self.p3_qos_tc_color_to_dot1q_id != 0,
                        "Failed to create qos_map")

    def runTest(self):
        self.l2QosMapPCPToColorDefaultMappingTest()
        self.l2QosMapMultiPCPToOneColorMappingTest()
        self.l2QosMapSamePCPToColorMultiIngresssPortTest()
        self.l2QosMapDifferentPCPToColorMultiIngresssPortTest()

    def tearDown(self):
        for port in [self.port0, self.port1, self.port2, self.port3]:
            sai_thrift_set_port_attribute(self.client, port, qos_default_tc=0)
            sai_thrift_set_port_attribute(self.client,
                                          port,
                                          qos_tc_to_queue_map=0)
            sai_thrift_set_port_attribute(self.client,
                                          port,
                                          qos_tc_and_color_to_dot1p_map=0)
            sai_thrift_set_port_attribute(self.client,
                                          port,
                                          qos_dot1p_to_color_map=0)
            sai_thrift_set_port_attribute(self.client,
                                          port,
                                          qos_dot1p_to_tc_map=0)
        sai_thrift_remove_qos_map(self.client, self.qos_dot1p_to_tc_map_id)
        sai_thrift_remove_qos_map(self.client, self.qos_dot1p_to_color_map_id)
        sai_thrift_remove_qos_map(self.client,
                                  self.p1_qos_tc_color_to_dot1q_id)
        sai_thrift_remove_qos_map(self.client,
                                  self.p2_qos_tc_color_to_dot1q_id)
        sai_thrift_remove_qos_map(self.client,
                                  self.p3_qos_tc_color_to_dot1q_id)

        sai_thrift_remove_qos_map(self.client,
                                  self.p1_qos_dot1p_to_color_map_id)
        sai_thrift_remove_qos_map(self.client,
                                  self.p2_qos_dot1p_to_color_map_id)
        sai_thrift_remove_qos_map(self.client,
                                  self.p3_qos_dot1p_to_color_map_id)
        super(L2QosMapPcpToColorTest, self).tearDown()

    def l2QosMapMultiPCPToOneColorMappingTest(self):
        ''' L2 traffic test verifies the following:
            1. Many PCP to one color mapping
            The verification method:
                - SAI_QOS_MAP_TYPE_DOT1P_TO_COLOR mapping defined for ingress
                and assigned to ports 0, 1, 2, and 3
                - SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P mapping defined
                for ingress and assigned to ports 0, 1, 2, and 3
                - various SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P mappings
                defined for egress and assigned to ports 0, 1, 2, and 3
                egress pcp = 2 x egress port - 1 + color
        '''
        print("l2QosMapMultiPCPToOneColorMappingTest")
        # default PCP to TC mapping
        test_cases = []
        # priority vlan tagged packed
        test_cases.append({
            'pcp': None,
            'port_default_tc': 0,
            'tc': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 1,
            'tc': 1,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 2,
            'tc': 2,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 3,
            'tc': 3,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 4,
            'tc': 4,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 5,
            'tc': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 6,
            'tc': 6,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 7,
            'tc': 7,
            'color': 0
        })

        test_cases.append({
            'pcp': 0,
            'port_default_tc': 5,
            'tc': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 1,
            'port_default_tc': 5,
            'tc': 1,
            'color': 0
        })
        test_cases.append({
            'pcp': 2,
            'port_default_tc': 0,
            'tc': 2,
            'color': 0
        })
        test_cases.append({
            'pcp': 3,
            'port_default_tc': 0,
            'tc': 3,
            'color': 1
        })
        test_cases.append({
            'pcp': 4,
            'port_default_tc': 0,
            'tc': 4,
            'color': 1
        })
        test_cases.append({
            'pcp': 5,
            'port_default_tc': 0,
            'tc': 5,
            'color': 1
        })
        test_cases.append({
            'pcp': 6,
            'port_default_tc': 0,
            'tc': 6,
            'color': 2
        })
        test_cases.append({
            'pcp': 7,
            'port_default_tc': 0,
            'tc': 7,
            'color': 2
        })
        # assign to port the tc_queue and tc_color_to_pcp qos map
        for port, dot1p_to_tc, dot1p_color, tc_color in [
                [self.port0, self.qos_dot1p_to_tc_map_id,
                 self.qos_dot1p_to_color_map_id,
                 self.p1_qos_tc_color_to_dot1q_id],
                [self.port1, self.qos_dot1p_to_tc_map_id,
                 self.qos_dot1p_to_color_map_id,
                 self.p1_qos_tc_color_to_dot1q_id],
                [self.port2, self.qos_dot1p_to_tc_map_id,
                 self.qos_dot1p_to_color_map_id,
                 self.p2_qos_tc_color_to_dot1q_id],
                [self.port3, self.qos_dot1p_to_tc_map_id,
                 self.qos_dot1p_to_color_map_id,
                 self.p3_qos_tc_color_to_dot1q_id]]:
            # set DOT1P -> TC
            status = sai_thrift_set_port_attribute(
                self.client, port, qos_dot1p_to_tc_map=dot1p_to_tc)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(self.client,
                                                 port,
                                                 qos_dot1p_to_tc_map=True)
            self.assertEqual(attr['qos_dot1p_to_tc_map'], dot1p_to_tc)
            # set DOT1P -> COLOR
            status = sai_thrift_set_port_attribute(
                self.client, port, qos_dot1p_to_color_map=dot1p_color)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(
                self.client, port, qos_dot1p_to_color_map=True)
            self.assertEqual(attr['qos_dot1p_to_color_map'], dot1p_color)
            # set TC and COLOR -> DOT1Q
            status = sai_thrift_set_port_attribute(
                self.client, port, qos_tc_and_color_to_dot1p_map=tc_color)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(
                self.client, port, qos_tc_and_color_to_dot1p_map=True)
            self.assertEqual(attr['qos_tc_and_color_to_dot1p_map'],
                             tc_color)
        for test in test_cases:
            if test['pcp'] is not None:
                vlan = 1
                ingress_pcp = str(test['pcp'])
            else:
                vlan = 0
                ingress_pcp = 'None'
            # define expected egress_pcp per egress port
            egress_tc = test['tc']
            egress_color = test['color']
            p1_egress_pcp = 1 + test['color']
            p2_egress_pcp = 3 + test['color']
            p3_egress_pcp = 5 + test['color']
            print("Sending eth packet port %d (pcp=%s) ->"
                  " port %d (tc=%d color=%d -> egress_pcp=%d)"
                  % (self.dev_port0, ingress_pcp,
                     self.dev_port1, egress_tc, egress_color,
                     p1_egress_pcp))
            print("%47s port %d (tc=%d color=%d -> egress_pcp=%d))" %
                  (" ", self.dev_port2, egress_tc, egress_color,
                   p2_egress_pcp))
            print("%47s port %d (tc=%d color=%d -> egress_pcp=%d))" %
                  (" ", self.dev_port3, egress_tc, egress_color,
                   p3_egress_pcp))
            pkt = simple_tcp_packet(eth_dst='00:33:33:33:33:00',
                                    eth_src='00:33:33:33:33:11',
                                    dl_vlan_enable=True,
                                    vlan_vid=vlan,
                                    vlan_pcp=test['pcp'],
                                    pktlen=104)
            p1_exp_pkt = simple_tcp_packet(
                eth_dst='00:33:33:33:33:00',
                eth_src='00:33:33:33:33:11',
                dl_vlan_enable=True,
                vlan_vid=1,
                vlan_pcp=p1_egress_pcp,
                pktlen=104)
            p2_exp_pkt = simple_tcp_packet(
                eth_dst='00:33:33:33:33:00',
                eth_src='00:33:33:33:33:11',
                dl_vlan_enable=True,
                vlan_vid=1,
                vlan_pcp=p2_egress_pcp,
                pktlen=104)
            p3_exp_pkt = simple_tcp_packet(
                eth_dst='00:33:33:33:33:00',
                eth_src='00:33:33:33:33:11',
                dl_vlan_enable=True,
                vlan_vid=1,
                vlan_pcp=p3_egress_pcp,
                pktlen=104)
            test_port = self.dev_port0
            flood_port_list = [[self.dev_port1], [self.dev_port2],
                               [self.dev_port3]]
            flood_pkt_list = [p1_exp_pkt, p2_exp_pkt, p3_exp_pkt]
            send_packet(self, test_port, pkt)
            verify_each_packet_on_multiple_port_lists(self, flood_pkt_list,
                                                      flood_port_list)
            print("\tPacket flooded. ok")

    def l2QosMapPCPToColorDefaultMappingTest(self):
        ''' L2 traffic test verifies the following:
            1. default PCP to color mapping
            The verification method:
            No SAI_QOS_MAP_TYPE_DOT1P_TO_COLOR mapping defined
            Mapping the tc and color to pcp on egress port.
            All colors map to pcp=0, only default color GREEN
            maps to pcp 7,
        '''
        print("l2QosMapPCPToColorDefaultMappingTest")
        # default PCP to TC mapping
        test_cases = []
        # priority vlan tagged packed
        test_cases.append({
            'pcp': None,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 1,
            'queue': 1,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 2,
            'queue': 2,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 3,
            'queue': 3,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 4,
            'queue': 4,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 5,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 6,
            'queue': 6,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 7,
            'queue': 7,
            'color': 0
        })
        test_cases.append({
            'pcp': 1,
            'port_default_tc': 5,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': 2,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 3,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 4,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 5,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 6,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 7,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 0,
            'port_default_tc': 1,
            'queue': 1,
            'color': 0
        })
        test_cases.append({
            'pcp': 1,
            'port_default_tc': 2,
            'queue': 2,
            'color': 0
        })
        test_cases.append({
            'pcp': 2,
            'port_default_tc': 3,
            'queue': 3,
            'color': 0
        })
        test_cases.append({
            'pcp': 3,
            'port_default_tc': 4,
            'queue': 4,
            'color': 0
        })
        test_cases.append({
            'pcp': 4,
            'port_default_tc': 5,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': 5,
            'port_default_tc': 6,
            'queue': 6,
            'color': 0
        })
        test_cases.append({
            'pcp': 6,
            'port_default_tc': 7,
            'queue': 7,
            'color': 0
        })
        test_cases.append({
            'pcp': 7,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        try:
            # setup tc to queue index mapping
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            # assign to port the tc_queue and tc_color_to_pcp qos map
            for port, tc_to_queue, tc_color in [
                    [self.port0, qos_tc_to_queue_map_id,
                     self.p1_qos_tc_color_to_dot1q_id],
                    [self.port1, qos_tc_to_queue_map_id,
                     self.p1_qos_tc_color_to_dot1q_id],
                    [self.port2, qos_tc_to_queue_map_id,
                     self.p2_qos_tc_color_to_dot1q_id],
                    [self.port3, qos_tc_to_queue_map_id,
                     self.p3_qos_tc_color_to_dot1q_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=tc_to_queue)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'], tc_to_queue)
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_and_color_to_dot1p_map=tc_color)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(
                    self.client, port, qos_tc_and_color_to_dot1p_map=True)
                self.assertEqual(attr['qos_tc_and_color_to_dot1p_map'],
                                 tc_color)
            # verify port default tc
            ports = [self.port0, self.port1, self.port2, self.port3]
            self.verifyPortDefaultDot1pToTc(ports)
            for test in test_cases:
                queue = test['queue']
                # setup port default_tc
                if test['port_default_tc'] is not None:
                    # every test port gets the same default_tc =
                    # test['port_default_tc']
                    port_default_tc = test['port_default_tc']
                    port_config = [[self.port0, port_default_tc],
                                   [self.port1, port_default_tc],
                                   [self.port2, port_default_tc],
                                   [self.port3, port_default_tc]]
                else:
                    # every port gets default_tc as its port number
                    # port 0 -> default tc = 5
                    # port 1 -> default tc = 1
                    # port 2 -> default tc = 2
                    # port 3 -> default tc = 3
                    port_config = [[self.port0, 5], [self.port1, 1],
                                   [self.port2, 2], [self.port3, 3]]
                for port, port_default_tc in port_config:
                    sai_thrift_set_port_attribute(
                        self.client, port, qos_default_tc=port_default_tc)
                    attr = sai_thrift_get_port_attribute(self.client,
                                                         port,
                                                         qos_default_tc=True)
                    self.assertEqual(attr['qos_default_tc'], port_default_tc)
                p1_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port1, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p2_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port2, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p3_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port3, queue, ['SAI_QUEUE_STAT_PACKETS'])
                if test['port_default_tc'] is not None:
                    port_default_tc = str(test['port_default_tc'])
                else:
                    port_default_tc = str(1)
                if test['pcp'] is not None:
                    vlan = 1
                    ingress_pcp = str(test['pcp'])
                else:
                    vlan = 0
                    ingress_pcp = 'None'
                # define expected egress_pcp per egress port
                p1_egress_pcp = 1
                p2_egress_pcp = 3
                p3_egress_pcp = 5
                print("Sending packet port %d (port_default_tc=%s"
                      ", pcp=%s) -> port %d (queue=%d, egress_pcp=%d)"
                      % (self.dev_port0, port_default_tc,
                         ingress_pcp, self.dev_port1, queue, p1_egress_pcp))
                print("%54s port %d (queue=%d, egress_pcp=%d))" %
                      (" ", self.dev_port2, queue, p2_egress_pcp))
                print("%54s port %d (queue=%d, egress_pcp=%d))" %
                      (" ", self.dev_port3, queue, p3_egress_pcp))
                pkt = simple_tcp_packet(eth_dst='00:33:33:33:33:00',
                                        eth_src='00:33:33:33:33:11',
                                        dl_vlan_enable=True,
                                        vlan_vid=vlan,
                                        vlan_pcp=test['pcp'],
                                        pktlen=104)
                p1_exp_pkt = simple_tcp_packet(
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_vlan_enable=True,
                    vlan_vid=1,
                    vlan_pcp=p1_egress_pcp,
                    pktlen=104)
                p2_exp_pkt = simple_tcp_packet(
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_vlan_enable=True,
                    vlan_vid=1,
                    vlan_pcp=p2_egress_pcp,
                    pktlen=104)
                p3_exp_pkt = simple_tcp_packet(
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_vlan_enable=True,
                    vlan_vid=1,
                    vlan_pcp=p3_egress_pcp,
                    pktlen=104)
                test_port = self.dev_port0
                flood_port_list = [[self.dev_port1], [self.dev_port2],
                                   [self.dev_port3]]
                flood_pkt_list = [p1_exp_pkt, p2_exp_pkt, p3_exp_pkt]
                send_packet(self, test_port, pkt)
                verify_each_packet_on_multiple_port_lists(self, flood_pkt_list,
                                                          flood_port_list)
                print("\tPacket flooded. ok")
                p1_post_q_cnt = self.getPortQueueIndexStats(
                    self.port1, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p2_post_q_cnt = self.getPortQueueIndexStats(
                    self.port2, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p3_post_q_cnt = self.getPortQueueIndexStats(
                    self.port3, queue, ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    p1_initial_q_cnt + 1, p1_post_q_cnt,
                    'PORT1 queue {} packets counter {} != {}'.format(
                        queue, p1_initial_q_cnt + 1, p1_post_q_cnt))
                self.assertEqual(
                    p2_initial_q_cnt + 1, p2_post_q_cnt,
                    'PORT2 queue {} packets counter {} != {}'.format(
                        queue, p2_initial_q_cnt + 1, p2_post_q_cnt))
                self.assertEqual(
                    p3_initial_q_cnt + 1, p3_post_q_cnt,
                    'PORT3 queue {} packets counter {} != {}'.format(
                        queue, p3_initial_q_cnt + 1, p3_post_q_cnt))
        finally:
            for port in [self.port0, self.port1, self.port2, self.port3]:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_tc_to_queue_map=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_tc_and_color_to_dot1p_map=0)
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)

    def verifyPortDefaultDot1pToTc(self, ports):
        """
        Verifies port default tc
        Args:
            ports (list): list of ports
        """
        for port in ports:
            attr = sai_thrift_get_port_attribute(self.client,
                                                 port,
                                                 qos_dot1p_to_tc_map=True,
                                                 qos_default_tc=True)
            self.assertEqual(attr['qos_dot1p_to_tc_map'], 0)
            self.assertEqual(attr['qos_default_tc'], 0)

    def l2QosMapSamePCPToColorMultiIngresssPortTest(self):
        ''' L2 traffic test verifies the following:
            1. Many PCP to one color mapping
            The verification method:
                - SAI_QOS_MAP_TYPE_DOT1P_TO_COLOR mapping defined for ingress
                and assigned to ports 0, 1, 2, and 3
                - SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P mapping defined for
                ingress and assigned to ports 0, 1, 2, and 3
                - various SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P mappings
                  defined for egress and assigned to ports 0, 1, 2, and 3
                egress pcp = 2 x egress port - 1 + color
        '''
        print("l2QosMapSamePCPToColorMultiIngresssPortTest")
        # default PCP to TC mapping
        test_cases = []
        # priority vlan tagged packed
        test_cases.append({
            'pcp': None,
            'port_default_tc': 0,
            'tc': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 1,
            'tc': 1,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 2,
            'tc': 2,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 3,
            'tc': 3,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 4,
            'tc': 4,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 5,
            'tc': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 6,
            'tc': 6,
            'color': 0
        })
        test_cases.append({
            'pcp': None,
            'port_default_tc': 7,
            'tc': 7,
            'color': 0
        })
        test_cases.append({
            'pcp': 0,
            'port_default_tc': 5,
            'tc': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 1,
            'port_default_tc': 5,
            'tc': 1,
            'color': 0
        })
        test_cases.append({
            'pcp': 2,
            'port_default_tc': 0,
            'tc': 2,
            'color': 0
        })
        test_cases.append({
            'pcp': 3,
            'port_default_tc': 0,
            'tc': 3,
            'color': 1
        })
        test_cases.append({
            'pcp': 4,
            'port_default_tc': 0,
            'tc': 4,
            'color': 1
        })
        test_cases.append({
            'pcp': 5,
            'port_default_tc': 0,
            'tc': 5,
            'color': 1
        })
        test_cases.append({
            'pcp': 6,
            'port_default_tc': 0,
            'tc': 6,
            'color': 2
        })
        test_cases.append({
            'pcp': 7,
            'port_default_tc': 0,
            'tc': 7,
            'color': 2
        })
        for port, dot1p_to_tc, dot1p_color, tc_color in [
                [self.port0, self.qos_dot1p_to_tc_map_id,
                 self.qos_dot1p_to_color_map_id,
                 self.p1_qos_tc_color_to_dot1q_id],
                [self.port1, self.qos_dot1p_to_tc_map_id,
                 self.qos_dot1p_to_color_map_id,
                 self.p1_qos_tc_color_to_dot1q_id],
                [self.port2, self.qos_dot1p_to_tc_map_id,
                 self.qos_dot1p_to_color_map_id,
                 self.p2_qos_tc_color_to_dot1q_id],
                [self.port3, self.qos_dot1p_to_tc_map_id,
                 self.qos_dot1p_to_color_map_id,
                 self.p3_qos_tc_color_to_dot1q_id]]:
            # set DOT1P -> TC
            status = sai_thrift_set_port_attribute(
                self.client, port, qos_dot1p_to_tc_map=dot1p_to_tc)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(self.client,
                                                 port,
                                                 qos_dot1p_to_tc_map=True)
            self.assertEqual(attr['qos_dot1p_to_tc_map'], dot1p_to_tc)
            # set DOT1P -> COLOR
            status = sai_thrift_set_port_attribute(
                self.client, port, qos_dot1p_to_color_map=dot1p_color)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(
                self.client, port, qos_dot1p_to_color_map=True)
            self.assertEqual(attr['qos_dot1p_to_color_map'], dot1p_color)
            # set TC and COLOR -> DOT1Q
            status = sai_thrift_set_port_attribute(
                self.client, port, qos_tc_and_color_to_dot1p_map=tc_color)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(
                self.client, port, qos_tc_and_color_to_dot1p_map=True)
            self.assertEqual(attr['qos_tc_and_color_to_dot1p_map'],
                             tc_color)
        test_dev_ports_list = [self.dev_port0, self.dev_port1,
                               self.dev_port2, self.dev_port3]
        for _, ingress_port in enumerate(test_dev_ports_list):
            for test in test_cases:
                if test['pcp'] is not None:
                    vlan = 1
                    ingress_pcp = str(test['pcp'])
                else:
                    vlan = 0
                    ingress_pcp = 'None'
                # define expected egress_pcp per egress port
                egress_tc = test['tc']
                egress_color = test['color']
                p1_egress_pcp = 1 + test['color']
                p2_egress_pcp = 3 + test['color']
                p3_egress_pcp = 5 + test['color']
                pkt = simple_tcp_packet(eth_dst='00:33:33:33:33:00',
                                        eth_src='00:33:33:33:33:11',
                                        dl_vlan_enable=True,
                                        vlan_vid=vlan,
                                        vlan_pcp=test['pcp'],
                                        pktlen=104)
                p1_exp_pkt = simple_tcp_packet(
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_vlan_enable=True,
                    vlan_vid=1,
                    vlan_pcp=p1_egress_pcp,
                    pktlen=104)
                p2_exp_pkt = simple_tcp_packet(
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_vlan_enable=True,
                    vlan_vid=1,
                    vlan_pcp=p2_egress_pcp,
                    pktlen=104)
                p3_exp_pkt = simple_tcp_packet(
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_vlan_enable=True,
                    vlan_vid=1,
                    vlan_pcp=p3_egress_pcp,
                    pktlen=104)
                egres_ports = []
                flood_port_list = []
                flood_pkt_list = []
                pkt_list = [p1_exp_pkt, p1_exp_pkt, p2_exp_pkt, p3_exp_pkt]
                for i, port in enumerate(test_dev_ports_list):
                    if port == ingress_port:
                        continue
                    flood_port_list.append([port])
                    flood_pkt_list.append(pkt_list[i])
                    egres_ports.append(port)
                print("Sending eth packet port %d (pcp=%s) -> "
                      "port %d (tc=%d color=%d -> egress_pcp=%d)"
                      % (ingress_port, ingress_pcp,
                         egres_ports[0], egress_tc, egress_color,
                         p1_egress_pcp))
                print("%47s port %d (tc=%d color=%d -> egress_pcp=%d))"
                      % (" ", egres_ports[1], egress_tc, egress_color,
                         p2_egress_pcp))
                print("%47s port %d (tc=%d color=%d -> egress_pcp=%d))"
                      % (" ", egres_ports[2], egress_tc, egress_color,
                         p3_egress_pcp))
                send_packet(self, ingress_port, pkt)
                verify_each_packet_on_multiple_port_lists(
                    self, flood_pkt_list, flood_port_list)
                print("\tPacket flooded. ok")

    def l2QosMapDifferentPCPToColorMultiIngresssPortTest(self):
        ''' L2 traffic test verifies the following:
            1. Many PCP to color mapping for various ingress ports
            The verification method:
                - SAI_QOS_MAP_TYPE_DOT1P_TO_COLOR mapping defined for ingress
                and assigned to ports 0, 1, 2, and 3
                - SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P mapping defined for
                ingress and assigned to ports 0, 1, 2, and 3
                - various SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P mappings
                defined for egress and assigned to ports 0, 1, 2, and 3
                egress pcp = 2 x egress port - 1 + color
        '''
        print("l2QosMapDifferentPCPToColorMultiIngresssPortTest")
        # default PCP to TC mapping
        test_cases = []
        test_cases.append({
            'ingress_port': self.dev_port0,
            'pcp': 0,
            'p0_pcp': None,
            'p1_pcp': 1,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port0,
            'pcp': 1,
            'p0_pcp': None,
            'p1_pcp': 1,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port0,
            'pcp': 2,
            'p0_pcp': None,
            'p1_pcp': 1,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port0,
            'pcp': 3,
            'p0_pcp': None,
            'p1_pcp': 1,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port0,
            'pcp': 4,
            'p0_pcp': None,
            'p1_pcp': 1,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port0,
            'pcp': 5,
            'p0_pcp': None,
            'p1_pcp': 1,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port0,
            'pcp': 6,
            'p0_pcp': None,
            'p1_pcp': 1,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port0,
            'pcp': 7,
            'p0_pcp': None,
            'p1_pcp': 1,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port1,
            'pcp': 0,
            'p0_pcp': 1,
            'p1_pcp': None,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port1,
            'pcp': 1,
            'p0_pcp': 1,
            'p1_pcp': None,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port1,
            'pcp': 2,
            'p0_pcp': 1,
            'p1_pcp': None,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port1,
            'pcp': 3,
            'p0_pcp': 1,
            'p1_pcp': None,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port1,
            'pcp': 4,
            'p0_pcp': 1,
            'p1_pcp': None,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port1,
            'pcp': 5,
            'p0_pcp': 1,
            'p1_pcp': None,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port1,
            'pcp': 6,
            'p0_pcp': 1,
            'p1_pcp': None,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port1,
            'pcp': 7,
            'p0_pcp': 1,
            'p1_pcp': None,
            'p2_pcp': 3,
            'p3_pcp': 5
        })
        test_cases.append({
            'ingress_port': self.dev_port2,
            'pcp': 0,
            'p0_pcp': 2,
            'p1_pcp': 2,
            'p2_pcp': None,
            'p3_pcp': 6
        })
        test_cases.append({
            'ingress_port': self.dev_port2,
            'pcp': 1,
            'p0_pcp': 2,
            'p1_pcp': 2,
            'p2_pcp': None,
            'p3_pcp': 6
        })
        test_cases.append({
            'ingress_port': self.dev_port2,
            'pcp': 2,
            'p0_pcp': 2,
            'p1_pcp': 2,
            'p2_pcp': None,
            'p3_pcp': 6
        })
        test_cases.append({
            'ingress_port': self.dev_port2,
            'pcp': 3,
            'p0_pcp': 2,
            'p1_pcp': 2,
            'p2_pcp': None,
            'p3_pcp': 6
        })
        test_cases.append({
            'ingress_port': self.dev_port2,
            'pcp': 4,
            'p0_pcp': 2,
            'p1_pcp': 2,
            'p2_pcp': None,
            'p3_pcp': 6
        })
        test_cases.append({
            'ingress_port': self.dev_port2,
            'pcp': 5,
            'p0_pcp': 2,
            'p1_pcp': 2,
            'p2_pcp': None,
            'p3_pcp': 6
        })
        test_cases.append({
            'ingress_port': self.dev_port2,
            'pcp': 6,
            'p0_pcp': 2,
            'p1_pcp': 2,
            'p2_pcp': None,
            'p3_pcp': 6
        })
        test_cases.append({
            'ingress_port': self.dev_port2,
            'pcp': 7,
            'p0_pcp': 2,
            'p1_pcp': 2,
            'p2_pcp': None,
            'p3_pcp': 6
        })
        test_cases.append({
            'ingress_port': self.dev_port3,
            'pcp': 0,
            'p0_pcp': 3,
            'p1_pcp': 3,
            'p2_pcp': 5,
            'p3_pcp': None
        })
        test_cases.append({
            'ingress_port': self.dev_port3,
            'pcp': 1,
            'p0_pcp': 3,
            'p1_pcp': 3,
            'p2_pcp': 5,
            'p3_pcp': None
        })
        test_cases.append({
            'ingress_port': self.dev_port3,
            'pcp': 2,
            'p0_pcp': 3,
            'p1_pcp': 3,
            'p2_pcp': 5,
            'p3_pcp': None
        })
        test_cases.append({
            'ingress_port': self.dev_port3,
            'pcp': 3,
            'p0_pcp': 3,
            'p1_pcp': 3,
            'p2_pcp': 5,
            'p3_pcp': None
        })
        test_cases.append({
            'ingress_port': self.dev_port3,
            'pcp': 4,
            'p0_pcp': 3,
            'p1_pcp': 3,
            'p2_pcp': 5,
            'p3_pcp': None
        })
        test_cases.append({
            'ingress_port': self.dev_port3,
            'pcp': 5,
            'p0_pcp': 3,
            'p1_pcp': 3,
            'p2_pcp': 5,
            'p3_pcp': None
        })
        test_cases.append({
            'ingress_port': self.dev_port3,
            'pcp': 6,
            'p0_pcp': 3,
            'p1_pcp': 3,
            'p2_pcp': 5,
            'p3_pcp': None
        })
        test_cases.append({
            'ingress_port': self.dev_port3,
            'pcp': 7,
            'p0_pcp': 3,
            'p1_pcp': 3,
            'p2_pcp': 5,
            'p3_pcp': None
        })
        for port, dot1p_to_tc, dot1p_color, tc_color_to_pcp in [
                [self.port0, self.qos_dot1p_to_tc_map_id,
                 self.p1_qos_dot1p_to_color_map_id,
                 self.p1_qos_tc_color_to_dot1q_id],
                [self.port1, self.qos_dot1p_to_tc_map_id,
                 self.p1_qos_dot1p_to_color_map_id,
                 self.p1_qos_tc_color_to_dot1q_id],
                [self.port2, self.qos_dot1p_to_tc_map_id,
                 self.p2_qos_dot1p_to_color_map_id,
                 self.p2_qos_tc_color_to_dot1q_id],
                [self.port3, self.qos_dot1p_to_tc_map_id,
                 self.p3_qos_dot1p_to_color_map_id,
                 self.p3_qos_tc_color_to_dot1q_id]]:
            # ingress set DOT1P -> TC
            status = sai_thrift_set_port_attribute(
                self.client, port, qos_dot1p_to_tc_map=dot1p_to_tc)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(self.client,
                                                 port,
                                                 qos_dot1p_to_tc_map=True)
            self.assertEqual(attr['qos_dot1p_to_tc_map'], dot1p_to_tc)
            # ingress set DOT1P -> COLOR
            status = sai_thrift_set_port_attribute(
                self.client, port, qos_dot1p_to_color_map=dot1p_color)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(
                self.client, port, qos_dot1p_to_color_map=True)
            self.assertEqual(attr['qos_dot1p_to_color_map'], dot1p_color)
            # egress set TC and COLOR -> DOT1Q
            status = sai_thrift_set_port_attribute(
                self.client,
                port,
                qos_tc_and_color_to_dot1p_map=tc_color_to_pcp)
            self.assertEqual(status, SAI_STATUS_SUCCESS,
                             "Failed to set port attribute")
            attr = sai_thrift_get_port_attribute(
                self.client, port, qos_tc_and_color_to_dot1p_map=True)
            self.assertEqual(attr['qos_tc_and_color_to_dot1p_map'],
                             tc_color_to_pcp)
        for test in test_cases:
            ingress_port = test['ingress_port']
            if test['pcp'] is not None:
                vlan = 1
                ingress_pcp = str(test['pcp'])
            else:
                vlan = 0
                ingress_pcp = 'None'
            # define expected egress_pcp per egress port
            p0_egress_pcp = test['p0_pcp']
            p1_egress_pcp = test['p1_pcp']
            p2_egress_pcp = test['p2_pcp']
            p3_egress_pcp = test['p3_pcp']
            pkt = simple_tcp_packet(eth_dst='00:33:33:33:33:00',
                                    eth_src='00:33:33:33:33:11',
                                    dl_vlan_enable=True,
                                    vlan_vid=vlan,
                                    vlan_pcp=test['pcp'],
                                    pktlen=104)
            p0_exp_pkt = simple_tcp_packet(
                eth_dst='00:33:33:33:33:00',
                eth_src='00:33:33:33:33:11',
                dl_vlan_enable=True,
                vlan_vid=1,
                vlan_pcp=p0_egress_pcp,
                pktlen=104)
            p1_exp_pkt = simple_tcp_packet(
                eth_dst='00:33:33:33:33:00',
                eth_src='00:33:33:33:33:11',
                dl_vlan_enable=True,
                vlan_vid=1,
                vlan_pcp=p1_egress_pcp,
                pktlen=104)
            p2_exp_pkt = simple_tcp_packet(
                eth_dst='00:33:33:33:33:00',
                eth_src='00:33:33:33:33:11',
                dl_vlan_enable=True,
                vlan_vid=1,
                vlan_pcp=p2_egress_pcp,
                pktlen=104)
            p3_exp_pkt = simple_tcp_packet(
                eth_dst='00:33:33:33:33:00',
                eth_src='00:33:33:33:33:11',
                dl_vlan_enable=True,
                vlan_vid=1,
                vlan_pcp=p3_egress_pcp,
                pktlen=104)
            egres_ports = []
            flood_port_list = []
            flood_pkt_list = []
            pkt_list = [p0_exp_pkt, p1_exp_pkt, p2_exp_pkt, p3_exp_pkt]
            egress_pcp_list = [p0_egress_pcp, p1_egress_pcp,
                               p2_egress_pcp, p3_egress_pcp]
            egress_pcp = []
            for i, port in enumerate(self.dev_test_port_list):
                if port == ingress_port:
                    continue
                flood_port_list.append([port])
                flood_pkt_list.append(pkt_list[i])
                egres_ports.append(port)
                egress_pcp.append(egress_pcp_list[i])
            print("Sending eth packet port %d (pcp=%s) -> "
                  " port %d (pcp=%d)"
                  % (ingress_port, ingress_pcp, egres_ports[0],
                     egress_pcp[0]))
            print("%47s port %d (egress_pcp=%d))" %
                  (" ", egres_ports[1], egress_pcp[1]))
            print("%47s port %d (egress_pcp=%d))" %
                  (" ", egres_ports[2], egress_pcp[2]))
            send_packet(self, ingress_port, pkt)
            verify_each_packet_on_multiple_port_lists(self, flood_pkt_list,
                                                      flood_port_list)
            print("\tPacket flooded. ok")


@group("draft")
class L2QosMapPcpToTcTest(L2QosMapBaseClass):
    ''' L2 PCP to TC QOS map tests base class. '''
    def setUp(self):
        super(L2QosMapPcpToTcTest, self).setUp()

    def runTest(self):
        # PCP -> Tc Map
        self.l2QosMapPCPToTcDefaultMappingTest()
        self.l2QosMapMultiplePCPToOneTcMappingTest()
        self.l2QosMapOneToOnePCPToTcMappingTest()
        self.l2QosMapSamePcpToTcManyIngressPortsTest()
        self.l2QosMapVariousPcpToTcManyIngressPortsTest()

    def tearDown(self):
        super(L2QosMapPcpToTcTest, self).tearDown()

    def l2QosMapPCPToTcDefaultMappingTest(self):
        ''' Test verifies the following:
            1. default L2 PCP to TC mapping (no mapping defined)
            The verification method:
                - setting the TC to QUEUE mapping
                - verification of the queue stats
        '''
        print("l2QosMapPCPToTcDefaultMappingTest")
        # default PCP to TC mapping
        test_cases = []
        # port default_tc Test Case
        test_cases.append({
            'pcp': 0,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 1,
            'port_default_tc': 5,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': 2,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 3,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 4,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 5,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 6,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 7,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        test_cases.append({
            'pcp': 0,
            'port_default_tc': 1,
            'queue': 1,
            'color': 0
        })
        test_cases.append({
            'pcp': 1,
            'port_default_tc': 2,
            'queue': 2,
            'color': 0
        })
        test_cases.append({
            'pcp': 2,
            'port_default_tc': 3,
            'queue': 3,
            'color': 0
        })
        test_cases.append({
            'pcp': 3,
            'port_default_tc': 4,
            'queue': 4,
            'color': 0
        })
        test_cases.append({
            'pcp': 4,
            'port_default_tc': 5,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': 5,
            'port_default_tc': 6,
            'queue': 6,
            'color': 0
        })
        test_cases.append({
            'pcp': 6,
            'port_default_tc': 7,
            'queue': 7,
            'color': 0
        })
        test_cases.append({
            'pcp': 7,
            'port_default_tc': 0,
            'queue': 0,
            'color': 0
        })
        # Test configured default_tc
        # different default_tc per port
        # port 0 -> default_tc = 5 ingress
        # port 1 -> default_tc = 1 egress
        # port 2 -> default_tc = 2 egress
        # port 3 -> default_tc = 3 egress
        test_cases.append({
            'pcp': 0,
            'port_default_tc': None,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': 1,
            'port_default_tc': None,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': 2,
            'port_default_tc': None,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': 3,
            'port_default_tc': None,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': 4,
            'port_default_tc': None,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': 5,
            'port_default_tc': None,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': 6,
            'port_default_tc': None,
            'queue': 5,
            'color': 0
        })
        test_cases.append({
            'pcp': 7,
            'port_default_tc': None,
            'queue': 5,
            'color': 0
        })
        try:
            # setup tc to queue index mapping
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            # assign to port the tc_queue and tc_color_to_pcp qos map
            for port, tc_to_queue in [[self.port0, qos_tc_to_queue_map_id],
                                      [self.port1, qos_tc_to_queue_map_id],
                                      [self.port2, qos_tc_to_queue_map_id],
                                      [self.port3, qos_tc_to_queue_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=tc_to_queue)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'], tc_to_queue)
            # verify port default tc
            for port in [self.port0, self.port1, self.port2, self.port3]:
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dot1p_to_tc_map=True,
                                                     qos_default_tc=True)
                self.assertEqual(attr['qos_dot1p_to_tc_map'], 0)
                self.assertEqual(attr['qos_default_tc'], 0)
            for test in test_cases:
                queue = test['queue']
                # setup port default_tc
                if test['port_default_tc'] is not None:
                    # every test port gets the same default_tc =
                    # test['port_default_tc']
                    port_default_tc = test['port_default_tc']
                    port_config = [[self.port0, port_default_tc],
                                   [self.port1, port_default_tc],
                                   [self.port2, port_default_tc],
                                   [self.port3, port_default_tc]]
                else:
                    # every port gets default_tc as its port number
                    # port 0 -> default tc = 5
                    # port 1 -> default tc = 1
                    # port 2 -> default tc = 2
                    # port 3 -> default tc = 3
                    port_config = [[self.port0, 5], [self.port1, 1],
                                   [self.port2, 2], [self.port3, 3]]
                for port, port_default_tc in port_config:
                    sai_thrift_set_port_attribute(
                        self.client, port, qos_default_tc=port_default_tc)
                    attr = sai_thrift_get_port_attribute(self.client,
                                                         port,
                                                         qos_default_tc=True)
                    self.assertEqual(attr['qos_default_tc'], port_default_tc)
                p1_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port1, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p2_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port2, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p3_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port3, queue, ['SAI_QUEUE_STAT_PACKETS'])
                if test['port_default_tc'] is not None:
                    port_default_tc = str(test['port_default_tc'])
                else:
                    port_default_tc = str(1)
                ingress_pcp = str(test['pcp'])
                print("Sending packet port %d (default_tc=%s, pcp=%s)"
                      " -> port %d (queue=%d, pcp=%d)"
                      % (self.dev_port0, port_default_tc,
                         ingress_pcp, self.dev_port1, queue, 1))
                print("\t\t\t\t\tport %d (queue=%d, pcp=%d))"
                      % (self.dev_port2, queue, 2))
                print("\t\t\t\t\tport %d (queue=%d, pcp=%d))"
                      % (self.dev_port3, queue, 3))
                ingress_pcp = test['pcp']
                pkt = simple_eth_raw_packet_with_taglist(
                    pktlen=104,
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_taglist_enable=True,
                    dl_vlan_pcp_list=[ingress_pcp],
                    dl_vlanid_list=[1])
                p1_exp_pkt = simple_eth_raw_packet_with_taglist(
                    pktlen=104,
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_taglist_enable=True,
                    dl_vlan_pcp_list=[1],
                    dl_vlanid_list=[1])
                p2_exp_pkt = simple_eth_raw_packet_with_taglist(
                    pktlen=104,
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_taglist_enable=True,
                    dl_vlan_pcp_list=[1],
                    dl_vlanid_list=[1])
                p3_exp_pkt = simple_eth_raw_packet_with_taglist(
                    pktlen=104,
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_taglist_enable=True,
                    dl_vlan_pcp_list=[3],
                    dl_vlanid_list=[1])
                test_port = self.dev_port0
                flood_port_list = [[self.dev_port1], [self.dev_port2],
                                   [self.dev_port3]]
                flood_pkt_list = [pkt, pkt, pkt]
                send_packet(self, test_port, pkt)
                verify_each_packet_on_multiple_port_lists(self, flood_pkt_list,
                                                          flood_port_list)
                print("\tPacket flooded. ok")
                p1_post_q_cnt = self.getPortQueueIndexStats(
                    self.port1, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p2_post_q_cnt = self.getPortQueueIndexStats(
                    self.port2, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p3_post_q_cnt = self.getPortQueueIndexStats(
                    self.port3, queue, ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    p1_initial_q_cnt + 1, p1_post_q_cnt,
                    'PORT1 queue {} packets counter {} != {}'.format(
                        queue, p1_initial_q_cnt + 1, p1_post_q_cnt))
                self.assertEqual(
                    p2_initial_q_cnt + 1, p2_post_q_cnt,
                    'PORT2 queue {} packets counter {} != {}'.format(
                        queue, p2_initial_q_cnt + 1, p2_post_q_cnt))
                self.assertEqual(
                    p3_initial_q_cnt + 1, p3_post_q_cnt,
                    'PORT3 queue {} packets counter {} != {}'.format(
                        queue, p3_initial_q_cnt + 1, p3_post_q_cnt))
        finally:
            for port in [self.port0, self.port1, self.port2, self.port3]:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_tc_to_queue_map=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_default_tc=0)
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)

    def l2QosMapMultiplePCPToOneTcMappingTest(self):
        ''' Test verifies the following:
            1. L2 traffic multiple PCP to TC mapping
            The verification method:
                - setting the TC to QUEUE mapping
                - verification of the queue stats
        '''
        print("l2QosMapMultiplePCPToOneTcMappingTest")
        test_cases = []
        # port default_tc Test Case
        test_cases.append({
            'pcp': 0,
            'port_default_tc': 0,
            'p1_queue': 3,
            'p2_queue': 3,
            'p3_queue': 3
        })
        test_cases.append({
            'pcp': 1,
            'port_default_tc': 0,
            'p1_queue': 3,
            'p2_queue': 3,
            'p3_queue': 3
        })
        test_cases.append({
            'pcp': 2,
            'port_default_tc': 0,
            'p1_queue': 3,
            'p2_queue': 3,
            'p3_queue': 3
        })
        test_cases.append({
            'pcp': 3,
            'port_default_tc': 0,
            'p1_queue': 3,
            'p2_queue': 3,
            'p3_queue': 3
        })
        test_cases.append({
            'pcp': 4,
            'port_default_tc': 0,
            'p1_queue': 7,
            'p2_queue': 7,
            'p3_queue': 7
        })
        test_cases.append({
            'pcp': 5,
            'port_default_tc': 0,
            'p1_queue': 7,
            'p2_queue': 7,
            'p3_queue': 7
        })
        test_cases.append({
            'pcp': 6,
            'port_default_tc': 0,
            'p1_queue': 7,
            'p2_queue': 7,
            'p3_queue': 7
        })
        test_cases.append({
            'pcp': 7,
            'port_default_tc': 0,
            'p1_queue': 7,
            'p2_queue': 7,
            'p3_queue': 7
        })
        try:
            print("Create dot1p -> tc qos mapping")
            ingress_dot1p_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [3, 3, 3, 3, 7, 7, 7, 7]
            qos_dot1p_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_TC, ingress_dot1p_list,
                ingress_tc_list)
            self.assertTrue(qos_dot1p_to_tc_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            print("Create tc -> queue index qos mapping")
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_queue_list = [3, 3, 3, 3, 7, 7, 7, 7]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            # configure the ingress ports
            for port, dot1p_to_tc in [[self.port0, qos_dot1p_to_tc_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dot1p_to_tc_map=dot1p_to_tc)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dot1p_to_tc_map=True)
                self.assertEqual(attr['qos_dot1p_to_tc_map'], dot1p_to_tc)
            # configure the egress ports
            for port, tc_to_queue in [[self.port1, qos_tc_to_queue_map_id],
                                      [self.port2, qos_tc_to_queue_map_id],
                                      [self.port3, qos_tc_to_queue_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=tc_to_queue)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'], tc_to_queue)
            # verify port default tc
            for port in [self.port0, self.port1, self.port2, self.port3]:
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True,
                                                     qos_default_tc=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'], 0)
                self.assertEqual(attr['qos_default_tc'], 0)
            for test in test_cases:
                pcp = test['pcp']
                # setup port default_tc
                port_default_tc = 0
                if test['port_default_tc'] is not None:
                    port_default_tc = test['port_default_tc']
                for port in [self.port0]:
                    sai_thrift_set_port_attribute(
                        self.client, port, qos_default_tc=port_default_tc)
                    attr = sai_thrift_get_port_attribute(self.client,
                                                         port,
                                                         qos_default_tc=True)
                    self.assertEqual(attr['qos_default_tc'], port_default_tc)
                p1_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['p1_queue'], ['SAI_QUEUE_STAT_PACKETS'])
                p2_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['p2_queue'], ['SAI_QUEUE_STAT_PACKETS'])
                p3_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port3, test['p3_queue'], ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending packet port %d (pcp=%d) -> "
                      "port %d (port_default_tc=%d queue=%d)"
                      % (self.dev_port0, pcp, self.dev_port1,
                         test['port_default_tc'], test['p1_queue']))
                pkt = simple_eth_raw_packet_with_taglist(
                    pktlen=104,
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_taglist_enable=True,
                    dl_vlan_pcp_list=[pcp],
                    dl_vlanid_list=[1])
                test_port = self.dev_port0
                flood_port_list = [[self.dev_port1], [self.dev_port2],
                                   [self.dev_port3]]
                flood_pkt_list = [pkt, pkt, pkt]
                send_packet(self, test_port, pkt)
                verify_each_packet_on_multiple_port_lists(self, flood_pkt_list,
                                                          flood_port_list)
                print("\tPacket flooded to ports 1,2,3. ok")
                p1_post_q_cnt = self.getPortQueueIndexStats(
                    self.port1, test['p1_queue'], ['SAI_QUEUE_STAT_PACKETS'])
                p2_post_q_cnt = self.getPortQueueIndexStats(
                    self.port2, test['p2_queue'], ['SAI_QUEUE_STAT_PACKETS'])
                p3_post_q_cnt = self.getPortQueueIndexStats(
                    self.port3, test['p3_queue'], ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    p1_initial_q_cnt + 1, p1_post_q_cnt,
                    'PORT1 queue {} packets counter {} != {}'.format(
                        test['p1_queue'], p1_initial_q_cnt + 1, p1_post_q_cnt))
                self.assertEqual(
                    p2_initial_q_cnt + 1, p2_post_q_cnt,
                    'PORT2 queue {} packets counter {} != {}'.format(
                        test['p2_queue'], p2_initial_q_cnt + 1, p2_post_q_cnt))
                self.assertEqual(
                    p3_initial_q_cnt + 1, p3_post_q_cnt,
                    'PORT3 queue {} packets counter {} != {}'.format(
                        test['p3_queue'], p3_initial_q_cnt + 1, p3_post_q_cnt))
        finally:
            for port in [self.port0, self.port1, self.port2, self.port3]:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_tc_to_queue_map=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_default_tc=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_dot1p_to_tc_map=0)
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)
            sai_thrift_remove_qos_map(self.client, qos_dot1p_to_tc_map_id)

    def l2QosMapVariousPcpToTcManyIngressPortsTest(self):
        ''' Test verifies the following:
            1. L2 traffic multiple PCP to various TC mapping
            The verification method:
                - setting the TC to QUEUE mapping
                - verification of the queue stats
        '''
        print("l2QosMapVariousPcpToTcManyIngressPortsTest")
        try:
            print("Create and verify dot1p -> tc qos mapping")
            p0_qos_dot1p_to_tc_map_id = create_and_verify_qos_map(
                self.client,
                SAI_QOS_MAP_TYPE_DOT1P_TO_TC, [0, 1, 2, 3, 4, 5, 6, 7],
                [4, 5, 6, 7, 0, 1, 2, 3],
                verify=True)
            # expected queue number formula
            # queue = (ingress port_number + 4 + pcp) mod 8
            self.assertTrue(p0_qos_dot1p_to_tc_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            p1_qos_dot1p_to_tc_map_id = create_and_verify_qos_map(
                self.client,
                SAI_QOS_MAP_TYPE_DOT1P_TO_TC, [0, 1, 2, 3, 4, 5, 6, 7],
                [5, 6, 7, 0, 1, 2, 3, 4],
                verify=True)
            self.assertTrue(p1_qos_dot1p_to_tc_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            p2_qos_dot1p_to_tc_map_id = create_and_verify_qos_map(
                self.client,
                SAI_QOS_MAP_TYPE_DOT1P_TO_TC, [0, 1, 2, 3, 4, 5, 6, 7],
                [6, 7, 0, 1, 2, 3, 4, 5],
                verify=True)
            self.assertTrue(p2_qos_dot1p_to_tc_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            p3_qos_dot1p_to_tc_map_id = create_and_verify_qos_map(
                self.client,
                SAI_QOS_MAP_TYPE_DOT1P_TO_TC, [0, 1, 2, 3, 4, 5, 6, 7],
                [7, 0, 1, 2, 3, 4, 5, 6],
                verify=True)
            self.assertTrue(p3_qos_dot1p_to_tc_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            print("Create tc -> queue index qos mapping")
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE,
                [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7])
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            # configure the ingress ports
            for port, dot1p_to_tc in [[self.port0, p0_qos_dot1p_to_tc_map_id],
                                      [self.port1, p1_qos_dot1p_to_tc_map_id],
                                      [self.port2, p2_qos_dot1p_to_tc_map_id],
                                      [self.port3, p3_qos_dot1p_to_tc_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dot1p_to_tc_map=dot1p_to_tc)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dot1p_to_tc_map=True)
                self.assertEqual(attr['qos_dot1p_to_tc_map'], dot1p_to_tc)
            # configure the egress ports tc -> queue mapping
            # same for all ports.
            for port, tc_to_queue in [[self.port0, qos_tc_to_queue_map_id],
                                      [self.port1, qos_tc_to_queue_map_id],
                                      [self.port2, qos_tc_to_queue_map_id],
                                      [self.port3, qos_tc_to_queue_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=tc_to_queue)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'], tc_to_queue)
            # verify port default_tc
            ports = [self.port0, self.port1, self.port2, self.port3]
            self.verifyPortDefaultDscpToTc(ports)
            for p_idx in range(0, len(self.dev_test_port_list)):
                test_port = self.dev_test_port_list[p_idx]
                print("Testing tx_port=%d" % (test_port))
                for pcp in [0, 1, 2, 3, 4, 5, 6, 7]:
                    pkt = simple_eth_raw_packet_with_taglist(
                        pktlen=104,
                        eth_dst='00:33:33:33:33:00',
                        eth_src='00:33:33:33:33:11',
                        dl_taglist_enable=True,
                        dl_vlan_pcp_list=[pcp],
                        dl_vlanid_list=[1])
                    flood_port_list = []
                    flood_pkt_list = []
                    for port in self.dev_test_port_list:
                        if port == test_port:
                            continue
                        flood_port_list.append([port])
                        flood_pkt_list.append(pkt)
                    port_queue = []
                    for port in range(0, len(self.dev_test_port_list)):
                        queue_index = (pcp + port + 4) % 8
                        port_queue.append(queue_index)
                    init_q_cnt = []
                    for port in [self.port0, self.port1, self.port2,
                                 self.port3]:
                        queue = port_queue[p_idx]
                        init_q_cnt.append(
                            self.getPortQueueIndexStats(
                                port, queue, ['SAI_QUEUE_STAT_PACKETS']))
                    print("Sending packet port %d (pcp=%d) -> "
                          "port %d (queue=%d)"
                          % (test_port, pcp, flood_port_list[0][0],
                             port_queue[p_idx]))
                    print("\t\t\t\t\tport %d (queue=%d)"
                          % (flood_port_list[1][0], port_queue[p_idx]))
                    print("\t\t\t\t\tport %d (queue=%d)"
                          % (flood_port_list[2][0], port_queue[p_idx]))
                    send_packet(self, test_port, pkt)
                    verify_each_packet_on_multiple_port_lists(
                        self, flood_pkt_list, flood_port_list)
                    print("\tPacket flooded to ports %s. ok" %
                          (flood_port_list))
                    print("\tVerify port queues packet counters.")
                    post_q_cnt = []
                    for port in [
                            self.port0, self.port1, self.port2, self.port3
                    ]:
                        post_q_cnt.append(
                            self.getPortQueueIndexStats(
                                port, port_queue[p_idx],
                                ['SAI_QUEUE_STAT_PACKETS']))
                    # verify the port queue counters
                    cnt_dict = {"init": init_q_cnt, "post": post_q_cnt}
                    self.verifyPortQueueCountersSamePcp(test_port, p_idx,
                                                        cnt_dict, port_queue)
                    print("\tok")
        finally:
            for port in [self.port0, self.port1, self.port2, self.port3]:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_tc_to_queue_map=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_default_tc=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_dot1p_to_tc_map=0)
            sai_thrift_remove_qos_map(self.client, p0_qos_dot1p_to_tc_map_id)
            sai_thrift_remove_qos_map(self.client, p1_qos_dot1p_to_tc_map_id)
            sai_thrift_remove_qos_map(self.client, p2_qos_dot1p_to_tc_map_id)
            sai_thrift_remove_qos_map(self.client, p3_qos_dot1p_to_tc_map_id)
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)

    def verifyPortDefaultDscpToTc(self, ports):
        """
        Verifies port default tc
        Args:
            ports (list): list of ports
        """
        for port in ports:
            attr = sai_thrift_get_port_attribute(self.client,
                                                 port,
                                                 qos_dscp_to_tc_map=True,
                                                 qos_default_tc=True)
            self.assertEqual(attr['qos_dscp_to_tc_map'], 0)
            self.assertEqual(attr['qos_default_tc'], 0)

    def verifyPortQueueCountersSamePcp(self, test_port, p_idx,
                                       cnt_dict, port_queue):
        """
        Verifies the port queue counters
        Args:
            test_port (int): test port number
            p_idx (int): port id
            cnt_dict (dict): dictionary of cnt lists
            port_queue (list): port queue list
        """
        i = 0
        for port in self.dev_test_port_list:
            if port == test_port:
                # counter should remain unchanged
                self.assertEqual(
                    cnt_dict["init"][i], cnt_dict["post"][i],
                    'PORT{} queue {} packets expected {} got {}'
                    .format(port, port_queue[p_idx], cnt_dict["init"][i],
                            cnt_dict["post"][i]))
            else:
                self.assertEqual(
                    cnt_dict["init"][i] + 1, cnt_dict["post"][i],
                    'PORT{} queue {} packets expected {} got {}'
                    .format(port, port_queue[p_idx],
                            cnt_dict["init"][i] + 1, cnt_dict["post"][i]))
            i += 1

    def l2QosMapSamePcpToTcManyIngressPortsTest(self):
        ''' Test verifies the following:
            1. L2 traffic same PCP to many TC mapping
            The verification method:
                - setting the TC to QUEUE mapping
                - verification of the queue stats
        '''
        print("l2QosMapSamePcpToTcManyIngressPortsTest")
        test_cases = []
        test_cases.append({
            'tx_port': self.dev_port0,
            'pcp': 0,
            'p1_queue': 0,
            'p2_queue': 0,
            'p3_queue': 0
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'pcp': 1,
            'p1_queue': 1,
            'p2_queue': 1,
            'p3_queue': 1
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'pcp': 2,
            'p1_queue': 2,
            'p2_queue': 2,
            'p3_queue': 2
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'pcp': 3,
            'p1_queue': 3,
            'p2_queue': 3,
            'p3_queue': 3
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'pcp': 4,
            'p1_queue': 4,
            'p2_queue': 4,
            'p3_queue': 4
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'pcp': 5,
            'p1_queue': 5,
            'p2_queue': 5,
            'p3_queue': 5
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'pcp': 6,
            'p1_queue': 6,
            'p2_queue': 6,
            'p3_queue': 6
        })
        test_cases.append({
            'tx_port': self.dev_port0,
            'pcp': 7,
            'p1_queue': 7,
            'p2_queue': 7,
            'p3_queue': 7
        })
        try:
            print("Create dot1p -> tc qos mapping")
            ingress_dot1p_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_dot1p_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_TC, ingress_dot1p_list,
                ingress_tc_list)
            self.assertTrue(qos_dot1p_to_tc_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            print("Create tc -> queue index qos mapping")
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            # configure the ingress ports
            for port, dot1p_to_tc in [[self.port0, qos_dot1p_to_tc_map_id],
                                      [self.port1, qos_dot1p_to_tc_map_id],
                                      [self.port2, qos_dot1p_to_tc_map_id],
                                      [self.port3, qos_dot1p_to_tc_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dot1p_to_tc_map=dot1p_to_tc)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dot1p_to_tc_map=True)
                self.assertEqual(attr['qos_dot1p_to_tc_map'], dot1p_to_tc)
            # configure the egress ports
            for port, tc_to_queue in [[self.port0, qos_tc_to_queue_map_id],
                                      [self.port1, qos_tc_to_queue_map_id],
                                      [self.port2, qos_tc_to_queue_map_id],
                                      [self.port3, qos_tc_to_queue_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=tc_to_queue)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'], tc_to_queue)
            # verify port default_tc
            ports = [self.port0, self.port1, self.port2, self.port3]
            self.verifyPortDefaultDscpToTc(ports)
            for test_port in self.dev_test_port_list:
                print("Testing tx_port=%d" % (test_port))
                for test in test_cases:
                    pcp = test['pcp']
                    pkt = simple_eth_raw_packet_with_taglist(
                        pktlen=104,
                        eth_dst='00:33:33:33:33:00',
                        eth_src='00:33:33:33:33:11',
                        dl_taglist_enable=True,
                        dl_vlan_pcp_list=[pcp],
                        dl_vlanid_list=[1])
                    flood_port_list = []
                    flood_pkt_list = []
                    for port in self.dev_test_port_list:
                        if port == test_port:
                            continue
                        flood_port_list.append([port])
                        flood_pkt_list.append(pkt)
                    init_q_cnt = []
                    for port in [
                            self.port0, self.port1, self.port2, self.port3
                    ]:
                        init_q_cnt.append(
                            self.getPortQueueIndexStats(
                                port, test['p1_queue'],
                                ['SAI_QUEUE_STAT_PACKETS']))
                    print("Sending packet port %d (pcp=%d) -> "
                          "port %d (queue=%d)"
                          % (test_port, pcp, flood_port_list[0][0],
                             test['p1_queue']))
                    print("\t\t\t\t\tport %d (queue=%d)"
                          % (flood_port_list[1][0], test['p2_queue']))
                    print("\t\t\t\t\tport %d (queue=%d)"
                          % (flood_port_list[2][0], test['p3_queue']))
                    send_packet(self, test_port, pkt)
                    verify_each_packet_on_multiple_port_lists(
                        self, flood_pkt_list, flood_port_list)
                    print("\tPacket flooded to ports %s. ok" %
                          (flood_port_list))
                    print("\tVerify port queues packet counters.")
                    post_q_cnt = []
                    for port in [
                            self.port0, self.port1, self.port2, self.port3
                    ]:
                        post_q_cnt.append(
                            self.getPortQueueIndexStats(
                                port, test['p1_queue'],
                                ['SAI_QUEUE_STAT_PACKETS']))
                    # verify the port queue counters
                    print("Test")
                    print(type(test))
                    self.verifyPortQueueCountersVariousPcp(
                        test_port, test, init_q_cnt, post_q_cnt)
                    print("\tok")
        finally:
            for port in [self.port0, self.port1, self.port2, self.port3]:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_tc_to_queue_map=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_default_tc=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_dot1p_to_tc_map=0)
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)
            sai_thrift_remove_qos_map(self.client, qos_dot1p_to_tc_map_id)

    def verifyPortQueueCountersVariousPcp(self, test_port, test, init_q_cnt,
                                          post_q_cnt):
        """
        Verifies the port queue counters
        Args:
            test_port (int): test port number
            test (dict): test dictionary
            init_q_cnt (list): init cnt list
            post_q_cnt (list): post cnt list
        """
        i = 0
        for port in self.dev_test_port_list:
            if port == test_port:
                # counter should remain unchanged
                self.assertEqual(
                    init_q_cnt[i], post_q_cnt[i],
                    'PORT{} queue {} packets expected {} == {}'
                    .format(port, test['p1_queue'], init_q_cnt[i],
                            post_q_cnt[i]))
            else:
                self.assertEqual(
                    init_q_cnt[i] + 1, post_q_cnt[i],
                    'PORT{} queue {} packets expected {} == {}'
                    .format(port, test['p1_queue'],
                            init_q_cnt[i] + 1, post_q_cnt[i]))
            i += 1

    def l2QosMapOneToOnePCPToTcMappingTest(self):
        ''' Test verifies the following:
            1. L2 traffic one to one PCP to TC mapping
            The verification method:
                - setting the TC to QUEUE mapping
                - verification of the queue stats
        '''
        print("l2QosMapOneToOnePCPToTcMappingTest")
        test_cases = []
        test_cases.append({'pcp': 0, 'queue': 0})
        test_cases.append({'pcp': 1, 'queue': 1})
        test_cases.append({'pcp': 2, 'queue': 2})
        test_cases.append({'pcp': 3, 'queue': 3})
        test_cases.append({'pcp': 4, 'queue': 4})
        test_cases.append({'pcp': 5, 'queue': 5})
        test_cases.append({'pcp': 6, 'queue': 6})
        test_cases.append({'pcp': 7, 'queue': 7})
        try:
            print("Create dot1p -> tc qos mapping")
            ingress_dot1p_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_dot1p_to_tc_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_TC, ingress_dot1p_list,
                ingress_tc_list)
            self.assertTrue(qos_dot1p_to_tc_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            print("Create tc -> queue index qos mapping")
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            # configure the ingress ports
            for port, dot1p_to_tc in [[self.port0, qos_dot1p_to_tc_map_id]]:
                # print("PORT 0x%x dot1p_to_tc=0x%x" %(port, dot1p_to_tc))
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_dot1p_to_tc_map=dot1p_to_tc)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dot1p_to_tc_map=True)
                self.assertEqual(attr['qos_dot1p_to_tc_map'], dot1p_to_tc)
            # configure the egress ports
            for port, tc_to_queue in [[self.port1, qos_tc_to_queue_map_id],
                                      [self.port2, qos_tc_to_queue_map_id],
                                      [self.port3, qos_tc_to_queue_map_id]]:
                status = sai_thrift_set_port_attribute(
                    self.client, port, qos_tc_to_queue_map=tc_to_queue)
                self.assertEqual(status, SAI_STATUS_SUCCESS,
                                 "Failed to set port attribute")
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_tc_to_queue_map=True)
                self.assertEqual(attr['qos_tc_to_queue_map'], tc_to_queue)
            # verify port default tc
            for port in [self.port0, self.port1, self.port2, self.port3]:
                attr = sai_thrift_get_port_attribute(self.client,
                                                     port,
                                                     qos_dscp_to_tc_map=True,
                                                     qos_default_tc=True)
                self.assertEqual(attr['qos_dscp_to_tc_map'], 0)
                self.assertEqual(attr['qos_default_tc'], 0)
            for test in test_cases:
                pcp = test['pcp']
                queue = test['queue']
                # setup port default_tc
                port_default_tc = 0
                for port in [self.port0]:
                    attr = sai_thrift_get_port_attribute(self.client,
                                                         port,
                                                         qos_default_tc=True)
                    self.assertEqual(attr['qos_default_tc'], port_default_tc)
                p1_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port1, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p2_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port2, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p3_initial_q_cnt = self.getPortQueueIndexStats(
                    self.port3, queue, ['SAI_QUEUE_STAT_PACKETS'])
                print("Sending eth packet port %d (pcp=%d) -> "
                      "port %d (queue=%d)"
                      % (self.dev_port0, pcp, self.dev_port1,
                         queue))
                print("\t\t\t\t\tport %d (queue=%d)"
                      % (self.dev_port2, queue))
                print("\t\t\t\t\tport %d (queue=%d)"
                      % (self.dev_port3, queue))
                pkt = simple_eth_raw_packet_with_taglist(
                    pktlen=104,
                    eth_dst='00:33:33:33:33:00',
                    eth_src='00:33:33:33:33:11',
                    dl_taglist_enable=True,
                    dl_vlan_pcp_list=[pcp],
                    dl_vlanid_list=[1])
                test_port = self.dev_port0
                flood_port_list = [[self.dev_port1], [self.dev_port2],
                                   [self.dev_port3]]
                flood_pkt_list = [pkt, pkt, pkt]
                send_packet(self, test_port, pkt)
                verify_each_packet_on_multiple_port_lists(self, flood_pkt_list,
                                                          flood_port_list)
                print("\tPacket flooded to ports 1,2,3. ok")
                p1_post_q_cnt = self.getPortQueueIndexStats(
                    self.port1, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p2_post_q_cnt = self.getPortQueueIndexStats(
                    self.port2, queue, ['SAI_QUEUE_STAT_PACKETS'])
                p3_post_q_cnt = self.getPortQueueIndexStats(
                    self.port3, queue, ['SAI_QUEUE_STAT_PACKETS'])
                self.assertEqual(
                    p1_initial_q_cnt + 1, p1_post_q_cnt,
                    'PORT1 queue {} packets counter {} != {}'.format(
                        queue, p1_initial_q_cnt + 1, p1_post_q_cnt))
                self.assertEqual(
                    p2_initial_q_cnt + 1, p2_post_q_cnt,
                    'PORT2 queue {} packets counter {} != {}'.format(
                        queue, p2_initial_q_cnt + 1, p2_post_q_cnt))
                self.assertEqual(
                    p3_initial_q_cnt + 1, p3_post_q_cnt,
                    'PORT3 queue {} packets counter {} != {}'.format(
                        queue, p3_initial_q_cnt + 1, p3_post_q_cnt))
        finally:
            for port in [self.port0, self.port1, self.port2, self.port3]:
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_tc_to_queue_map=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_default_tc=0)
                sai_thrift_set_port_attribute(self.client,
                                              port,
                                              qos_dot1p_to_tc_map=0)
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)
            sai_thrift_remove_qos_map(self.client, qos_dot1p_to_tc_map_id)


@group("draft")
class QosMapCreateModifyTest(L2QosMapBaseClass):
    ''' QOS map create and modify test base class.
    '''
    def setUp(self):
        super(QosMapCreateModifyTest, self).setUp()

    def runTest(self):
        self.qosMapTcToQueueModifyTest()
        self.qosMapTcColorToDscpCreateModifyTest()
        self.qosMapDscpToTcCreateModifyTest()
        self.qosMapDscpToColorCreateModifyTest()
        self.qosMapPrioToQueueModifyTest()
        self.qosMapDot1ToTcCreateModifyTest()
        self.qosMapDot1ToColorCreateModifyTest()
        self.qosMapTcColorToDot1pCreateModifyTest()
        self.qosMapPfcPrioToPrioGroupCreateModifyTest()
        self.qosMapTcPgCreateModifyTest()

    def tearDown(self):
        super(QosMapCreateModifyTest, self).tearDown()

    def qosMapDscpToTcCreateModifyTest(self):
        ''' QOS DSCP -> TC map create and modify test.
            Test verifies creation of the qos map object.
            In addition it:
            - verifies created qos map and its map_to_value_list.
            - updates the created qos map object map_to_value_list
              with the new data list and verifies it
        '''
        print("qosMapDscpToTcCreateModifyTest")
        try:
            # setup tc to queue index mapping
            print("Create dscp -> tc qos mapping")
            ingress_dscp_list = [63, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_dscp_to_tc_map_id = create_and_verify_qos_map(
                self.client,
                SAI_QOS_MAP_TYPE_DSCP_TO_TC,
                ingress_dscp_list,
                ingress_tc_list,
                verify=False)
            self.assertTrue(qos_dscp_to_tc_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            test_cases = []
            test_cases.append({'dscp': [0, 1, 2, 4, 5], 'tc': [0, 1, 2, 4, 5]})
            test_cases.append({'dscp': [5, 6, 7], 'tc': [2, 2, 2]})
            test_cases.append({'dscp': [0], 'tc': [0]})
            test_cases.append({'dscp': [], 'tc': []})
            i = 0
            for test in test_cases:
                print("[tc:%d]: Update existing qos_map dscp -> "
                      "tc with new map_to_value_list" % (i))
                self.assertEqual(
                    update_and_verify_qos_map(
                        self.client, qos_dscp_to_tc_map_id,
                        SAI_QOS_MAP_TYPE_DSCP_TO_TC,
                        test['dscp'], test['tc']), True,
                    "Failed verify updated qos_map attribute")
                print("\tok")
                i += 1
        finally:
            sai_thrift_remove_qos_map(self.client, qos_dscp_to_tc_map_id)

    def qosMapTcToQueueModifyTest(self):
        ''' QOS TC -> QUEUE map create and modify test.
            Test verifies creation of the qos map object.
            In addition it:
            - verifies created qos map and its map_to_value_list.
            - updates the created qos map object map_to_value_list
              with the new data list and verifies it
        '''
        print("qosMapTcToQueueModifyTest")
        try:
            # setup tc to queue index mapping
            print("Create tc -> queue index qos mapping")
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_tc_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_QUEUE, ingress_tc_list,
                ingress_queue_list)
            self.assertTrue(qos_tc_to_queue_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            test_cases = []
            test_cases.append({
                'tc': [0, 1, 2, 4, 5],
                'queue': [0, 1, 2, 4, 5]
            })
            test_cases.append({
                'tc': [0, 1, 2, 4, 5],
                'queue': [0, 0, 0, 0, 0]})
            test_cases.append({
                'tc': [0, 1, 2, 4, 5, 6, 7],
                'queue': [0, 0, 0, 0, 0, 7, 7]
            })
            test_cases.append({'tc': [5, 6, 7], 'queue': [2, 2, 2]})
            test_cases.append({'tc': [0], 'queue': [0]})
            i = 0
            for test in test_cases:
                print("[tc]%d]: Update existing qos_map tc -> "
                      "queue index with new map_to_value_list" % (i))
                self.assertEqual(
                    update_and_verify_qos_map(
                        self.client, qos_tc_to_queue_map_id,
                        SAI_QOS_MAP_TYPE_TC_TO_QUEUE,
                        test['tc'], test['queue']), True,
                    "Failed verify updated qos_map attribute")
                print("\tok")
                i += 1
        finally:
            sai_thrift_remove_qos_map(self.client, qos_tc_to_queue_map_id)

    def qosMapDscpToColorCreateModifyTest(self):
        ''' QOS DSCP -> COLOR map create and modify test.
            Test verifies creation of the qos map object.
            In addition it:
            - verifies created qos map and its map_to_value_list.
            - updates the created qos map object map_to_value_list
              with the new data list and verifies it
        '''
        print("qosMapDscpToColorCreateModifyTest")
        try:
            # setup tc to queue index mapping
            print("Create dscp -> color qos mapping")
            ingress_dscp_list = [63, 1, 2, 3, 4, 5, 6, 7]
            ingress_color_list = [0, 1, 2, 2, 2, 2, 2, 2]
            qos_dscp_to_color_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DSCP_TO_COLOR, ingress_dscp_list,
                ingress_color_list)
            self.assertTrue(qos_dscp_to_color_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            test_cases = []
            test_cases.append({
                'dscp': [0, 1, 2, 4, 5],
                'color': [0, 1, 2, 0, 0]
            })
            test_cases.append({
                'dscp': [0, 1, 2, 4, 5, 19, 20],
                'color': [0, 1, 2, 0, 0, 2, 2]
            })
            test_cases.append({'dscp': [5, 6, 7], 'color': [2, 2, 2]})
            test_cases.append({'dscp': [0], 'color': [0]})
            test_cases.append({'dscp': [], 'color': []})
            i = 0
            for test in test_cases:
                print("[tc:%d]: Update existing qos_map dscp -> "
                      "color with new map_to_value_list" % (i))
                self.assertEqual(
                    update_and_verify_qos_map(
                        self.client, qos_dscp_to_color_map_id,
                        SAI_QOS_MAP_TYPE_DSCP_TO_COLOR,
                        test['dscp'], test['color']), True,
                    "Failed verify updated qos_map attribute")
                print("\tok")
                i += 1
        finally:
            sai_thrift_remove_qos_map(self.client, qos_dscp_to_color_map_id)

    def qosMapPrioToQueueModifyTest(self):
        ''' QOS PRIO -> QUEUE map create and modify test.
            Test verifies creation of the qos map object.
            In addition it:
            - verifies created qos map and its map_to_value_list.
            - updates the created qos map object map_to_value_list
              with the new data list and verifies it
        '''
        print("qosMapPrioToQueueModifyTest")
        try:
            # setup tc to queue index mapping
            print("Create prio -> queue index qos mapping")
            ingress_prio_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_queue_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_prio_to_queue_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_QUEUE,
                ingress_prio_list, ingress_queue_list)
            self.assertTrue(qos_prio_to_queue_map_id != 0,
                            "Failed to create qos_map")
            print("\tok")
            test_cases = []
            test_cases.append({
                'prio': [0, 1, 2, 4, 5],
                'queue': [0, 1, 2, 4, 5]
            })
            test_cases.append({'prio': [5, 6, 7], 'queue': [2, 2, 2]})
            test_cases.append({'prio': [7], 'queue': [7]})
            test_cases.append({'prio': [], 'queue': []})
            i = 0
            for test in test_cases:
                print("[tc:%d]: Update existing qos_map prio -> "
                      " queue index with new map_to_value_list" % (i))
                self.assertEqual(
                    update_and_verify_qos_map(
                        self.client, qos_prio_to_queue_map_id,
                        SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_QUEUE, test['prio'],
                        test['queue']), True,
                    "Failed verify updated qos_map attribute")
                print("\tok")
                i += 1
        finally:
            sai_thrift_remove_qos_map(self.client, qos_prio_to_queue_map_id)

    def qosMapDot1ToColorCreateModifyTest(self):
        ''' QOS DOT1P -> COLOR map create and modify test.
            Test verifies creation of the qos map object.
            In addition it:
            - verifies created qos map and its map_to_value_list.
            - updates the created qos map object map_to_value_list
              with the new data list and verifies it
        '''
        print("qosMapDot1ToColorCreateModifyTest")
        try:
            # setup tc to queue index mapping
            print("Create dot1p -> color qos mapping")
            ingress_dot1p_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_color_list = [0, 0, 0, 1, 1, 1, 2, 2]
            qos_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_COLOR,
                ingress_dot1p_list, ingress_color_list)
            self.assertTrue(qos_map_id != 0, "Failed to create qos_map")
            print("\tok")
            test_cases = []
            test_cases.append({
                'dot1p': [0, 1, 2, 4, 5],
                'color': [0, 1, 2, 2, 2]
            })
            test_cases.append({'dot1p': [5, 6, 7], 'color': [2, 2, 2]})
            test_cases.append({'dot1p': [5, 6, 7], 'color': [0, 0, 0]})
            test_cases.append({'dot1p': [5, 6, 7, 0], 'color': [0, 0, 0, 1]})
            test_cases.append({'dot1p': [0], 'color': [0]})
            test_cases.append({'dot1p': [], 'color': []})
            i = 0
            for test in test_cases:
                print("[tc:%d]: Update existing qos_map dot1p -> "
                      " color with new map_to_value_list" % (i))
                self.assertEqual(
                    update_and_verify_qos_map(
                        self.client, qos_map_id,
                        SAI_QOS_MAP_TYPE_DOT1P_TO_COLOR,
                        test['dot1p'], test['color']), True,
                    "Failed verify updated qos_map attribute")
                print("\tok")
                i += 1
        finally:
            sai_thrift_remove_qos_map(self.client, qos_map_id)

    def qosMapPfcPrioToPrioGroupCreateModifyTest(self):
        ''' QOS PFC PRIORITY -> PRIORITY GROUP map create and modify test.
            Test verifies creation of the qos map object.
            In addition it:
            - verifies created qos map and its map_to_value_list.
            - updates the created qos map object map_to_value_list
              with the new data list and verifies it
        '''
        print("qosMapPfcPrioToPrioGroupCreateModifyTest")
        try:
            # setup tc to queue index mapping
            print("Create PFC priority -> priority group mapping")
            ingress_pfc_prio_list = [0, 1, 2]
            ingress_pg_list = [3, 4, 5]
            qos_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP,
                ingress_pfc_prio_list, ingress_pg_list)
            self.assertTrue(qos_map_id != 0, "Failed to create qos_map")
            print("\tok")
            test_cases = []
            test_cases.append({
                'pfc_prio': [0, 1, 2, 4, 5],
                'pg': [0, 1, 2, 2, 2]
            })
            test_cases.append({'pfc_prio': [5, 6, 7], 'pg': [2, 2, 2]})
            test_cases.append({'pfc_prio': [5, 6, 7], 'pg': [0, 2, 2]})
            test_cases.append({'pfc_prio': [5, 6, 7], 'pg': [0, 2, 3]})
            test_cases.append({'pfc_prio': [5, 6, 7, 0], 'pg': [0, 0, 0, 1]})
            test_cases.append({'pfc_prio': [0], 'pg': [0]})
            test_cases.append({'pfc_prio': [], 'pg': []})
            i = 0
            for test in test_cases:
                print("[tc:%d]: Update existing qos_map pfc_priority -> "
                      " priority_group with new map_to_value_list" % (i))
                self.assertEqual(
                    update_and_verify_qos_map(
                        self.client, qos_map_id,
                        SAI_QOS_MAP_TYPE_PFC_PRIORITY_TO_PRIORITY_GROUP,
                        test['pfc_prio'], test['pg']), True,
                    "Failed verify updated qos_map attribute")
                print("\tok")
                i += 1
        finally:
            sai_thrift_remove_qos_map(self.client, qos_map_id)

    def qosMapDot1ToTcCreateModifyTest(self):
        ''' QOS DOT1P -> TC map create and modify test.
            Test verifies creation of the qos map object.
            In addition it:
            - verifies created qos map and its map_to_value_list.
            - updates the created qos map object map_to_value_list
              with the new data list and verifies it
        '''
        print("qosMapDot1ToTcCreateModifyTest")
        try:
            # setup dot1p to tc mapping
            print("Create dot1p -> tc qos mapping")
            ingress_dot1p_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_DOT1P_TO_TC, ingress_dot1p_list,
                ingress_tc_list)
            self.assertTrue(qos_map_id != 0, "Failed to create qos_map")
            print("\tok")
            test_cases = []
            test_cases.append({'dot1p': [0, 1, 2, 4, 5],
                               'tc': [0, 1, 2, 4, 5]})
            test_cases.append({'dot1p': [5, 6, 7], 'tc': [2, 2, 2]})
            test_cases.append({'dot1p': [0], 'tc': [0]})
            test_cases.append({'dot1p': [], 'tc': []})
            i = 0
            for test in test_cases:
                print("[tc:%d]: Update existing qos_map dot1p -> "
                      "tc with new map_to_value_list" % (i))
                self.assertEqual(
                    update_and_verify_qos_map(
                        self.client, qos_map_id,
                        SAI_QOS_MAP_TYPE_DOT1P_TO_TC,
                        test['dot1p'], test['tc']), True,
                    "Failed verify updated qos_map attribute")
                print("\tok")
                i += 1
        finally:
            sai_thrift_remove_qos_map(self.client, qos_map_id)

    def qosMapTcColorToDscpCreateModifyTest(self):
        ''' QOS TC + COLOR -> DSCP map create and modify test.
            Test verifies creation of the qos map object.
            In addition it:
            - verifies created qos map and its map_to_value_list.
            - updates the created qos map object map_to_value_list
              with the new data list and verifies it
        '''
        print("qosMapTcColorToDscpCreateModifyTest")
        try:
            # setup tc to queue index mapping
            print("Create tc and color -> dscp qos mapping")
            ingress_tc_color_list = [[0, 1], [1, 1], [2, 0], [3, 0], [4, 1],
                                     [5, 0], [6, 1], [7, 0]]
            ingress_dscp_list = [0, 21, 32, 13, 44, 25, 16, 9]
            qos_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DSCP,
                ingress_tc_color_list, ingress_dscp_list)
            self.assertTrue(qos_map_id != 0, "Failed to create qos_map")
            print("\tok")
            test_cases = []
            test_cases.append({
                'tc_color': [[1, 0], [2, 0], [7, 0]],
                'dscp': [0, 1, 2]
            })
            test_cases.append({
                'tc_color': [[1, 1], [1, 0], [2, 0]],
                'dscp': [0, 1, 2]
            })
            test_cases.append({
                'tc_color': [[1, 1], [2, 2], [3, 1], [4, 0]],
                'dscp': [12, 9, 27, 32]
            })
            test_cases.append({'tc_color': [], 'dscp': []})
            i = 0
            for test in test_cases:
                print("[tc:%d]: Update existing qos_map_id tc_color -> "
                      " dscp with new map_to_value_list" % (i))
                self.assertEqual(
                    update_and_verify_qos_map(
                        self.client, qos_map_id,
                        SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DSCP,
                        test['tc_color'], test['dscp']), True,
                    "Failed verify updated qos_map attribute")
                print("\tok")
                i += 1
        finally:
            sai_thrift_remove_qos_map(self.client, qos_map_id)

    def qosMapTcColorToDot1pCreateModifyTest(self):
        ''' QOS TC + COLOR -> DOT1P map create and modify test.
            Test verifies creation of the qos map object.
            In addition it:
            - verifies created qos map and its map_to_value_list.
            - updates the created qos map object map_to_value_list
              with the new data list and verifies it
        '''
        print("qosMapTcColorToDot1pCreateModifyTest")
        try:
            # setup tc to queue index mapping
            print("Create tc and color -> dot1p qos mapping")
            ingress_tc_color_list = [[0, 1], [1, 1], [2, 0], [3, 0], [4, 1],
                                     [5, 0], [6, 1], [7, 0]]
            ingress_dot1p_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P,
                ingress_tc_color_list, ingress_dot1p_list)
            self.assertTrue(qos_map_id != 0, "Failed to create qos_map")
            print("\tok")
            test_cases = []
            test_cases.append({
                'tc_color': [[1, 2], [2, 0], [7, 0]],
                'dot1p': [0, 1, 2]
            })
            test_cases.append({
                'tc_color': [[1, 1], [1, 0], [2, 0]],
                'dot1p': [0, 1, 2]
            })
            test_cases.append({
                'tc_color': [[1, 1], [2, 2], [3, 1], [4, 0]],
                'dot1p': [7, 4, 5, 7]
            })
            test_cases.append({'tc_color': [], 'dot1p': []})
            i = 0
            for test in test_cases:
                print("[tc:%d]: Update existing qos_map tc_color -> "
                      " dot1p with new map_to_value_list" % (i))
                self.assertEqual(
                    update_and_verify_qos_map(
                        self.client, qos_map_id,
                        SAI_QOS_MAP_TYPE_TC_AND_COLOR_TO_DOT1P,
                        test['tc_color'], test['dot1p']), True,
                    "Failed verify updated qos_map attribute")
                print("\tok")
                i += 1
        finally:
            sai_thrift_remove_qos_map(self.client, qos_map_id)

    def qosMapTcPgCreateModifyTest(self):
        ''' QOS TC -> PRIORITY GROUP map create and modify test.
            Test verifies creation of the qos map object.
            In addition it:
            - verifies created qos map and its map_to_value_list.
            - updates the created qos map object map_to_value_list
              with the new data list and verifies it
        '''
        print("qosMapTcPgCreateModifyTest")
        try:
            print("Create tc -> priority group qos mapping")
            ingress_tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
            ingress_pg_list = [0, 1, 2, 3, 4, 5, 6, 7]
            qos_map_id = create_and_verify_qos_map(
                self.client, SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP,
                ingress_tc_list, ingress_pg_list)
            self.assertTrue(qos_map_id != 0, "Failed to create qos_map")
            print("\tok")
            test_cases = []
            test_cases.append({'tc': [0, 1, 2], 'pg': [0, 1, 2]})
            test_cases.append({'tc': [0, 1, 2], 'pg': [2, 1, 0]})
            test_cases.append({'tc': [0], 'pg': [7]})
            test_cases.append({'tc': [0], 'pg': [6]})
            test_cases.append({
                'tc': [0, 1, 2, 3, 4, 5, 6, 7],
                'pg': [0, 0, 0, 0, 1, 2, 3, 4]
            })
            test_cases.append({'tc': [], 'pg': []})
            i = 0
            for test in test_cases:
                print("%d: Update qos_map tc [%s] -> pg [%s]" %
                      (i, test['tc'], test['pg']))
                self.assertEqual(
                    update_and_verify_qos_map(
                        self.client, qos_map_id,
                        SAI_QOS_MAP_TYPE_TC_TO_PRIORITY_GROUP, test['tc'],
                        test['pg']), True,
                    "Failed verify updated qos_map attribute")
                print("\tok")
                i += 1
        finally:
            sai_thrift_remove_qos_map(self.client, qos_map_id)
