unittest/meta/TestLegacyRouteEntry.cpp (382 lines of code) (raw):
#include "TestLegacy.h"
#include <arpa/inet.h>
#include <gtest/gtest.h>
#include <memory>
using namespace TestLegacy;
// STATIC HELPERS
// ACTUAL TESTS
TEST(LegacyRouteEntry, route_entry_create)
{
SWSS_LOG_ENTER();
clear_local();
sai_status_t status;
sai_attribute_t attr;
sai_object_id_t switch_id = create_switch();
sai_route_entry_t route_entry;
sai_object_id_t vr = create_virtual_router(switch_id);
sai_object_id_t hop = create_next_hop(switch_id);
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
route_entry.destination.addr.ip4 = htonl(0x0a00000f);
route_entry.destination.mask.ip4 = htonl(0xffffff00);
route_entry.vr_id = vr;
route_entry.switch_id = switch_id;
SWSS_LOG_NOTICE("create tests");
// commented out as there is no mandatory attribute
// SWSS_LOG_NOTICE("zero attribute count (but there are mandatory attributes)");
// attr.id = SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID;
// status = g_meta->create(&route_entry, 0, &attr);
// EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("attr is null");
status = g_meta->create(&route_entry, 1, NULL);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("route entry is null");
status = g_meta->create((sai_route_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_ROUTE_ENTRY_ATTR_NEXT_HOP_ID;
attr1.value.oid = hop;
attr2.id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION;
attr2.value.s32 = SAI_PACKET_ACTION_FORWARD;
attr3.id = -1;
SWSS_LOG_NOTICE("invalid attribute id");
status = g_meta->create(&route_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(&route_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(&route_entry, 3, list2);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("wrong object type");
attr1.value.oid = create_dummy_object_id(SAI_OBJECT_TYPE_HASH,switch_id);
status = g_meta->create(&route_entry, 2, list);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("non existing object");
attr1.value.oid = create_dummy_object_id(SAI_OBJECT_TYPE_NEXT_HOP,switch_id);
status = g_meta->create(&route_entry, 2, list);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
int fam = 10;
attr1.value.oid = hop;
route_entry.destination.addr_family = (sai_ip_addr_family_t)fam;
SWSS_LOG_NOTICE("wrong address family");
status = g_meta->create(&route_entry, 2, list);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("correct ipv4");
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
status = g_meta->create(&route_entry, 2, list);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
sai_ip6_t ip62 = {0x00, 0x11, 0x22, 0x33,0x44, 0x55, 0x66,0x77, 0x88, 0x99, 0xaa, 0xbb,0xcc,0xdd,0xee,0x99};
memcpy(route_entry.destination.addr.ip6, ip62, 16);
sai_ip6_t ip6mask2 = {0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff,0xff,0xff,0xf7,0x00};
memcpy(route_entry.destination.mask.ip6, ip6mask2, 16);
SWSS_LOG_NOTICE("invalid mask");
status = g_meta->create(&route_entry, 2, list);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
route_entry.destination.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(route_entry.destination.addr.ip6, ip6, 16);
sai_ip6_t ip6mask = {0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff,0xff,0xff,0xff,0x00};
memcpy(route_entry.destination.mask.ip6, ip6mask, 16);
SWSS_LOG_NOTICE("correct ipv6");
status = g_meta->create(&route_entry, 2, list);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("already exists");
status = g_meta->create(&route_entry, 2, list);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
remove_switch(switch_id);
}
TEST(LegacyRouteEntry, route_entry_remove)
{
SWSS_LOG_ENTER();
clear_local();
sai_status_t status;
sai_object_id_t switch_id = create_switch();
sai_route_entry_t route_entry;
sai_object_id_t vr = create_virtual_router(switch_id);
sai_object_id_t hop = create_next_hop(switch_id);
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
route_entry.destination.addr.ip4 = htonl(0x0a00000f);
route_entry.destination.mask.ip4 = htonl(0xffffff00);
route_entry.vr_id = vr;
route_entry.switch_id = switch_id;
SWSS_LOG_NOTICE("create tests");
sai_attribute_t list[3] = { };
sai_attribute_t &attr1 = list[0];
sai_attribute_t &attr2 = list[1];
attr1.id = SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID;
attr1.value.oid = hop;
attr2.id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION;
attr2.value.s32 = SAI_PACKET_ACTION_FORWARD;
SWSS_LOG_NOTICE("correct ipv4");
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
status = g_meta->create(&route_entry, 2, list);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
route_entry.destination.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(route_entry.destination.addr.ip6, ip6, 16);
sai_ip6_t ip6mask = {0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff,0xff,0xff,0xff,0x00};
memcpy(route_entry.destination.mask.ip6, ip6mask, 16);
SWSS_LOG_NOTICE("correct ipv6");
status = g_meta->create(&route_entry, 2, list);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("remove tests");
SWSS_LOG_NOTICE("route_entry is null");
status = g_meta->remove((sai_route_entry_t*)NULL);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
route_entry.vr_id = SAI_NULL_OBJECT_ID;
SWSS_LOG_NOTICE("invalid object id null");
status = g_meta->remove(&route_entry);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
route_entry.vr_id = create_dummy_object_id(SAI_OBJECT_TYPE_HASH,switch_id);
SWSS_LOG_NOTICE("invalid object id hash");
status = g_meta->remove(&route_entry);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
route_entry.vr_id = create_dummy_object_id(SAI_OBJECT_TYPE_VIRTUAL_ROUTER,switch_id);
SWSS_LOG_NOTICE("invalid object id router");
status = g_meta->remove(&route_entry);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
route_entry.vr_id = vr;
sai_object_meta_key_t key = { .objecttype = SAI_OBJECT_TYPE_ROUTE_ENTRY, .objectkey = { .key = { .route_entry = route_entry } } };
EXPECT_TRUE(g_meta->objectExists(key));
SWSS_LOG_NOTICE("success");
status = g_meta->remove(&route_entry);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
EXPECT_TRUE(!g_meta->objectExists(key));
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
route_entry.destination.addr.ip4 = htonl(0x0a00000f);
route_entry.destination.mask.ip4 = htonl(0xffffff00);
SWSS_LOG_NOTICE("success");
status = g_meta->remove(&route_entry);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
remove_switch(switch_id);
}
TEST(LegacyRouteEntry, route_entry_set)
{
SWSS_LOG_ENTER();
clear_local();
sai_status_t status;
sai_attribute_t attr;
sai_object_id_t switch_id = create_switch();
memset(&attr, 0, sizeof(attr));
sai_route_entry_t route_entry;
sai_object_id_t vr = create_virtual_router(switch_id);
sai_object_id_t hop = create_next_hop(switch_id);
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
route_entry.destination.addr.ip4 = htonl(0x0a00000f);
route_entry.destination.mask.ip4 = htonl(0xffffff00);
route_entry.vr_id = vr;
route_entry.switch_id = switch_id;
SWSS_LOG_NOTICE("create tests");
sai_attribute_t list[3] = { };
sai_attribute_t &attr1 = list[0];
sai_attribute_t &attr2 = list[1];
attr1.id = SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID;
attr1.value.oid = hop;
attr2.id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION;
attr2.value.s32 = SAI_PACKET_ACTION_FORWARD;
SWSS_LOG_NOTICE("correct ipv4");
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
status = g_meta->create(&route_entry, 2, list);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
route_entry.destination.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(route_entry.destination.addr.ip6, ip6, 16);
sai_ip6_t ip6mask = {0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff,0xff,0xff,0xff,0x00};
memcpy(route_entry.destination.mask.ip6, ip6mask, 16);
SWSS_LOG_NOTICE("correct ipv6");
status = g_meta->create(&route_entry, 2, list);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("set tests");
SWSS_LOG_NOTICE("attr is null");
status = g_meta->set(&route_entry, NULL);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("route entry is null");
status = g_meta->set((sai_route_entry_t*)NULL, &attr);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("setting invalid attrib id");
attr.id = -1;
status = g_meta->set(&route_entry, &attr);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("value outside range");
attr.id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION;
attr.value.s32 = 0x100;
status = g_meta->set(&route_entry, &attr);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("correct packet action");
attr.id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION;
attr.value.s32 = SAI_PACKET_ACTION_DROP;
status = g_meta->set(&route_entry, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("correct next hop");
attr.id = SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID;
attr.value.oid = hop;
status = g_meta->set(&route_entry, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("correct metadata");
attr.id = SAI_ROUTE_ENTRY_ATTR_META_DATA;
attr.value.u32 = 0x12345678;
status = g_meta->set(&route_entry, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
remove_switch(switch_id);
}
TEST(LegacyRouteEntry, route_entry_get)
{
SWSS_LOG_ENTER();
clear_local();
sai_status_t status;
sai_attribute_t attr;
sai_object_id_t switch_id = create_switch();
memset(&attr, 0, sizeof(attr));
sai_route_entry_t route_entry;
sai_object_id_t vr = create_virtual_router(switch_id);
sai_object_id_t hop = create_next_hop(switch_id);
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
route_entry.destination.addr.ip4 = htonl(0x0a00000f);
route_entry.destination.mask.ip4 = htonl(0xffffff00);
route_entry.vr_id = vr;
route_entry.switch_id = switch_id;
SWSS_LOG_NOTICE("create tests");
sai_attribute_t list[3] = { };
sai_attribute_t &attr1 = list[0];
sai_attribute_t &attr2 = list[1];
attr1.id = SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID;
attr1.value.oid = hop;
attr2.id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION;
attr2.value.s32 = SAI_PACKET_ACTION_FORWARD;
SWSS_LOG_NOTICE("correct ipv4");
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
status = g_meta->create(&route_entry, 2, list);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
route_entry.destination.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(route_entry.destination.addr.ip6, ip6, 16);
sai_ip6_t ip6mask = {0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff,0xff,0xff,0xff,0x00};
memcpy(route_entry.destination.mask.ip6, ip6mask, 16);
SWSS_LOG_NOTICE("correct ipv6");
status = g_meta->create(&route_entry, 2, list);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("zero attribute count");
attr.id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION;
status = g_meta->get(&route_entry, 0, &attr);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("attr is null");
status = g_meta->get(&route_entry, 1, NULL);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("route entry is null");
status = g_meta->get((sai_route_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(&route_entry, 1, &attr);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("correct packet action");
attr.id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION;
status = g_meta->get(&route_entry, 1, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("correct next hop");
attr.id = SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID;
status = g_meta->get(&route_entry, 1, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("correct meta");
attr.id = SAI_ROUTE_ENTRY_ATTR_META_DATA;
status = g_meta->get(&route_entry, 1, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
remove_switch(switch_id);
}
TEST(LegacyRouteEntry, route_entry_flow)
{
SWSS_LOG_ENTER();
clear_local();
sai_status_t status;
sai_attribute_t attr;
sai_route_entry_t route_entry;
sai_object_id_t switch_id = create_switch();
sai_object_id_t vr = create_virtual_router(switch_id);
sai_object_id_t hop = create_next_hop(switch_id);
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
route_entry.destination.addr.ip4 = htonl(0x0a00000f);
route_entry.destination.mask.ip4 = htonl(0xffffff00);
route_entry.vr_id = vr;
route_entry.switch_id = switch_id;
SWSS_LOG_NOTICE("create tests");
sai_attribute_t list[3] = { };
sai_attribute_t &attr1 = list[0];
sai_attribute_t &attr2 = list[1];
attr1.id = SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID;
attr1.value.oid = hop;
attr2.id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION;
attr2.value.s32 = SAI_PACKET_ACTION_FORWARD;
SWSS_LOG_NOTICE("correct ipv4");
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
status = g_meta->create(&route_entry, 2, list);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("already exists ipv4");
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
status = g_meta->create(&route_entry, 2, list);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
sai_ip6_t ip62 = {0x00, 0x11, 0x22, 0x33,0x44, 0x55, 0x66,0x77, 0x88, 0x99, 0xaa, 0xbb,0xcc,0xdd,0xee,0x99};
memcpy(route_entry.destination.addr.ip6, ip62, 16);
sai_ip6_t ip6mask2 = {0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff,0xff,0xff,0xf7,0x00};
memcpy(route_entry.destination.mask.ip6, ip6mask2, 16);
SWSS_LOG_NOTICE("invalid mask");
status = g_meta->create(&route_entry, 2, list);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
route_entry.destination.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(route_entry.destination.addr.ip6, ip6, 16);
sai_ip6_t ip6mask = {0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff,0xff,0xff,0xff,0x00};
memcpy(route_entry.destination.mask.ip6, ip6mask, 16);
SWSS_LOG_NOTICE("correct ipv6");
status = g_meta->create(&route_entry, 2, list);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("already exists");
status = g_meta->create(&route_entry, 2, list);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("set tests");
SWSS_LOG_NOTICE("correct packet action");
attr.id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION;
attr.value.s32 = SAI_PACKET_ACTION_DROP;
status = g_meta->set(&route_entry, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("correct next hop");
attr.id = SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID;
attr.value.oid = hop;
status = g_meta->set(&route_entry, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("correct metadata");
attr.id = SAI_ROUTE_ENTRY_ATTR_META_DATA;
attr.value.u32 = 0x12345678;
status = g_meta->set(&route_entry, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("get tests");
SWSS_LOG_NOTICE("correct packet action");
attr.id = SAI_ROUTE_ENTRY_ATTR_PACKET_ACTION;
status = g_meta->get(&route_entry, 1, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("correct next hop");
attr.id = SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID;
status = g_meta->get(&route_entry, 1, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("correct meta");
attr.id = SAI_ROUTE_ENTRY_ATTR_META_DATA;
status = g_meta->get(&route_entry, 1, &attr);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("remove tests");
SWSS_LOG_NOTICE("success");
status = g_meta->remove(&route_entry);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("non existing");
status = g_meta->remove(&route_entry);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
route_entry.destination.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
route_entry.destination.addr.ip4 = htonl(0x0a00000f);
route_entry.destination.mask.ip4 = htonl(0xffffff00);
SWSS_LOG_NOTICE("success");
status = g_meta->remove(&route_entry);
EXPECT_EQ(SAI_STATUS_SUCCESS, status);
SWSS_LOG_NOTICE("non existing");
status = g_meta->remove(&route_entry);
EXPECT_NE(SAI_STATUS_SUCCESS, status);
remove_switch(switch_id);
}