unittest/meta/TestLegacyNeighborEntry.cpp (294 lines of code) (raw):

#include "TestLegacy.h" #include <arpa/inet.h> #include <gtest/gtest.h> #include <memory> using namespace TestLegacy; // STATIC HELPERS //static sai_neighbor_entry_t create_neighbor_entry() //{ // SWSS_LOG_ENTER(); // // sai_object_id_t switch_id = create_switch(); // sai_status_t status; // // sai_mac_t mac = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; // // sai_neighbor_entry_t neighbor_entry; // // sai_object_id_t rif = create_rif(switch_id); // // neighbor_entry.ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; // neighbor_entry.ip_address.addr.ip4 = htonl(0x0a00000f); // neighbor_entry.rif_id = rif; // neighbor_entry.switch_id = switch_id; // // sai_attribute_t list[3] = { }; // // sai_attribute_t &attr1 = list[0]; // sai_attribute_t &attr2 = list[1]; // sai_attribute_t &attr3 = list[2]; // // attr1.id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; // memcpy(attr1.value.mac, mac, 6); // // attr2.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; // attr2.value.s32 = SAI_PACKET_ACTION_FORWARD; // // attr3.id = -1; // // attr2.value.s32 = SAI_PACKET_ACTION_FORWARD; // // sai_attribute_t list2[4] = { attr1, attr2, attr2 }; // // status = g_meta->create(&neighbor_entry, 2, list2); // EXPECT_EQ(SAI_STATUS_SUCCESS, status); // // return neighbor_entry; //} static sai_object_id_t create_hash( _In_ sai_object_id_t switch_id) { SWSS_LOG_ENTER(); sai_object_id_t hash; auto status = g_meta->create(SAI_OBJECT_TYPE_HASH, &hash, switch_id, 0, NULL); EXPECT_EQ(SAI_STATUS_SUCCESS, status); return hash; } // ACTUAL TESTS TEST(LegacyNeighborEntry, neighbor_entry_create) { SWSS_LOG_ENTER(); clear_local(); sai_object_id_t switch_id = create_switch(); sai_status_t status; sai_attribute_t attr; sai_mac_t mac = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; sai_neighbor_entry_t neighbor_entry; sai_object_id_t rif = create_rif(switch_id); neighbor_entry.ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; neighbor_entry.ip_address.addr.ip4 = htonl(0x0a00000f); neighbor_entry.rif_id = rif; neighbor_entry.switch_id = switch_id; SWSS_LOG_NOTICE("create tests"); SWSS_LOG_NOTICE("zero attribute count (but there are mandatory attributes)"); status = g_meta->create(&neighbor_entry, 0, &attr); EXPECT_NE(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("attr is null"); status = g_meta->create(&neighbor_entry, 1, NULL); EXPECT_NE(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("neighbor entry is null"); status = g_meta->create((sai_neighbor_entry_t*)NULL, 1, &attr); EXPECT_NE(SAI_STATUS_SUCCESS, status); sai_attribute_t list[3] = { }; sai_attribute_t &attr1 = list[0]; sai_attribute_t &attr2 = list[1]; sai_attribute_t &attr3 = list[2]; attr1.id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; memcpy(attr1.value.mac, mac, 6); attr2.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; attr2.value.s32 = SAI_PACKET_ACTION_FORWARD; attr3.id = -1; SWSS_LOG_NOTICE("invalid attribute id"); status = g_meta->create(&neighbor_entry, 3, list); EXPECT_NE(SAI_STATUS_SUCCESS, status); attr2.value.s32 = SAI_PACKET_ACTION_FORWARD + 0x100; SWSS_LOG_NOTICE("invalid attribute value on enum"); status = g_meta->create(&neighbor_entry, 2, list); EXPECT_NE(SAI_STATUS_SUCCESS, status); attr2.value.s32 = SAI_PACKET_ACTION_FORWARD; sai_attribute_t list2[4] = { attr1, attr2, attr2 }; SWSS_LOG_NOTICE("repeated attribute id"); status = g_meta->create(&neighbor_entry, 3, list2); EXPECT_NE(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("correct ipv4"); status = g_meta->create(&neighbor_entry, 2, list2); EXPECT_EQ(SAI_STATUS_SUCCESS, status); neighbor_entry.ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV6; sai_ip6_t ip6 = {0x00, 0x11, 0x22, 0x33,0x44, 0x55, 0x66,0x77, 0x88, 0x99, 0xaa, 0xbb,0xcc,0xdd,0xee,0xff}; memcpy(neighbor_entry.ip_address.addr.ip6, ip6, 16); SWSS_LOG_NOTICE("correct ipv6"); status = g_meta->create(&neighbor_entry, 2, list2); EXPECT_EQ(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("already exists"); status = g_meta->create(&neighbor_entry, 2, list2); EXPECT_NE(SAI_STATUS_SUCCESS, status); remove_switch(switch_id); } TEST(LegacyNeighborEntry, neighbor_entry_remove) { clear_local(); sai_status_t status; sai_object_id_t switch_id = create_switch(); sai_neighbor_entry_t neighbor_entry; sai_mac_t mac = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; sai_attribute_t list[2] = { }; sai_attribute_t &attr1 = list[0]; sai_attribute_t &attr2 = list[1]; attr1.id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; memcpy(attr1.value.mac, mac, 6); attr2.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; attr2.value.s32 = SAI_PACKET_ACTION_FORWARD; sai_object_id_t rif = create_rif(switch_id); neighbor_entry.ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; neighbor_entry.ip_address.addr.ip4 = htonl(0x0a00000f); neighbor_entry.rif_id = rif; neighbor_entry.switch_id = switch_id; SWSS_LOG_NOTICE("create"); SWSS_LOG_NOTICE("correct ipv4"); status = g_meta->create(&neighbor_entry, 2, list); EXPECT_EQ(SAI_STATUS_SUCCESS, status); neighbor_entry.ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV6; sai_ip6_t ip6 = {0x00, 0x11, 0x22, 0x33,0x44, 0x55, 0x66,0x77, 0x88, 0x99, 0xaa, 0xbb,0xcc,0xdd,0xee,0xff}; memcpy(neighbor_entry.ip_address.addr.ip6, ip6, 16); SWSS_LOG_NOTICE("correct ipv6"); status = g_meta->create(&neighbor_entry, 2, list); EXPECT_EQ(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("remove tests"); SWSS_LOG_NOTICE("neighbor_entry is null"); status = g_meta->remove((sai_neighbor_entry_t*)NULL); EXPECT_NE(SAI_STATUS_SUCCESS, status); neighbor_entry.rif_id = SAI_NULL_OBJECT_ID; SWSS_LOG_NOTICE("invalid object id null"); status = g_meta->remove(&neighbor_entry); EXPECT_NE(SAI_STATUS_SUCCESS, status); neighbor_entry.rif_id = create_hash(switch_id); SWSS_LOG_NOTICE("invalid object id hash"); status = g_meta->remove(&neighbor_entry); EXPECT_NE(SAI_STATUS_SUCCESS, status); neighbor_entry.rif_id = create_rif(switch_id); SWSS_LOG_NOTICE("invalid object id router"); status = g_meta->remove(&neighbor_entry); EXPECT_NE(SAI_STATUS_SUCCESS, status); neighbor_entry.rif_id = rif; sai_object_meta_key_t key = { .objecttype = SAI_OBJECT_TYPE_NEIGHBOR_ENTRY, .objectkey = { .key = { .neighbor_entry = neighbor_entry } } }; EXPECT_TRUE(g_meta->objectExists(key)); SWSS_LOG_NOTICE("success"); status = g_meta->remove(&neighbor_entry); EXPECT_EQ(SAI_STATUS_SUCCESS, status); EXPECT_TRUE(!g_meta->objectExists(key)); remove_switch(switch_id); } TEST(LegacyNeighborEntry, neighbor_entry_set) { clear_local(); sai_status_t status; sai_attribute_t attr; memset(&attr, 0, sizeof(attr)); sai_object_id_t switch_id = create_switch(); sai_neighbor_entry_t neighbor_entry; sai_mac_t mac = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; sai_attribute_t list[2] = { }; sai_attribute_t &attr1 = list[0]; sai_attribute_t &attr2 = list[1]; attr1.id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; memcpy(attr1.value.mac, mac, 6); attr2.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; attr2.value.s32 = SAI_PACKET_ACTION_FORWARD; sai_object_id_t rif = create_rif(switch_id); neighbor_entry.ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; neighbor_entry.ip_address.addr.ip4 = htonl(0x0a00000f); neighbor_entry.rif_id = rif; neighbor_entry.switch_id = switch_id; SWSS_LOG_NOTICE("create"); SWSS_LOG_NOTICE("correct ipv4"); status = g_meta->create(&neighbor_entry, 2, list); EXPECT_EQ(SAI_STATUS_SUCCESS, status); neighbor_entry.ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV6; sai_ip6_t ip6 = {0x00, 0x11, 0x22, 0x33,0x44, 0x55, 0x66,0x77, 0x88, 0x99, 0xaa, 0xbb,0xcc,0xdd,0xee,0xff}; memcpy(neighbor_entry.ip_address.addr.ip6, ip6, 16); SWSS_LOG_NOTICE("correct ipv6"); status = g_meta->create(&neighbor_entry, 2, list); EXPECT_EQ(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("set tests"); SWSS_LOG_NOTICE("attr is null"); status = g_meta->set(&neighbor_entry, NULL); EXPECT_NE(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("neighbor entry is null"); status = g_meta->set((sai_neighbor_entry_t*)NULL, &attr); EXPECT_NE(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("setting invalid attrib id"); attr.id = -1; status = g_meta->set(&neighbor_entry, &attr); EXPECT_NE(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("value outside range"); attr.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; attr.value.s32 = 0x100; status = g_meta->set(&neighbor_entry, &attr); EXPECT_NE(SAI_STATUS_SUCCESS, status); // correct attr.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; attr.value.s32 = SAI_PACKET_ACTION_DROP; status = g_meta->set(&neighbor_entry, &attr); EXPECT_EQ(SAI_STATUS_SUCCESS, status); remove_switch(switch_id); } TEST(LegacyNeighborEntry, neighbor_entry_get) { clear_local(); sai_status_t status; sai_attribute_t attr; memset(&attr, 0, sizeof(attr)); sai_object_id_t switch_id = create_switch(); sai_neighbor_entry_t neighbor_entry; sai_mac_t mac = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; sai_attribute_t list[2] = { }; sai_attribute_t &attr1 = list[0]; sai_attribute_t &attr2 = list[1]; attr1.id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; memcpy(attr1.value.mac, mac, 6); attr2.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; attr2.value.s32 = SAI_PACKET_ACTION_FORWARD; sai_object_id_t rif = create_rif(switch_id); neighbor_entry.ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; neighbor_entry.ip_address.addr.ip4 = htonl(0x0a00000f); neighbor_entry.rif_id = rif; neighbor_entry.switch_id = switch_id; SWSS_LOG_NOTICE("create"); SWSS_LOG_NOTICE("correct ipv4"); status = g_meta->create(&neighbor_entry, 2, list); EXPECT_EQ(SAI_STATUS_SUCCESS, status); neighbor_entry.ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV6; sai_ip6_t ip6 = {0x00, 0x11, 0x22, 0x33,0x44, 0x55, 0x66,0x77, 0x88, 0x99, 0xaa, 0xbb,0xcc,0xdd,0xee,0xff}; memcpy(neighbor_entry.ip_address.addr.ip6, ip6, 16); SWSS_LOG_NOTICE("correct ipv6"); status = g_meta->create(&neighbor_entry, 2, list); EXPECT_EQ(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("get test"); SWSS_LOG_NOTICE("zero attribute count"); attr.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; status = g_meta->get(&neighbor_entry, 0, &attr); EXPECT_NE(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("attr is null"); status = g_meta->get(&neighbor_entry, 1, NULL); EXPECT_NE(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("neighbor entry is null"); status = g_meta->get((sai_neighbor_entry_t*)NULL, 1, &attr); EXPECT_NE(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("attr id out of range"); attr.id = -1; status = g_meta->get(&neighbor_entry, 1, &attr); EXPECT_NE(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("correct single valid attribute"); attr.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; status = g_meta->get(&neighbor_entry, 1, &attr); EXPECT_EQ(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("correct 2 attributes"); sai_attribute_t attr3; sai_attribute_t attr4; attr3.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; attr3.value.s32 = 1; attr4.id = SAI_NEIGHBOR_ENTRY_ATTR_NO_HOST_ROUTE; sai_attribute_t list2[2] = { attr3, attr4 }; status = g_meta->get(&neighbor_entry, 2, list2); EXPECT_EQ(SAI_STATUS_SUCCESS, status); remove_switch(switch_id); } TEST(LegacyNeighborEntry, neighbor_entry_flow) { SWSS_LOG_ENTER(); clear_local(); sai_status_t status; sai_object_id_t switch_id = create_switch(); sai_neighbor_entry_t neighbor_entry; sai_mac_t mac = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; sai_attribute_t list[4] = { }; sai_attribute_t &attr1 = list[0]; sai_attribute_t &attr2 = list[1]; sai_attribute_t &attr3 = list[1]; sai_attribute_t &attr4 = list[1]; attr1.id = SAI_NEIGHBOR_ENTRY_ATTR_DST_MAC_ADDRESS; memcpy(attr1.value.mac, mac, 6); attr2.id = SAI_NEIGHBOR_ENTRY_ATTR_PACKET_ACTION; attr2.value.s32 = SAI_PACKET_ACTION_FORWARD; attr3.id = SAI_NEIGHBOR_ENTRY_ATTR_NO_HOST_ROUTE; attr3.value.booldata = true; attr4.id = SAI_NEIGHBOR_ENTRY_ATTR_META_DATA; attr4.value.u32 = 1; sai_object_id_t rif = create_rif(switch_id); neighbor_entry.ip_address.addr_family = SAI_IP_ADDR_FAMILY_IPV4; neighbor_entry.ip_address.addr.ip4 = htonl(0x0a00000f); neighbor_entry.rif_id = rif; neighbor_entry.switch_id = switch_id; SWSS_LOG_NOTICE("create"); SWSS_LOG_NOTICE("correct ipv4"); status = g_meta->create(&neighbor_entry, 2, list); EXPECT_EQ(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("correct ipv4 existing"); status = g_meta->create(&neighbor_entry, 2, list); EXPECT_NE(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("set"); status = g_meta->set(&neighbor_entry, &attr1); EXPECT_EQ(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("set"); status = g_meta->set(&neighbor_entry, &attr2); EXPECT_EQ(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("set"); status = g_meta->set(&neighbor_entry, &attr3); EXPECT_EQ(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("set"); status = g_meta->set(&neighbor_entry, &attr4); EXPECT_EQ(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("remove"); status = g_meta->remove(&neighbor_entry); EXPECT_EQ(SAI_STATUS_SUCCESS, status); SWSS_LOG_NOTICE("remove existing"); status = g_meta->remove(&neighbor_entry); EXPECT_NE(SAI_STATUS_SUCCESS, status); remove_switch(switch_id); }