unittest/meta/TestMeta.cpp (1,224 lines of code) (raw):

#include "Meta.h" #include "MockMeta.h" #include "MetaTestSaiInterface.h" #include <arpa/inet.h> #include <net/ethernet.h> #include <gtest/gtest.h> #include <memory> #define VLAN_ID 2 using namespace saimeta; class MetaTest : public ::testing::Test { protected: sai_object_id_t m_switch_id, m_vlan_id, m_vr_id, m_port_id, m_rif_id; std::vector<sai_attribute_t> m_attrs; sai_attribute_t m_attr; Meta *m_meta; void SetupMeta() { SWSS_LOG_ENTER(); m_attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; m_attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m_meta->create(SAI_OBJECT_TYPE_SWITCH, &m_switch_id, SAI_NULL_OBJECT_ID, 1, &m_attr)); m_attr.id = SAI_VLAN_ATTR_VLAN_ID; m_attr.value.u16 = VLAN_ID; EXPECT_EQ(SAI_STATUS_SUCCESS, m_meta->create(SAI_OBJECT_TYPE_VLAN, &m_vlan_id, m_switch_id, 1, &m_attr)); EXPECT_EQ(SAI_STATUS_SUCCESS, m_meta->create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &m_vr_id, m_switch_id, 0, &m_attr)); } void CreatePort() { SWSS_LOG_ENTER(); std::vector<sai_attribute_t> attrs; sai_attribute_t attr; uint32_t list[1] = { 2 }; attr.id = SAI_PORT_ATTR_HW_LANE_LIST; attr.value.u32list.count = 1; attr.value.u32list.list = list; attrs.push_back(attr); attr.id = SAI_PORT_ATTR_SPEED; attr.value.u32 = 10000; attrs.push_back(attr); EXPECT_EQ(SAI_STATUS_SUCCESS, m_meta->create(SAI_OBJECT_TYPE_PORT, &m_port_id, m_switch_id, (uint32_t)attrs.size(), attrs.data())); } void CreateRif() { SWSS_LOG_ENTER(); std::vector<sai_attribute_t> attrs; sai_attribute_t attr; attr.id = SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID; attr.value.oid = m_vr_id; attrs.push_back(attr); attr.id = SAI_ROUTER_INTERFACE_ATTR_TYPE; attr.value.s32 = SAI_ROUTER_INTERFACE_TYPE_PORT; attrs.push_back(attr); attr.id = SAI_ROUTER_INTERFACE_ATTR_PORT_ID; attr.value.oid = m_port_id; attrs.push_back(attr); EXPECT_EQ(SAI_STATUS_SUCCESS, m_meta->create(SAI_OBJECT_TYPE_ROUTER_INTERFACE, &m_rif_id, m_switch_id, (uint32_t)attrs.size(), attrs.data())); } sai_fdb_entry_t GenFdbEntry() { SWSS_LOG_ENTER(); m_attrs.clear(); sai_fdb_entry_t fdb_entry; memset(&fdb_entry, 0, sizeof(fdb_entry)); fdb_entry.switch_id = m_switch_id; fdb_entry.bv_id = m_vlan_id; m_attr.id = SAI_FDB_ENTRY_ATTR_TYPE; m_attr.value.s32 = SAI_FDB_ENTRY_TYPE_STATIC; m_attrs.push_back(m_attr); return fdb_entry; } sai_mcast_fdb_entry_t GenMcastFdbEntry() { SWSS_LOG_ENTER(); m_attrs.clear(); sai_object_id_t l2mc_group_id = 0; m_meta->create(SAI_OBJECT_TYPE_L2MC_GROUP, &l2mc_group_id, m_switch_id, 0, 0); sai_mcast_fdb_entry_t mcast_fdb_entry; memset(&mcast_fdb_entry, 0, sizeof(mcast_fdb_entry)); mcast_fdb_entry.bv_id = m_vlan_id; mcast_fdb_entry.switch_id = m_switch_id; m_attr.id = SAI_MCAST_FDB_ENTRY_ATTR_GROUP_ID; m_attr.value.oid = l2mc_group_id; m_attrs.push_back(m_attr); m_attr.id = SAI_MCAST_FDB_ENTRY_ATTR_PACKET_ACTION; m_attr.value.s32 = SAI_PACKET_ACTION_FORWARD; m_attrs.push_back(m_attr); return mcast_fdb_entry; } sai_neighbor_entry_t GenNeighEntry() { SWSS_LOG_ENTER(); CreatePort(); CreateRif(); sai_neighbor_entry_t neigh_entry; memset(&neigh_entry, 0, sizeof(neigh_entry)); neigh_entry.switch_id = m_switch_id; neigh_entry.ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; inet_pton(AF_INET, std::string("1.1.1.1").c_str(), &neigh_entry.ip_address.addr.ip4); neigh_entry.rif_id = m_rif_id; m_attrs.clear(); sai_mac_t mac = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; m_attr.id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; memcpy(m_attr.value.mac, mac, 6); m_attrs.push_back(m_attr); m_attr.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; m_attr.value.s32 = SAI_PACKET_ACTION_FORWARD; m_attrs.push_back(m_attr); return neigh_entry; } sai_route_entry_t GenRouteEntry() { SWSS_LOG_ENTER(); m_attrs.clear(); sai_route_entry_t route_entry; memset(&route_entry, 0, sizeof(route_entry)); route_entry.switch_id = m_switch_id; route_entry.vr_id = m_vr_id; route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4; inet_pton(AF_INET, std::string("255.255.255.255").c_str(), &route_entry.destination.mask.ip4); inet_pton(AF_INET, std::string("1.1.1.1").c_str(), &route_entry.destination.addr.ip4); return route_entry; } sai_l2mc_entry_t GenL2MCEntry() { SWSS_LOG_ENTER(); m_attrs.clear(); sai_l2mc_entry_t l2mc_entry; memset(&l2mc_entry, 0, sizeof(l2mc_entry)); l2mc_entry.bv_id = m_vlan_id; l2mc_entry.switch_id = m_switch_id; m_attr.id = SAI_L2MC_ENTRY_ATTR_PACKET_ACTION; m_attr.value.s32 = SAI_PACKET_ACTION_FORWARD; m_attrs.push_back(m_attr); return l2mc_entry; } sai_ipmc_entry_t GenIPMCEntry() { SWSS_LOG_ENTER(); m_attrs.clear(); sai_object_id_t rpfGroupId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m_meta->create(SAI_OBJECT_TYPE_RPF_GROUP, &rpfGroupId, m_switch_id, 0, m_attrs.data())); sai_ipmc_entry_t ipmc_entry; memset(&ipmc_entry, 0, sizeof(ipmc_entry)); ipmc_entry.switch_id = m_switch_id; ipmc_entry.vr_id = m_vr_id; m_attr.id = SAI_IPMC_ENTRY_ATTR_PACKET_ACTION; m_attr.value.s32 = SAI_PACKET_ACTION_FORWARD; m_attrs.push_back(m_attr); m_attr.id = SAI_IPMC_ENTRY_ATTR_RPF_GROUP_ID; m_attr.value.oid = rpfGroupId; m_attrs.push_back(m_attr); return ipmc_entry; } sai_nat_entry_t GenNATEntry() { SWSS_LOG_ENTER(); m_attrs.clear(); sai_nat_entry_t nat_entry; memset(&nat_entry, 0, sizeof(nat_entry)); nat_entry.switch_id = m_switch_id; nat_entry.vr_id = m_vr_id; m_attr.id = SAI_NAT_ENTRY_ATTR_NAT_TYPE; m_attr.value.s32 = SAI_NAT_TYPE_NONE; m_attrs.push_back(m_attr); return nat_entry; } sai_my_sid_entry_t GenMySIDEntry() { SWSS_LOG_ENTER(); m_attrs.clear(); sai_my_sid_entry_t my_sid_entry; memset(&my_sid_entry, 0, sizeof(my_sid_entry)); my_sid_entry.switch_id = m_switch_id; my_sid_entry.vr_id = m_vr_id; m_attr.id = SAI_MY_SID_ENTRY_ATTR_ENDPOINT_BEHAVIOR; m_attr.value.s32 = SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_E; m_attrs.push_back(m_attr); return my_sid_entry; } void SetUp() override { m_meta = new Meta(std::make_shared<MetaTestSaiInterface>()); SetupMeta(); } void TearDown() override { m_attrs.clear(); } }; TEST_F(MetaTest, create_duplicate_fdb_entry) { sai_fdb_entry_t fdb_entry = GenFdbEntry(); sai_status_t status = m_meta->create(&fdb_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_SUCCESS, status); status = m_meta->create(&fdb_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_ALREADY_EXISTS, status); } TEST_F(MetaTest, remove_nonexistent_fdb_entry) { sai_fdb_entry_t fdb_entry = GenFdbEntry(); sai_status_t status = m_meta->remove(&fdb_entry); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, create_duplicate_mcast_fdb_entry) { sai_mcast_fdb_entry_t mcast_fdb_entry = GenMcastFdbEntry(); sai_status_t status = m_meta->create(&mcast_fdb_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_SUCCESS, status); status = m_meta->create(&mcast_fdb_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_ALREADY_EXISTS, status); } TEST_F(MetaTest, create_mcast_fdb_entry_with_nonexistent_vlan) { sai_status_t status = m_meta->remove(SAI_OBJECT_TYPE_VLAN, m_vlan_id); EXPECT_EQ(SAI_STATUS_SUCCESS, status); sai_mcast_fdb_entry_t mcast_fdb_entry = GenMcastFdbEntry(); status = m_meta->create(&mcast_fdb_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, remove_nonexistent_mcast_fdb_entry) { sai_mcast_fdb_entry_t mcast_fdb_entry = GenMcastFdbEntry(); sai_status_t status = m_meta->remove(&mcast_fdb_entry); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, create_duplicate_neigh_entry) { sai_neighbor_entry_t neigh_entry = GenNeighEntry(); sai_status_t status = m_meta->create(&neigh_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_SUCCESS, status); status = m_meta->create(&neigh_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_ALREADY_EXISTS, status); } TEST_F(MetaTest, create_neigh_entry_with_nonexistent_rif) { // GenNeighEntry() is responsible for creating the RIF, so we must call it before trying to remove the RIF sai_neighbor_entry_t neigh_entry = GenNeighEntry(); sai_status_t status = m_meta->remove(SAI_OBJECT_TYPE_ROUTER_INTERFACE, m_rif_id); EXPECT_EQ(SAI_STATUS_SUCCESS, status); status = m_meta->create(&neigh_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, remove_nonexistent_neigh_entry) { sai_neighbor_entry_t neigh_entry = GenNeighEntry(); sai_status_t status = m_meta->remove(&neigh_entry); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, create_duplicate_route_entry) { sai_route_entry_t route_entry = GenRouteEntry(); sai_status_t status = m_meta->create(&route_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_SUCCESS, status); status = m_meta->create(&route_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_ALREADY_EXISTS, status); } TEST_F(MetaTest, remove_nonexistent_route_entry) { sai_route_entry_t route_entry = GenRouteEntry(); sai_status_t status = m_meta->remove(&route_entry); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, create_duplicate_l2mc_entry) { sai_l2mc_entry_t l2mc_entry = GenL2MCEntry(); sai_status_t status = m_meta->create(&l2mc_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_SUCCESS, status); status = m_meta->create(&l2mc_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_ALREADY_EXISTS, status); } TEST_F(MetaTest, create_l2mc_entry_with_nonexistent_vlan) { sai_status_t status = m_meta->remove(SAI_OBJECT_TYPE_VLAN, m_vlan_id); EXPECT_EQ(SAI_STATUS_SUCCESS, status); sai_l2mc_entry_t l2mc_entry = GenL2MCEntry(); status = m_meta->create(&l2mc_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, remove_nonexistent_l2mc_entry) { sai_l2mc_entry_t l2mc_entry = GenL2MCEntry(); sai_status_t status = m_meta->remove(&l2mc_entry); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, create_duplicate_ipmc_entry) { sai_ipmc_entry_t ipmc_entry = GenIPMCEntry(); sai_status_t status = m_meta->create(&ipmc_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_SUCCESS, status); status = m_meta->create(&ipmc_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_ALREADY_EXISTS, status); } TEST_F(MetaTest, create_ipmc_entry_with_nonexistent_vr) { sai_status_t status = m_meta->remove(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, m_vr_id); EXPECT_EQ(SAI_STATUS_SUCCESS, status); sai_ipmc_entry_t ipmc_entry = GenIPMCEntry(); status = m_meta->create(&ipmc_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, remove_nonexistent_ipmc_entry) { sai_ipmc_entry_t ipmc_entry = GenIPMCEntry(); sai_status_t status = m_meta->remove(&ipmc_entry); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, create_duplicate_nat_entry) { sai_nat_entry_t nat_entry = GenNATEntry(); sai_status_t status = m_meta->create(&nat_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_SUCCESS, status); status = m_meta->create(&nat_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_ALREADY_EXISTS, status); } TEST_F(MetaTest, create_nat_entry_with_nonexistent_vr) { sai_status_t status = m_meta->remove(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, m_vr_id); EXPECT_EQ(SAI_STATUS_SUCCESS, status); sai_nat_entry_t nat_entry = GenNATEntry(); status = m_meta->create(&nat_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, remove_nonexistent_nat_entry) { sai_nat_entry_t nat_entry = GenNATEntry(); sai_status_t status = m_meta->remove(&nat_entry); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, create_duplicate_my_sid_entry) { sai_my_sid_entry_t my_sid_entry = GenMySIDEntry(); sai_status_t status = m_meta->create(&my_sid_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_SUCCESS, status); status = m_meta->create(&my_sid_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_ALREADY_EXISTS, status); } TEST_F(MetaTest, create_my_sid_entry_with_nonexistent_vr) { sai_status_t status = m_meta->remove(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, m_vr_id); EXPECT_EQ(SAI_STATUS_SUCCESS, status); sai_my_sid_entry_t my_sid_entry = GenMySIDEntry(); status = m_meta->create(&my_sid_entry, (uint32_t)m_attrs.size(), m_attrs.data()); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, remove_nonexistent_my_sid_entry) { sai_my_sid_entry_t my_sid_entry = GenMySIDEntry(); sai_status_t status = m_meta->remove(&my_sid_entry); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST_F(MetaTest, remove_nonexistent_generic_object) { sai_attribute_t attr; sai_object_id_t vlan_id; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 99; sai_status_t status = m_meta->create(SAI_OBJECT_TYPE_VLAN, &vlan_id, m_switch_id, 1, &attr); EXPECT_EQ(SAI_STATUS_SUCCESS, status); status = m_meta->remove(SAI_OBJECT_TYPE_VLAN, vlan_id); EXPECT_EQ(SAI_STATUS_SUCCESS, status); status = m_meta->remove(SAI_OBJECT_TYPE_VLAN, vlan_id); EXPECT_EQ(SAI_STATUS_ITEM_NOT_FOUND, status); } TEST(Meta, initialize) { Meta m(std::make_shared<DummySaiInterface>()); EXPECT_EQ(SAI_STATUS_SUCCESS, m.apiInitialize(0, 0)); } TEST(Meta, uninitialize) { Meta m(std::make_shared<DummySaiInterface>()); EXPECT_EQ(SAI_STATUS_SUCCESS, m.apiUninitialize()); } TEST(Meta, quad_mcast_fdb_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t vlanId = 0; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 2; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); sai_object_id_t l2mcGroupId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_L2MC_GROUP, &l2mcGroupId, switchId, 0, 0)); sai_attribute_t attrs[2]; attrs[0].id = SAI_MCAST_FDB_ENTRY_ATTR_GROUP_ID; attrs[0].value.oid = l2mcGroupId; attrs[1].id = SAI_MCAST_FDB_ENTRY_ATTR_PACKET_ACTION; attrs[1].value.s32 = SAI_PACKET_ACTION_FORWARD; sai_mcast_fdb_entry_t e; memset(&e, 0, sizeof(e)); e.bv_id = vlanId; e.switch_id = switchId; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&e, 2, attrs)); attr.id = SAI_MCAST_FDB_ENTRY_ATTR_PACKET_ACTION; attr.value.s32 = SAI_PACKET_ACTION_DROP; EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&e, &attr)); attr.id = SAI_MCAST_FDB_ENTRY_ATTR_GROUP_ID; EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&e, 1, &attr)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&e)); } TEST(Meta, quad_l2mc_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t vlanId = 0; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 2; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); sai_object_id_t l2mcGroupId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_L2MC_GROUP, &l2mcGroupId, switchId, 0, 0)); attr.id = SAI_L2MC_ENTRY_ATTR_PACKET_ACTION; attr.value.s32 = SAI_PACKET_ACTION_FORWARD; sai_l2mc_entry_t e; memset(&e, 0, sizeof(e)); e.bv_id = vlanId; e.switch_id = switchId; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&e, 1, &attr)); attr.id = SAI_L2MC_ENTRY_ATTR_PACKET_ACTION; attr.value.s32 = SAI_PACKET_ACTION_DROP; EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&e, &attr)); attr.id = SAI_L2MC_ENTRY_ATTR_PACKET_ACTION; EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&e, 1, &attr)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&e)); } TEST(Meta, quad_inseg_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t vlanId = 0; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 2; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); attr.id = SAI_L2MC_ENTRY_ATTR_PACKET_ACTION; attr.value.s32 = SAI_PACKET_ACTION_FORWARD; sai_inseg_entry_t e; memset(&e, 0, sizeof(e)); e.switch_id = switchId; e.label = 1; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&e, 1, &attr)); attr.id = SAI_INSEG_ENTRY_ATTR_PACKET_ACTION; attr.value.s32 = SAI_PACKET_ACTION_DROP; EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&e, &attr)); attr.id = SAI_INSEG_ENTRY_ATTR_PACKET_ACTION; EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&e, 1, &attr)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&e)); } TEST(Meta, quad_nat_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t vrId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &vrId, switchId, 0, &attr)); attr.id = SAI_NAT_ENTRY_ATTR_NAT_TYPE; attr.value.s32 = SAI_NAT_TYPE_NONE; sai_nat_entry_t e; memset(&e, 0, sizeof(e)); e.switch_id = switchId; e.vr_id = vrId; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&e, 1, &attr)); attr.id = SAI_NAT_ENTRY_ATTR_NAT_TYPE; attr.value.s32 = SAI_NAT_TYPE_NONE; EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&e, &attr)); attr.id = SAI_NAT_ENTRY_ATTR_NAT_TYPE; EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&e, 1, &attr)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&e)); } TEST(Meta, quad_impc_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t rpfGroupId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_RPF_GROUP, &rpfGroupId, switchId, 0, &attr)); sai_object_id_t vrId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &vrId, switchId, 0, &attr)); sai_attribute_t attrs[2]; attrs[0].id = SAI_IPMC_ENTRY_ATTR_PACKET_ACTION; attrs[0].value.s32 = SAI_PACKET_ACTION_FORWARD; attrs[1].id = SAI_IPMC_ENTRY_ATTR_RPF_GROUP_ID; attrs[1].value.oid = rpfGroupId; sai_ipmc_entry_t e; memset(&e, 0, sizeof(e)); e.switch_id = switchId; e.vr_id = vrId; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&e, 2, attrs)); attr.id = SAI_IPMC_ENTRY_ATTR_PACKET_ACTION; attr.value.s32 = SAI_PACKET_ACTION_DROP; EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&e, &attr)); attr.id = SAI_IPMC_ENTRY_ATTR_RPF_GROUP_ID; EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&e, 1, &attr)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&e)); } TEST(Meta, flushFdbEntries) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.flushFdbEntries(switchId, 0, 0)); EXPECT_NE(SAI_STATUS_SUCCESS, m.flushFdbEntries(switchId, 10000, 0)); EXPECT_NE(SAI_STATUS_SUCCESS, m.flushFdbEntries(switchId, 1, 0)); EXPECT_NE(SAI_STATUS_SUCCESS, m.flushFdbEntries(0, 0, 0)); attr.id = 10000; EXPECT_NE(SAI_STATUS_SUCCESS, m.flushFdbEntries(switchId, 1, &attr)); sai_attribute_t attrs[2]; attrs[0].id = SAI_FDB_FLUSH_ATTR_ENTRY_TYPE; attrs[0].value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_ALL; attrs[1].id = SAI_FDB_FLUSH_ATTR_ENTRY_TYPE; attrs[1].value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_ALL; EXPECT_NE(SAI_STATUS_SUCCESS, m.flushFdbEntries(switchId, 2, attrs)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.flushFdbEntries(switchId, 1, attrs)); EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.flushFdbEntries(0x21000000000001, 1, attrs)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.flushFdbEntries(0x21000000000000, 1, attrs)); // SAI_FDB_FLUSH_ENTRY_TYPE attribute out of range attrs[0].value.s32 = 1000; EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.flushFdbEntries(switchId, 1, attrs)); // test flush with vlan sai_object_id_t vlanId = 0; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 2; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); attrs[0].id = SAI_FDB_FLUSH_ATTR_ENTRY_TYPE; attrs[0].value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_ALL; attrs[1].id = SAI_FDB_FLUSH_ATTR_BV_ID; attrs[1].value.oid = vlanId; EXPECT_EQ(SAI_STATUS_SUCCESS, m.flushFdbEntries(switchId, 2, attrs)); // test dynamic flush attrs[0].value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_DYNAMIC; EXPECT_EQ(SAI_STATUS_SUCCESS, m.flushFdbEntries(switchId, 2, attrs)); // test static flush attrs[0].value.s32 = SAI_FDB_FLUSH_ENTRY_TYPE_STATIC; EXPECT_EQ(SAI_STATUS_SUCCESS, m.flushFdbEntries(switchId, 2, attrs)); } TEST(Meta, meta_warm_boot_notify) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); m.meta_warm_boot_notify(); } TEST(Meta, meta_init_db) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); m.meta_init_db(); } TEST(Meta, dump) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); m.dump(); } TEST(Meta, objectTypeGetAvailability) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); EXPECT_NE(SAI_STATUS_SUCCESS, m.objectTypeGetAvailability(0, SAI_OBJECT_TYPE_NULL, 0, nullptr, nullptr)); EXPECT_NE(SAI_STATUS_SUCCESS, m.objectTypeGetAvailability(switchId, SAI_OBJECT_TYPE_NULL, 0, nullptr, nullptr)); attr.id = SAI_DEBUG_COUNTER_ATTR_TYPE; attr.value.s32 = SAI_DEBUG_COUNTER_TYPE_PORT_IN_DROP_REASONS; uint64_t count; EXPECT_EQ(SAI_STATUS_SUCCESS, m.objectTypeGetAvailability(switchId, SAI_OBJECT_TYPE_DEBUG_COUNTER, 1, &attr, &count)); // invalid attribute attr.id = 100000; EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.objectTypeGetAvailability(switchId, SAI_OBJECT_TYPE_DEBUG_COUNTER, 1, &attr, &count)); // defined multiple times sai_attribute_t attrs[2]; attrs[0].id = SAI_DEBUG_COUNTER_ATTR_TYPE; attrs[0].value.s32 = SAI_DEBUG_COUNTER_TYPE_PORT_IN_DROP_REASONS; attrs[1].id = SAI_DEBUG_COUNTER_ATTR_TYPE; attrs[1].value.s32 = SAI_DEBUG_COUNTER_TYPE_PORT_IN_DROP_REASONS; EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.objectTypeGetAvailability(switchId, SAI_OBJECT_TYPE_DEBUG_COUNTER, 2, attrs, &count)); // enum not on allowed list attr.id = SAI_DEBUG_COUNTER_ATTR_TYPE; attr.value.s32 = 10000; EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.objectTypeGetAvailability(switchId, SAI_OBJECT_TYPE_DEBUG_COUNTER, 1, &attr, &count)); // not resource type attr.id = SAI_DEBUG_COUNTER_ATTR_BIND_METHOD; attr.value.s32 = 0; EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.objectTypeGetAvailability(switchId, SAI_OBJECT_TYPE_DEBUG_COUNTER, 1, &attr, &count)); } TEST(Meta, queryAttributeCapability) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_attr_capability_t cap; EXPECT_EQ(SAI_STATUS_SUCCESS, m.queryAttributeCapability(switchId, SAI_OBJECT_TYPE_ACL_ENTRY, SAI_ACL_ENTRY_ATTR_TABLE_ID, &cap)); EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.queryAttributeCapability(switchId, SAI_OBJECT_TYPE_ACL_ENTRY, 100000, &cap)); } TEST(Meta, queryAttributeEnumValuesCapability) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_s32_list_t list; int32_t vals[2]; list.count = 2; list.list = vals; vals[0] = 0; vals[1] = 100000; EXPECT_EQ(SAI_STATUS_SUCCESS, m.queryAttributeEnumValuesCapability(switchId, SAI_OBJECT_TYPE_SWITCH, SAI_SWITCH_ATTR_SWITCHING_MODE, &list)); // set count without list; list.list = nullptr; EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.queryAttributeEnumValuesCapability(switchId, SAI_OBJECT_TYPE_SWITCH, SAI_SWITCH_ATTR_SWITCHING_MODE, &list)); // non enum attribute EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.queryAttributeEnumValuesCapability(switchId, SAI_OBJECT_TYPE_SWITCH, SAI_SWITCH_ATTR_BCAST_CPU_FLOOD_ENABLE, &list)); // invalid attribute EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.queryAttributeEnumValuesCapability(switchId, SAI_OBJECT_TYPE_SWITCH, 10000, &list)); } TEST(Meta, queryStatsCapability) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_stat_capability_list_t queue_stats_capability; sai_stat_capability_t stat_initializer; stat_initializer.stat_enum = 0; stat_initializer.stat_modes = 0; std::vector<sai_stat_capability_t> qstat_cap_list(20, stat_initializer); queue_stats_capability.count = 15; queue_stats_capability.list = qstat_cap_list.data(); EXPECT_EQ(SAI_STATUS_SUCCESS, m.queryStatsCapability(switchId, SAI_OBJECT_TYPE_QUEUE, &queue_stats_capability)); queue_stats_capability.list = nullptr; EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.queryStatsCapability(switchId, SAI_OBJECT_TYPE_QUEUE, &queue_stats_capability)); } TEST(Meta, meta_validate_stats) { MockMeta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t vlanId = 0; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 2; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); sai_stat_id_t counter_ids[2]; counter_ids[0] = SAI_VLAN_STAT_IN_OCTETS; counter_ids[1] = SAI_VLAN_STAT_IN_PACKETS; uint64_t counters[2]; m.meta_unittests_enable(true); EXPECT_EQ(SAI_STATUS_SUCCESS, m.call_meta_validate_stats(SAI_OBJECT_TYPE_VLAN, vlanId, 2, counter_ids, counters, SAI_STATS_MODE_READ)); // invalid mode #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.call_meta_validate_stats(SAI_OBJECT_TYPE_VLAN, vlanId, 2, counter_ids, counters, (sai_stats_mode_t)7)); #pragma GCC diagnostic pop // invalid counter counter_ids[0] = 10000; EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.call_meta_validate_stats(SAI_OBJECT_TYPE_VLAN, vlanId, 2, counter_ids, counters, SAI_STATS_MODE_READ)); // object with no stats sai_object_id_t vrId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &vrId, switchId, 0, &attr)); EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.call_meta_validate_stats(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, vrId, 2, counter_ids, counters, SAI_STATS_MODE_READ)); } TEST(Meta, quad_generic_programmable_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); std::string table_name = "test_table"; std::string json_value = "test_json"; sai_attribute_t attrs[2]; attrs[0].id = SAI_GENERIC_PROGRAMMABLE_ATTR_OBJECT_NAME; attrs[0].value.s8list.count = (uint32_t)table_name.size(); attrs[0].value.s8list.list = (int8_t *)const_cast<char *>(table_name.c_str()); attrs[1].id = SAI_GENERIC_PROGRAMMABLE_ATTR_ENTRY; attrs[1].value.s8list.count = (uint32_t)json_value.size(); attrs[1].value.s8list.list = (int8_t *)const_cast<char *>(json_value.c_str()); sai_object_id_t objId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_GENERIC_PROGRAMMABLE, &objId, switchId, 2, attrs)); attr.id = SAI_GENERIC_PROGRAMMABLE_ATTR_ENTRY; attr.value.s8list.count = (uint32_t)json_value.size(); attr.value.s8list.list = (int8_t *)const_cast<char *>(json_value.c_str()); EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(SAI_OBJECT_TYPE_GENERIC_PROGRAMMABLE, objId, &attr)); attr.id = SAI_GENERIC_PROGRAMMABLE_ATTR_ENTRY; EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(SAI_OBJECT_TYPE_GENERIC_PROGRAMMABLE, objId, 1, &attr)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(SAI_OBJECT_TYPE_GENERIC_PROGRAMMABLE, objId)); } TEST(Meta, quad_my_sid_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t vlanId = 0; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 2; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); sai_object_id_t vrId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &vrId, switchId, 0, &attr)); sai_attribute_t attrs[2]; attrs[0].id = SAI_MY_SID_ENTRY_ATTR_ENDPOINT_BEHAVIOR; attrs[0].value.s32 = SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_E; sai_my_sid_entry_t e; memset(&e, 0, sizeof(e)); e.switch_id = switchId; e.vr_id = vrId; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(&e, 1, attrs)); attr.id = SAI_MY_SID_ENTRY_ATTR_ENDPOINT_BEHAVIOR; attr.value.s32 = SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_X; EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(&e, &attr)); attr.id = SAI_MCAST_FDB_ENTRY_ATTR_GROUP_ID; EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(&e, 1, &attr)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(&e)); } TEST(Meta, quad_bulk_route_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t vlanId = 0; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 2; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); sai_object_id_t vrId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &vrId, switchId, 0, &attr)); // create sai_route_entry_t e[2]; memset(e, 0, sizeof(e)); e[0].switch_id = switchId; e[1].switch_id = switchId; e[0].vr_id = vrId; e[1].vr_id = vrId; e[0].destination.addr.ip4 = 1; e[1].destination.addr.ip4 = 2; uint32_t attr_count[2]; attr_count[0] = 0; attr_count[1] = 0; sai_attribute_t list1[2]; sai_attribute_t list2[2]; std::vector<const sai_attribute_t*> alist; alist.push_back(list1); alist.push_back(list2); const sai_attribute_t **attr_list = alist.data(); sai_status_t statuses[2]; EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(2, e, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); // set sai_attribute_t setlist[2]; setlist[0].id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION; setlist[0].value.s32 = SAI_PACKET_ACTION_DROP; setlist[1].id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION; setlist[1].value.s32 = SAI_PACKET_ACTION_DROP; EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkSet(2, e, setlist, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); // remove EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(2, e, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); } sai_object_id_t create_port( _In_ Meta &m, _In_ sai_object_id_t switch_id) { SWSS_LOG_ENTER(); sai_object_id_t port; static uint32_t id = 1; id++; sai_attribute_t attrs[9] = { }; uint32_t list[1] = { id }; attrs[0].id = SAI_PORT_ATTR_HW_LANE_LIST; attrs[0].value.u32list.count = 1; attrs[0].value.u32list.list = list; attrs[1].id = SAI_PORT_ATTR_SPEED; attrs[1].value.u32 = 10000; auto status = m.create(SAI_OBJECT_TYPE_PORT, &port, switch_id, 2, attrs); EXPECT_EQ(SAI_STATUS_SUCCESS, status); return port; } sai_object_id_t create_rif( _In_ Meta &m, _In_ sai_object_id_t switch_id, _In_ sai_object_id_t port_id, _In_ sai_object_id_t vr_id) { SWSS_LOG_ENTER(); sai_object_id_t rif; sai_attribute_t attrs[9] = { }; attrs[0].id = SAI_ROUTER_INTERFACE_ATTR_VIRTUAL_ROUTER_ID; attrs[0].value.oid = vr_id; attrs[1].id = SAI_ROUTER_INTERFACE_ATTR_TYPE; attrs[1].value.s32 = SAI_ROUTER_INTERFACE_TYPE_PORT; attrs[2].id = SAI_ROUTER_INTERFACE_ATTR_PORT_ID; attrs[2].value.oid = port_id; auto status = m.create(SAI_OBJECT_TYPE_ROUTER_INTERFACE, &rif, switch_id, 3, attrs); EXPECT_EQ(SAI_STATUS_SUCCESS, status); return rif; } TEST(Meta, quad_bulk_neighbor_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t vlanId = 0; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 2; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); sai_object_id_t vrId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &vrId, switchId, 0, &attr)); sai_object_id_t portId = create_port(m, switchId); sai_object_id_t rifId = create_rif(m, switchId, portId, vrId); // create sai_neighbor_entry_t e[2]; memset(e, 0, sizeof(e)); e[0].switch_id = switchId; e[1].switch_id = switchId; e[0].ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; e[0].ip_address.addr.ip4 = htonl(0x0a00000e); e[1].ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; e[1].ip_address.addr.ip4 = htonl(0x0a00000f); e[0].rif_id = rifId; e[1].rif_id = rifId; uint32_t attr_count[2]; attr_count[0] = 2; attr_count[1] = 2; sai_attribute_t list1[2]; sai_attribute_t list2[2]; sai_mac_t mac1 = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; sai_mac_t mac2 = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; list1[0].id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; memcpy(list1[0].value.mac, mac1, 6); list1[1].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; list1[1].value.s32 = SAI_PACKET_ACTION_FORWARD; list2[0].id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; memcpy(list2[0].value.mac, mac2, 6); list2[1].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; list2[1].value.s32 = SAI_PACKET_ACTION_FORWARD; std::vector<const sai_attribute_t*> alist; alist.push_back(list1); alist.push_back(list2); const sai_attribute_t **attr_list = alist.data(); sai_status_t statuses[2]; EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(2, e, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); // set sai_attribute_t setlist[2]; setlist[0].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; setlist[0].value.s32 = SAI_PACKET_ACTION_FORWARD; setlist[1].id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; setlist[1].value.s32 = SAI_PACKET_ACTION_FORWARD; EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkSet(2, e, setlist, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); // remove EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(2, e, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); } TEST(Meta, quad_bulk_nat_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t vlanId = 0; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 2; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); sai_object_id_t vrId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &vrId, switchId, 0, &attr)); // create sai_nat_entry_t e[2]; memset(e, 0, sizeof(e)); e[0].switch_id = switchId; e[1].switch_id = switchId; e[0].vr_id = vrId; e[1].vr_id = vrId; e[0].nat_type = SAI_NAT_TYPE_SOURCE_NAT; e[1].nat_type = SAI_NAT_TYPE_DESTINATION_NAT; uint32_t attr_count[2]; attr_count[0] = 0; attr_count[1] = 0; sai_attribute_t list1[2]; sai_attribute_t list2[2]; std::vector<const sai_attribute_t*> alist; alist.push_back(list1); alist.push_back(list2); const sai_attribute_t **attr_list = alist.data(); sai_status_t statuses[2]; EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(2, e, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); // set sai_attribute_t setlist[2]; setlist[0].id = SAI_NAT_ENTRY_ATTR_NAT_TYPE; setlist[0].value.s32 = SAI_NAT_TYPE_NONE; setlist[1].id = SAI_NAT_ENTRY_ATTR_NAT_TYPE; setlist[1].value.s32 = SAI_NAT_TYPE_NONE; EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkSet(2, e, setlist, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); // remove EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(2, e, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); } TEST(Meta, getStats) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_stat_id_t counter_ids[2]; counter_ids[0] = SAI_SWITCH_STAT_IN_CONFIGURED_DROP_REASONS_0_DROPPED_PKTS; counter_ids[1] = SAI_SWITCH_STAT_IN_CONFIGURED_DROP_REASONS_1_DROPPED_PKTS; uint64_t counters[2]; EXPECT_EQ(SAI_STATUS_SUCCESS, m.getStats(SAI_OBJECT_TYPE_SWITCH, switchId, 2, counter_ids, counters)); } TEST(Meta, getStatsExt) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_stat_id_t counter_ids[2]; counter_ids[0] = SAI_SWITCH_STAT_IN_CONFIGURED_DROP_REASONS_0_DROPPED_PKTS; counter_ids[1] = SAI_SWITCH_STAT_IN_CONFIGURED_DROP_REASONS_1_DROPPED_PKTS; uint64_t counters[2]; EXPECT_EQ(SAI_STATUS_SUCCESS, m.getStatsExt(SAI_OBJECT_TYPE_SWITCH, switchId, 2, counter_ids, SAI_STATS_MODE_READ, counters)); } TEST(Meta, clearStats) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_stat_id_t counter_ids[2]; counter_ids[0] = SAI_SWITCH_STAT_IN_CONFIGURED_DROP_REASONS_0_DROPPED_PKTS; counter_ids[1] = SAI_SWITCH_STAT_IN_CONFIGURED_DROP_REASONS_1_DROPPED_PKTS; EXPECT_EQ(SAI_STATUS_SUCCESS, m.clearStats(SAI_OBJECT_TYPE_SWITCH, switchId, 2, counter_ids)); } TEST(Meta, quad_bulk_my_sid_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t vlanId = 0; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 2; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); sai_object_id_t vrId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &vrId, switchId, 0, &attr)); // create sai_my_sid_entry_t e[2]; memset(e, 0, sizeof(e)); e[0].switch_id = switchId; e[1].switch_id = switchId; e[0].vr_id = vrId; e[1].vr_id = vrId; e[0].locator_block_len = 1; e[1].locator_block_len = 2; uint32_t attr_count[2]; attr_count[0] = 1; attr_count[1] = 1; sai_attribute_t list1[2]; sai_attribute_t list2[2]; list1[0].id = SAI_MY_SID_ENTRY_ATTR_ENDPOINT_BEHAVIOR; list1[0].value.s32 = SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_E; list2[0].id = SAI_MY_SID_ENTRY_ATTR_ENDPOINT_BEHAVIOR; list2[0].value.s32 = SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_E; std::vector<const sai_attribute_t*> alist; alist.push_back(list1); alist.push_back(list2); const sai_attribute_t **attr_list = alist.data(); sai_status_t statuses[2]; EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(2, e, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); // set sai_attribute_t setlist[2]; setlist[0].id = SAI_MY_SID_ENTRY_ATTR_ENDPOINT_BEHAVIOR; setlist[0].value.s32 = SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_X; setlist[1].id = SAI_MY_SID_ENTRY_ATTR_ENDPOINT_BEHAVIOR; setlist[1].value.s32 = SAI_MY_SID_ENTRY_ENDPOINT_BEHAVIOR_X; EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkSet(2, e, setlist, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); // remove EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(2, e, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); } TEST(Meta, quad_bulk_inseg_entry) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t vlanId = 0; attr.id = SAI_VLAN_ATTR_VLAN_ID; attr.value.u16 = 2; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VLAN, &vlanId, switchId, 1, &attr)); sai_object_id_t vrId = 0; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_VIRTUAL_ROUTER, &vrId, switchId, 0, &attr)); // create sai_inseg_entry_t e[2]; memset(e, 0, sizeof(e)); e[0].switch_id = switchId; e[1].switch_id = switchId; e[0].label = 1; e[1].label = 2; uint32_t attr_count[2]; attr_count[0] = 1; attr_count[1] = 1; sai_attribute_t list1[2]; sai_attribute_t list2[2]; list1[0].id = SAI_L2MC_ENTRY_ATTR_PACKET_ACTION; list1[0].value.s32 = SAI_PACKET_ACTION_FORWARD; list2[0].id = SAI_L2MC_ENTRY_ATTR_PACKET_ACTION; list2[0].value.s32 = SAI_PACKET_ACTION_FORWARD; std::vector<const sai_attribute_t*> alist; alist.push_back(list1); alist.push_back(list2); const sai_attribute_t **attr_list = alist.data(); sai_status_t statuses[2]; EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkCreate(2, e, attr_count, attr_list, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); // set sai_attribute_t setlist[2]; setlist[0].id = SAI_L2MC_ENTRY_ATTR_PACKET_ACTION; setlist[0].value.s32 = SAI_PACKET_ACTION_DROP; setlist[1].id = SAI_L2MC_ENTRY_ATTR_PACKET_ACTION; setlist[1].value.s32 = SAI_PACKET_ACTION_DROP; EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkSet(2, e, setlist, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); // remove EXPECT_EQ(SAI_STATUS_SUCCESS, m.bulkRemove(2, e, SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses)); } TEST(Meta, logSet) { Meta m(std::make_shared<MetaTestSaiInterface>()); EXPECT_EQ(SAI_STATUS_SUCCESS, m.logSet(SAI_API_SWITCH, SAI_LOG_LEVEL_NOTICE)); #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.logSet((sai_api_t)1000, SAI_LOG_LEVEL_NOTICE)); EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, m.logSet(SAI_API_SWITCH, (sai_log_level_t)1000)); #pragma GCC diagnostic pop } TEST(Meta, meta_sai_on_switch_shutdown_request) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); m.meta_sai_on_switch_shutdown_request(0); m.meta_sai_on_switch_shutdown_request(switchId); m.meta_sai_on_switch_shutdown_request(0x21000000000001); } TEST(Meta, meta_sai_on_switch_state_change) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); m.meta_sai_on_switch_state_change(0, SAI_SWITCH_OPER_STATUS_UP); m.meta_sai_on_switch_state_change(switchId, SAI_SWITCH_OPER_STATUS_UP); m.meta_sai_on_switch_state_change(0x21000000000001, SAI_SWITCH_OPER_STATUS_UP); #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" m.meta_sai_on_switch_state_change(0, (sai_switch_oper_status_t)1000); m.meta_sai_on_switch_state_change(switchId, (sai_switch_oper_status_t)1000); m.meta_sai_on_switch_state_change(0x21000000000001, (sai_switch_oper_status_t)1000); #pragma GCC diagnostic pop } TEST(Meta, populate) { Meta m(std::make_shared<MetaTestSaiInterface>()); swss::TableDump dump; dump["SAI_OBJECT_TYPE_ACL_TABLE:oid:0x7000000000626"]["SAI_ACL_TABLE_ATTR_FIELD_ACL_IP_TYPE"] = "true"; dump["SAI_OBJECT_TYPE_ROUTE_ENTRY:{\"dest\":\"10.0.0.0/32\",\"switch_id\":\"oid:0x21000000000000\",\"vr\":\"oid:0x3000000000022\"}"] ["SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID"] = "oid:0x60000000005cf"; dump["SAI_OBJECT_TYPE_VLAN:oid:0x2600000000002f"]["SAI_VLAN_ATTR_VLAN_ID"] = "2"; dump["SAI_OBJECT_TYPE_SWITCH:oid:0x21000000000000"]["SAI_SWITCH_ATTR_PORT_LIST"] = "2:oid:0x1000000000002,oid:0x1000000000003"; dump["SAI_OBJECT_TYPE_ACL_ENTRY:oid:0x8000000000635"]["SAI_ACL_ENTRY_ATTR_FIELD_SRC_PORT"] = "oid:0x1000000000003"; dump["SAI_OBJECT_TYPE_ACL_ENTRY:oid:0x8000000000635"]["SAI_ACL_ENTRY_ATTR_FIELD_OUT_PORTS"] = "2:oid:0x1000000000002,oid:0x1000000000003"; dump["SAI_OBJECT_TYPE_ACL_ENTRY:oid:0x8000000000635"]["SAI_ACL_ENTRY_ATTR_ACTION_REDIRECT"] = "oid:0x1000000000003"; dump["SAI_OBJECT_TYPE_ACL_ENTRY:oid:0x8000000000635"]["SAI_ACL_ENTRY_ATTR_ACTION_REDIRECT_LIST"] = "2:oid:0x1000000000002,oid:0x1000000000003"; m.populate(dump); } TEST(Meta, bulkGetClearStats) { Meta m(std::make_shared<MetaTestSaiInterface>()); EXPECT_EQ(SAI_STATUS_NOT_IMPLEMENTED, m.bulkGetStats(SAI_NULL_OBJECT_ID, SAI_OBJECT_TYPE_PORT, 0, nullptr, 0, nullptr, SAI_STATS_MODE_BULK_READ, nullptr, nullptr)); EXPECT_EQ(SAI_STATUS_NOT_IMPLEMENTED, m.bulkClearStats(SAI_NULL_OBJECT_ID, SAI_OBJECT_TYPE_PORT, 0, nullptr, 0, nullptr, SAI_STATS_MODE_BULK_CLEAR, nullptr)); } TEST(Meta, quad_ars) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t ars; std::vector<sai_attribute_t> attrs; attr.id = SAI_ARS_ATTR_MODE; attr.value.u32 = SAI_ARS_MODE_FLOWLET_QUALITY; attrs.push_back(attr); attr.id = SAI_ARS_ATTR_IDLE_TIME; attr.value.u32 = 100; attrs.push_back(attr); attr.id = SAI_ARS_ATTR_MAX_FLOWS; attr.value.u32 = 500; attrs.push_back(attr); attr.id = SAI_ARS_ATTR_MON_ENABLE; attr.value.booldata = true; attrs.push_back(attr); attr.id = SAI_ARS_ATTR_SAMPLEPACKET_ENABLE; attr.value.oid = SAI_NULL_OBJECT_ID; attrs.push_back(attr); attr.id = SAI_ARS_ATTR_MAX_ALT_MEMEBERS_PER_GROUP; attr.value.u32 = 15; attrs.push_back(attr); attr.id = SAI_ARS_ATTR_MAX_PRIMARY_MEMEBERS_PER_GROUP; attr.value.u32 = 14; attrs.push_back(attr); attr.id = SAI_ARS_ATTR_PRIMARY_PATH_QUALITY_THRESHOLD; attr.value.u32 = 14; attrs.push_back(attr); attr.id = SAI_ARS_ATTR_ALTERNATE_PATH_COST; attr.value.u32 = 1; attrs.push_back(attr); attr.id = SAI_ARS_ATTR_ALTERNATE_PATH_BIAS; attr.value.u32 = 1; attrs.push_back(attr); EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_ARS, &ars, switchId, (uint32_t)attrs.size(), attrs.data())); EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(SAI_OBJECT_TYPE_ARS, ars, (uint32_t)attrs.size(), attrs.data())); attr.id = SAI_ARS_ATTR_ALTERNATE_PATH_BIAS; attr.value.u32 = 1; EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(SAI_OBJECT_TYPE_ARS, ars, &attr)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(SAI_OBJECT_TYPE_ARS, ars)); } TEST(Meta, quad_ars_profile) { Meta m(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t switchId = 0; sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, &attr)); sai_object_id_t ars_profile; std::vector<sai_attribute_t> attrs; attr.id = SAI_ARS_PROFILE_ATTR_ALGO; attr.value.u32 = SAI_ARS_PROFILE_ALGO_EWMA; attrs.push_back(attr); attr.id = SAI_ARS_PROFILE_ATTR_SAMPLING_INTERVAL; attr.value.u32 = 15; attrs.push_back(attr); EXPECT_EQ(SAI_STATUS_SUCCESS, m.create(SAI_OBJECT_TYPE_ARS_PROFILE, &ars_profile, switchId, (uint32_t)attrs.size(), attrs.data())); EXPECT_EQ(SAI_STATUS_SUCCESS, m.get(SAI_OBJECT_TYPE_ARS_PROFILE, ars_profile, (uint32_t)attrs.size(), attrs.data())); attr.id = SAI_ARS_PROFILE_ATTR_ARS_RANDOM_SEED; attr.value.u32 = 1; EXPECT_EQ(SAI_STATUS_SUCCESS, m.set(SAI_OBJECT_TYPE_ARS_PROFILE, ars_profile, &attr)); EXPECT_EQ(SAI_STATUS_SUCCESS, m.remove(SAI_OBJECT_TYPE_ARS_PROFILE, ars_profile)); } TEST(Meta, bulkGet) { Meta sai(std::make_shared<MetaTestSaiInterface>()); sai_object_id_t oids[1] = {0}; uint32_t attrcount[1] = {0}; sai_attribute_t* attrs[1] = {0}; sai_status_t statuses[1] = {0}; EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, sai.bulkGet( SAI_OBJECT_TYPE_PORT, 1, oids, attrcount, attrs, SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses)); } TEST(Meta, remove_flow_entry) { Meta sai(std::make_shared<MetaTestSaiInterface>()); sai_flow_entry_t* e = nullptr; EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, sai.remove(e)); } TEST(Meta, remove_meter_bucket_entry) { Meta sai(std::make_shared<MetaTestSaiInterface>()); sai_meter_bucket_entry_t* e = nullptr; EXPECT_EQ(SAI_STATUS_INVALID_PARAMETER, sai.remove(e)); }