unittest/syncd/TestVirtualOidTranslator.cpp (107 lines of code) (raw):

#include "VirtualOidTranslator.h" #include "VendorSai.h" #include "lib/RedisVidIndexGenerator.h" #include "lib/sairediscommon.h" #include "ServiceMethodTable.h" #include "vslib/Sai.h" #include <gtest/gtest.h> using namespace syncd; using namespace std::placeholders; static std::map<std::string, std::string> profileMap; static std::map<std::string, std::string>::iterator profileIter; static const char* profileGetValue( _In_ sai_switch_profile_id_t profile_id, _In_ const char* variable) { SWSS_LOG_ENTER(); if (variable == NULL) { SWSS_LOG_WARN("variable is null"); return NULL; } auto it = profileMap.find(variable); if (it == profileMap.end()) { SWSS_LOG_NOTICE("%s: NULL", variable); return NULL; } SWSS_LOG_NOTICE("%s: %s", variable, it->second.c_str()); return it->second.c_str(); } static int profileGetNextValue( _In_ sai_switch_profile_id_t profile_id, _Out_ const char** variable, _Out_ const char** value) { SWSS_LOG_ENTER(); if (value == NULL) { SWSS_LOG_INFO("resetting profile map iterator"); profileIter = profileMap.begin(); return 0; } if (variable == NULL) { SWSS_LOG_WARN("variable is null"); return -1; } if (profileIter == profileMap.end()) { SWSS_LOG_INFO("iterator reached end"); return -1; } *variable = profileIter->first.c_str(); *value = profileIter->second.c_str(); SWSS_LOG_INFO("key: %s:%s", *variable, *value); profileIter++; return 0; } TEST(VirtualOidTranslator, tryTranslateVidToRid) { profileMap["SAI_VS_SWITCH_TYPE"] = "SAI_VS_SWITCH_TYPE_BCM56850"; auto dbAsic = std::make_shared<swss::DBConnector>("ASIC_DB", 0); auto client = std::make_shared<RedisClient>(dbAsic); auto sai = std::make_shared<saivs::Sai>(); ServiceMethodTable smt; smt.profileGetValue = std::bind(&profileGetValue, _1, _2); smt.profileGetNextValue = std::bind(&profileGetNextValue, _1, _2, _3); sai_service_method_table_t test_services = smt.getServiceMethodTable(); sai_status_t status = sai->apiInitialize(0, &test_services); EXPECT_EQ(status, SAI_STATUS_SUCCESS); auto switchConfigContainer = std::make_shared<sairedis::SwitchConfigContainer>(); auto redisVidIndexGenerator = std::make_shared<sairedis::RedisVidIndexGenerator>(dbAsic, REDIS_KEY_VIDCOUNTER); auto virtualObjectIdManager = std::make_shared<sairedis::VirtualObjectIdManager>( 0, switchConfigContainer, redisVidIndexGenerator); VirtualOidTranslator vot(client, virtualObjectIdManager, sai); sai_object_id_t rid; EXPECT_TRUE(vot.tryTranslateVidToRid(0, rid)); EXPECT_EQ(rid, 0); EXPECT_FALSE(vot.tryTranslateVidToRid(0x21, rid)); sai_attribute_t attr; attr.id = SAI_SWITCH_ATTR_INIT_SWITCH; attr.value.booldata = true; sai_object_id_t swid; status = sai->create(SAI_OBJECT_TYPE_SWITCH, &swid, SAI_NULL_OBJECT_ID, 1, &attr); EXPECT_EQ(status, SAI_STATUS_SUCCESS); vot.insertRidAndVid(0x2100000000,0x21000000000000); swss::Logger::getInstance().setMinPrio(swss::Logger::SWSS_DEBUG); vot.translateRidToVid(0x2100000000,0x21000000000000); EXPECT_TRUE(vot.tryTranslateVidToRid(0x21000000000000, rid)); vot.clearLocalCache(); EXPECT_TRUE(vot.tryTranslateVidToRid(0x21000000000000, rid)); swss::Logger::getInstance().setMinPrio(swss::Logger::SWSS_NOTICE); // meta key sai_object_meta_key_t mk; mk.objecttype = SAI_OBJECT_TYPE_PORT; mk.objectkey.key.object_id = 0; EXPECT_TRUE(vot.tryTranslateVidToRid(mk)); mk.objecttype = SAI_OBJECT_TYPE_FDB_ENTRY; mk.objectkey.key.fdb_entry.switch_id = 0x21000000000000; mk.objectkey.key.fdb_entry.bv_id = 0; EXPECT_TRUE(vot.tryTranslateVidToRid(mk)); mk.objectkey.key.fdb_entry.bv_id = 0x21; EXPECT_FALSE(vot.tryTranslateVidToRid(mk)); sai->apiUninitialize(); }