unittest/meta/TestNotificationSwitchAsicSdkHealthEvent.cpp (159 lines of code) (raw):

#include "NotificationSwitchAsicSdkHealthEvent.h" #include "Meta.h" #include "MetaTestSaiInterface.h" #include "sairediscommon.h" #include "sai_serialize.h" #include <inttypes.h> #include <gtest/gtest.h> #include <memory> using namespace sairedis; using namespace saimeta; //static std::string s = "[{\"host_tx_ready_status\":\"SAI_PORT_HOST_TX_READY_STATUS_READY\",\"port_id\":\"oid:0x100000000001a\",\"switch_id\":\"oid:0x2100000000\"}]"; static std::string s = "{" "\"category\":\"SAI_SWITCH_ASIC_SDK_HEALTH_CATEGORY_FW\"," "\"data.data_type\":\"SAI_HEALTH_DATA_TYPE_GENERAL\"," "\"description\":\"2:30,30\"," "\"severity\":\"SAI_SWITCH_ASIC_SDK_HEALTH_SEVERITY_FATAL\"," "\"switch_id\":\"oid:0x21000000000000\"," "\"timestamp\":\"{" "\\\"tv_nsec\\\":\\\"28715881\\\"," "\\\"tv_sec\\\":\\\"1700042919\\\"" "}\"" "}"; static std::string null = "[{\"host_tx_ready_status\":\"SAI_PORT_HOST_TX_READY_STATUS_READY\",\"port_id\":\"oid:0x0\",\"switch_id\":\"oid:0x0\"}]"; static std::string fullnull = "[]"; TEST(NotificationSwitchAsicSdkHealthEvent, ctr) { NotificationSwitchAsicSdkHealthEvent n(s); } TEST(NotificationSwitchAsicSdkHealthEvent, getSwitchId) { NotificationSwitchAsicSdkHealthEvent n(s); EXPECT_EQ(n.getSwitchId(), 0x21000000000000); } TEST(NotificationSwitchAsicSdkHealthEvent, getAnyObjectId) { NotificationSwitchAsicSdkHealthEvent n(s); EXPECT_EQ(n.getAnyObjectId(), 0x21000000000000); } TEST(NotificationSwitchAsicSdkHealthEvent, processMetadata) { NotificationSwitchAsicSdkHealthEvent n(s); auto sai = std::make_shared<MetaTestSaiInterface>(); auto meta = std::make_shared<Meta>(sai); n.processMetadata(meta); } static void on_switch_asic_sdk_health_event( _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(); printf("swtch: %" PRIx64 " %" PRIu64 " %d\n", switch_id, timestamp.tv_sec, timestamp.tv_nsec); // this code is from swss and it crashes on put_time because of tv_sec == 172479515853275099 // 67767710400000001 uint64_t y1000 = 1000; y1000 *= 365; y1000 *= 24; y1000 *= 60; y1000 *= 60; timestamp.tv_sec %= y1000; std::stringstream ss; const std::time_t t = (std::time_t)timestamp.tv_sec; ss << std::put_time(std::localtime(&t), "%Y-%m-%d %H:%M:%S");// THIS WILL THROW if seconds is too big } TEST(NotificationSwitchAsicSdkHealthEvent, executeCallback) { NotificationSwitchAsicSdkHealthEvent n(s); sai_switch_notifications_t ntfs; ntfs.on_switch_asic_sdk_health_event = &on_switch_asic_sdk_health_event; n.executeCallback(ntfs); auto str = "{\"category\":\"SAI_SWITCH_ASIC_SDK_HEALTH_CATEGORY_ASIC_HW\",\"data.data_type\":\"SAI_HEALTH_DATA_TYPE_GENERAL\",\"description\":\"16:123,10,9,34,100,97,116,97,34,58,32,34,48,34,10,125\",\"severity\":\"SAI_SWITCH_ASIC_SDK_HEALTH_SEVERITY_WARNING\",\"switch_id\":\"oid:0x21000000000000\",\"timestamp\":\"{\\\"tv_nsec\\\":\\\"12\\\",\\\"tv_sec\\\":\\\"172479515853275099\\\"}\"}"; NotificationSwitchAsicSdkHealthEvent nn(str); ntfs.on_switch_asic_sdk_health_event = &on_switch_asic_sdk_health_event; nn.executeCallback(ntfs); } typedef struct _sai_switch_health_data_t_v14 { sai_health_data_type_t data_type; sai_health_data_t data; } sai_switch_health_data_t_v14; typedef struct _sai_switch_health_data_t_v13 { sai_health_data_type_t data_type; } sai_switch_health_data_t_v13; typedef void (*on_switch_asic_sdk_health_event_v13_fn)( _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_v13 data, _In_ const sai_u8_list_t description); static void on_switch_asic_sdk_health_event_v13( _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_v13 data, _In_ const sai_u8_list_t description) { SWSS_LOG_ENTER(); printf("switch v13: 0x%" PRIx64 " %" PRIu64 " %d, count = %d\n", switch_id, timestamp.tv_sec,timestamp.tv_nsec, description.count); EXPECT_TRUE(timestamp.tv_sec == 1731848814); const std::time_t &t = (std::time_t)timestamp.tv_sec; std::stringstream time_ss; time_ss << std::put_time(std::localtime(&t), "%Y-%m-%d %H:%M:%S"); } typedef void (*on_switch_asic_sdk_health_event_v14_fn)( _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_v14 data, _In_ const sai_u8_list_t description); static void on_switch_asic_sdk_health_event_v14( _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_v14 data, _In_ const sai_u8_list_t description) { SWSS_LOG_ENTER(); printf("switch v14: 0x%" PRIx64 " %" PRIu64 " %d, count = %d\n", switch_id, timestamp.tv_sec, timestamp.tv_nsec, description.count); EXPECT_TRUE(timestamp.tv_sec == 1731848814); const std::time_t &t = (std::time_t)timestamp.tv_sec; std::stringstream time_ss; time_ss << std::put_time(std::localtime(&t), "%Y-%m-%d %H:%M:%S"); } TEST(NotificationSwitchAsicSdkHealthEvent, version) { SWSS_LOG_ENTER(); sai_object_id_t switchId = 0x21000000000000; sai_switch_asic_sdk_health_severity_t severity = SAI_SWITCH_ASIC_SDK_HEALTH_SEVERITY_WARNING; sai_switch_asic_sdk_health_category_t category = SAI_SWITCH_ASIC_SDK_HEALTH_CATEGORY_ASIC_HW; sai_timespec_t timestamp = {1731848814, 123456}; sai_switch_health_data_t_v13 data13 = { }; sai_switch_health_data_t_v14 data14 = { }; data13.data_type = SAI_HEALTH_DATA_TYPE_GENERAL; data14.data_type = SAI_HEALTH_DATA_TYPE_GENERAL; uint8_t list[] = {123,10,9,34,100,97,116,97,34,58,32,34,48,34,10,125}; sai_u8_list_t desc; desc.count = 16; desc.list = list; { on_switch_asic_sdk_health_event_v13_fn v13 = &on_switch_asic_sdk_health_event_v13; v13(switchId, severity, timestamp, category, data13, desc); // v13 call v13 on_switch_asic_sdk_health_event_v14_fn v14 = &on_switch_asic_sdk_health_event_v14; v14(switchId, severity, timestamp, category, data14, desc); // v14 call v14 } { printf("call other\n"); on_switch_asic_sdk_health_event_v13_fn v13 = reinterpret_cast<on_switch_asic_sdk_health_event_v13_fn>((void*)&on_switch_asic_sdk_health_event_v14); v13(switchId, severity, timestamp, category, data13, desc); // v13 call v14 on_switch_asic_sdk_health_event_v14_fn v14 = reinterpret_cast<on_switch_asic_sdk_health_event_v14_fn>((void*)&on_switch_asic_sdk_health_event_v13); v14(switchId, severity, timestamp, category, data14, desc); // v14 call v13 } }