unittest/meta/TestDummySaiInterface.cpp (201 lines of code) (raw):
#include "DummySaiInterface.h"
#include "swss/logger.h"
#include <gtest/gtest.h>
#include <memory>
using namespace saimeta;
TEST(DummySaiInterface, queryApiVersion)
{
DummySaiInterface sai;
sai.apiInitialize(0,0);
sai_api_version_t version;
EXPECT_EQ(sai.queryApiVersion(NULL), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.queryApiVersion(&version), SAI_STATUS_SUCCESS);
}
TEST(DummySaiInterface, bulkGet)
{
DummySaiInterface sai;
sai.apiInitialize(0,0);
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_NOT_IMPLEMENTED,
sai.bulkGet(
SAI_OBJECT_TYPE_PORT,
1,
oids,
attrcount,
attrs,
SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR,
statuses));
}
TEST(DummySaiInterface, create)
{
DummySaiInterface sai;
sai.apiInitialize(0,0);
sai_object_id_t oid;
sai.create(SAI_OBJECT_TYPE_SWITCH,&oid, 0, 0, 0);
EXPECT_NE(oid, SAI_NULL_OBJECT_ID);
}
TEST(DummySaiInterface, updateNotificationPointers)
{
DummySaiInterface sai;
sai.apiInitialize(0,0);
for (uint32_t idx = 0 ; idx < sai_metadata_switch_notify_attr_count; idx++)
{
sai_attribute_t attr;
attr.id = sai_metadata_switch_notify_attr[idx]->attrid;
attr.value.ptr = NULL;
auto status = sai.set(SAI_OBJECT_TYPE_SWITCH, 0x0, &attr);
EXPECT_EQ(status, SAI_STATUS_SUCCESS);
}
}
TEST(DummySaiInterface, start_stop)
{
DummySaiInterface sai;
EXPECT_EQ(sai.start(), SAI_STATUS_FAILURE); // api not initialized
EXPECT_EQ(sai.apiInitialize(0,0), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.stop(), SAI_STATUS_SUCCESS); // not running
EXPECT_EQ(sai.start(), SAI_STATUS_SUCCESS); // api initialized
EXPECT_EQ(sai.start(), SAI_STATUS_SUCCESS); // 2nd time is ok to start, already running
sleep(1);
EXPECT_EQ(sai.stop(), SAI_STATUS_SUCCESS);
}
static int ntfCounter = 0;
static void onSwitchStateChange(
_In_ sai_object_id_t switch_id,
_In_ sai_switch_oper_status_t switch_oper_status)
{
SWSS_LOG_ENTER();
SWSS_LOG_NOTICE("received onSwitchStateChange");
ntfCounter++;
}
static void onFdbEvent(
_In_ uint32_t count,
_In_ const sai_fdb_event_notification_data_t *data)
{
SWSS_LOG_ENTER();
SWSS_LOG_NOTICE("received onFdbEvent");
ntfCounter++;
}
static void onPortStateChange(
_In_ uint32_t count,
_In_ const sai_port_oper_status_notification_t *data)
{
SWSS_LOG_ENTER();
SWSS_LOG_NOTICE("received onPortStateChange");
ntfCounter++;
}
static void onSwitchShutdownRequest(
_In_ sai_object_id_t switch_id)
{
SWSS_LOG_ENTER();
SWSS_LOG_NOTICE("received: onSwitchShutdownRequest");
ntfCounter++;
}
static void onNatEvent(
_In_ uint32_t count,
_In_ const sai_nat_event_notification_data_t *data)
{
SWSS_LOG_ENTER();
SWSS_LOG_NOTICE("received: onNatEvent");
ntfCounter++;
}
static void onPortHostTxReady(
_In_ sai_object_id_t switch_id,
_In_ sai_object_id_t port_id,
_In_ sai_port_host_tx_ready_status_t host_tx_ready_status)
{
SWSS_LOG_ENTER();
SWSS_LOG_NOTICE("received: onPortHostTxReady");
ntfCounter++;
}
static void onQueuePfcDeadlock(
_In_ uint32_t count,
_In_ const sai_queue_deadlock_notification_data_t *data)
{
SWSS_LOG_ENTER();
SWSS_LOG_NOTICE("received: onQueuePfcDeadlock");
ntfCounter++;
}
static void onSwitchAsicSdkHealthEvent(
_In_ sai_object_id_t switch_id,
_In_ sai_switch_asic_sdk_health_severity_t severity,
_In_ sai_timespec_t timestamp,
_In_ sai_switch_asic_sdk_health_category_t category,
_In_ sai_switch_health_data_t data,
_In_ const sai_u8_list_t description)
{
SWSS_LOG_ENTER();
SWSS_LOG_NOTICE("received: onSwitchAsicSdkHealthEvent");
ntfCounter++;
}
static void onBfdSessionStateChange(
_In_ uint32_t count,
_In_ const sai_bfd_session_state_notification_t *data)
{
SWSS_LOG_ENTER();
SWSS_LOG_NOTICE("received: onBfdSessionStateChange");
ntfCounter++;
}
void onTwampSessionEvent(
_In_ uint32_t count,
_In_ const sai_twamp_session_event_notification_data_t *data)
{
SWSS_LOG_ENTER();
SWSS_LOG_NOTICE("received: onTwampSessionEvent");
ntfCounter++;
}
TEST(DummySaiInterface, sendNotification)
{
DummySaiInterface sai;
ntfCounter = 0;
// api not initialized
EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY), SAI_STATUS_FAILURE);
EXPECT_EQ(sai.apiInitialize(0,0), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY), SAI_STATUS_SUCCESS);
EXPECT_EQ(sai.enqueueNotificationToSend(SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY), SAI_STATUS_SUCCESS);
sai_attribute_t attr;
sai_object_id_t switch_id = 0x1;
attr.id = SAI_SWITCH_ATTR_SWITCH_STATE_CHANGE_NOTIFY;
attr.value.ptr = (void*)&onSwitchStateChange;
sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr);
attr.id = SAI_SWITCH_ATTR_FDB_EVENT_NOTIFY;
attr.value.ptr = (void*)&onFdbEvent;
sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr);
attr.id = SAI_SWITCH_ATTR_PORT_STATE_CHANGE_NOTIFY;
attr.value.ptr = (void*)&onPortStateChange;
sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr);
attr.id = SAI_SWITCH_ATTR_SHUTDOWN_REQUEST_NOTIFY;
attr.value.ptr = (void*)&onSwitchShutdownRequest;
sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr);
attr.id = SAI_SWITCH_ATTR_SWITCH_ASIC_SDK_HEALTH_EVENT_NOTIFY;
attr.value.ptr = (void*)&onSwitchAsicSdkHealthEvent;
sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr);
attr.id = SAI_SWITCH_ATTR_NAT_EVENT_NOTIFY;
attr.value.ptr = (void*)&onNatEvent;
sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr);
attr.id = SAI_SWITCH_ATTR_PORT_HOST_TX_READY_NOTIFY;
attr.value.ptr = (void*)&onPortHostTxReady;
sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr);
attr.id = SAI_SWITCH_ATTR_QUEUE_PFC_DEADLOCK_NOTIFY;
attr.value.ptr = (void*)&onQueuePfcDeadlock;
sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr);
attr.id = SAI_SWITCH_ATTR_BFD_SESSION_STATE_CHANGE_NOTIFY;
attr.value.ptr = (void*)&onBfdSessionStateChange;
sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr);
attr.id = SAI_SWITCH_ATTR_TWAMP_SESSION_EVENT_NOTIFY;
attr.value.ptr = (void*)&onTwampSessionEvent;
sai.set(SAI_OBJECT_TYPE_SWITCH, switch_id, &attr);
EXPECT_EQ(sai.start(), SAI_STATUS_SUCCESS);
sleep(1);
EXPECT_EQ(sai.stop(), SAI_STATUS_SUCCESS);
EXPECT_EQ(ntfCounter, 4 + 6);
}