From f4fa7ce8b1aad8b7bf54d068ce6ebc7429b13f02 Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Fri, 29 Dec 2023 20:35:39 +0800 Subject: [PATCH] Add unittest Signed-off-by: Ze Gan --- tests/Makefile.am | 1 + .../database_config4.json | 113 +++++++++++++++++ .../database_config5.json | 118 ++++++++++++++++++ .../database_global.json | 8 ++ tests/redis_multi_ns_ut.cpp | 60 ++++++--- tests/redis_smartswitch_ut.cpp | 60 +++++++++ tests/test_redis_ut.py | 23 +++- 7 files changed, 361 insertions(+), 22 deletions(-) create mode 100644 tests/redis_multi_db_ut_config/database_config4.json create mode 100644 tests/redis_multi_db_ut_config/database_config5.json create mode 100644 tests/redis_smartswitch_ut.cpp diff --git a/tests/Makefile.am b/tests/Makefile.am index ac69ddce6..99bc65951 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -24,6 +24,7 @@ tests_tests_SOURCES = tests/redis_ut.cpp \ common/loglevel.cpp \ tests/loglevel_ut.cpp \ tests/redis_multi_ns_ut.cpp \ + tests/redis_smartswitch_ut.cpp \ tests/fdb_flush.cpp \ tests/stringutility_ut.cpp \ tests/redisutility_ut.cpp \ diff --git a/tests/redis_multi_db_ut_config/database_config4.json b/tests/redis_multi_db_ut_config/database_config4.json new file mode 100644 index 000000000..b49c27f9a --- /dev/null +++ b/tests/redis_multi_db_ut_config/database_config4.json @@ -0,0 +1,113 @@ +{ + "INSTANCES": { + "redis":{ + "hostname" : "127.0.0.1", + "port": 6379, + "unix_socket_path": "/var/run/redis/redis.sock" + } + }, + "DATABASES" : { + "APPL_DB" : { + "id" : 0, + "separator": ":", + "instance" : "redis" + }, + "ASIC_DB" : { + "id" : 1, + "separator": ":", + "instance" : "redis" + }, + "COUNTERS_DB" : { + "id" : 2, + "separator": ":", + "instance" : "redis" + }, + "LOGLEVEL_DB" : { + "id" : 3, + "separator": ":", + "instance" : "redis" + }, + "CONFIG_DB" : { + "id" : 4, + "separator": "|", + "instance" : "redis" + }, + "PFC_WD_DB" : { + "id" : 5, + "separator": ":", + "instance" : "redis" + }, + "FLEX_COUNTER_DB" : { + "id" : 5, + "separator": ":", + "instance" : "redis" + }, + "STATE_DB" : { + "id" : 6, + "separator": "|", + "instance" : "redis" + }, + "SNMP_OVERLAY_DB" : { + "id" : 7, + "separator": "|", + "instance" : "redis" + }, + "RESTAPI_DB": { + "id": 8, + "separator": "|", + "instance": "redis" + }, + "GB_ASIC_DB": { + "id": 9, + "separator": ":", + "instance": "redis" + }, + "GB_COUNTERS_DB": { + "id": 10, + "separator": ":", + "instance": "redis" + }, + "GB_FLEX_COUNTER_DB": { + "id": 11, + "separator": ":", + "instance": "redis" + }, + "PROFILE_DB" : { + "id" : 12, + "separator": "|", + "instance" : "redis" + }, + "STATE_DB2" : { + "id" : 13, + "separator": "|", + "instance" : "redis" + }, + "APPL_STATE_DB" : { + "id" : 14, + "separator": ":", + "instance" : "redis" + }, + "DPU_APPL_DB" : { + "id" : 15, + "separator": ":", + "instance" : "redis", + "format": "proto" + }, + "DPU_APPL_STATE_DB" : { + "id" : 16, + "separator": "|", + "instance" : "redis" + }, + "DPU_STATE_DB" : { + "id" : 17, + "separator": "|", + "instance" : "redis" + }, + "DPU_COUNTERS_DB" : { + "id" : 18, + "separator": ":", + "instance" : "redis" + } + }, + "VERSION" : "1.0" +} diff --git a/tests/redis_multi_db_ut_config/database_config5.json b/tests/redis_multi_db_ut_config/database_config5.json new file mode 100644 index 000000000..6ae3507b2 --- /dev/null +++ b/tests/redis_multi_db_ut_config/database_config5.json @@ -0,0 +1,118 @@ +{ + "INSTANCES": { + "redis":{ + "hostname" : "127.0.0.1", + "port": 6379, + "unix_socket_path": "/var/run/redis/redis.sock" + }, + "remote-redis":{ + "hostname" : "127.0.0.1", + "port": 6379, + "unix_socket_path": "" + } + }, + "DATABASES" : { + "APPL_DB" : { + "id" : 0, + "separator": ":", + "instance" : "redis" + }, + "ASIC_DB" : { + "id" : 1, + "separator": ":", + "instance" : "redis" + }, + "COUNTERS_DB" : { + "id" : 2, + "separator": ":", + "instance" : "redis" + }, + "LOGLEVEL_DB" : { + "id" : 3, + "separator": ":", + "instance" : "redis" + }, + "CONFIG_DB" : { + "id" : 4, + "separator": "|", + "instance" : "redis" + }, + "PFC_WD_DB" : { + "id" : 5, + "separator": ":", + "instance" : "redis" + }, + "FLEX_COUNTER_DB" : { + "id" : 5, + "separator": ":", + "instance" : "redis" + }, + "STATE_DB" : { + "id" : 6, + "separator": "|", + "instance" : "redis" + }, + "SNMP_OVERLAY_DB" : { + "id" : 7, + "separator": "|", + "instance" : "redis" + }, + "RESTAPI_DB": { + "id": 8, + "separator": "|", + "instance": "redis" + }, + "GB_ASIC_DB": { + "id": 9, + "separator": ":", + "instance": "redis" + }, + "GB_COUNTERS_DB": { + "id": 10, + "separator": ":", + "instance": "redis" + }, + "GB_FLEX_COUNTER_DB": { + "id": 11, + "separator": ":", + "instance": "redis" + }, + "PROFILE_DB" : { + "id" : 12, + "separator": "|", + "instance" : "redis" + }, + "STATE_DB2" : { + "id" : 13, + "separator": "|", + "instance" : "redis" + }, + "APPL_STATE_DB" : { + "id" : 14, + "separator": ":", + "instance" : "redis" + }, + "DPU_APPL_DB" : { + "id" : 15, + "separator": ":", + "instance" : "remote-redis", + "format": "proto" + }, + "DPU_APPL_STATE_DB" : { + "id" : 16, + "separator": "|", + "instance" : "remote-redis" + }, + "DPU_STATE_DB" : { + "id" : 17, + "separator": "|", + "instance" : "remote-redis" + }, + "DPU_COUNTERS_DB" : { + "id" : 18, + "separator": ":", + "instance" : "remote-redis" + } + }, + "VERSION" : "1.0" +} diff --git a/tests/redis_multi_db_ut_config/database_global.json b/tests/redis_multi_db_ut_config/database_global.json index fa0879af1..292d47a91 100644 --- a/tests/redis_multi_db_ut_config/database_global.json +++ b/tests/redis_multi_db_ut_config/database_global.json @@ -18,6 +18,14 @@ { "namespace" : "asic3", "include" : "../redis_multi_db_ut_config/database_config3.json" + }, + { + "database_name" : "dpu0", + "include" : "../redis_multi_db_ut_config/database_config4.json" + }, + { + "database_name" : "dpu1", + "include" : "../redis_multi_db_ut_config/database_config5.json" } ], "VERSION" : "1.0" diff --git a/tests/redis_multi_ns_ut.cpp b/tests/redis_multi_ns_ut.cpp index 0de49a514..ffb4084dc 100644 --- a/tests/redis_multi_ns_ut.cpp +++ b/tests/redis_multi_ns_ut.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include "gtest/gtest.h" #include "common/dbconnector.h" #include @@ -14,8 +16,8 @@ extern string global_existing_file; TEST(DBConnector, multi_ns_test) { - std::string local_file, dir_name, ns_name; - vector namespaces; + std::string local_file, dir_name; + set namespaces; vector ns_names; // load global config file again, should throw exception with init already done @@ -57,18 +59,20 @@ TEST(DBConnector, multi_ns_test) for (auto& element : g["INCLUDES"]) { + swss::SonicDBKey key; local_file.append(dir_name); local_file.append(element["include"]); - if(element["namespace"].empty()) + if(!element["namespace"].empty()) { - ns_name = EMPTY_NAMESPACE; + key.netns = element["namespace"]; } - else + namespaces.insert(key.netns); + + if (!element["database_name"].empty()) { - ns_name = element["namespace"]; + key.containerName = element["database_name"]; } - namespaces.push_back(ns_name); // parse config file ifstream i(local_file); @@ -93,17 +97,34 @@ TEST(DBConnector, multi_ns_test) string instName = it.value().at("instance"); int dbId = it.value().at("id"); cout<<"testing "< +#include +#include +#include +#include +#include "gtest/gtest.h" +#include + +#include "common/dbconnector.h" +#include "common/table.h" + +using namespace std; +using namespace swss; +using namespace boost; +using json = nlohmann::json; + + +static void TestDPUDatabase(DBConnector &db) +{ + RedisReply r(&db, "FLUSHALL", REDIS_REPLY_STATUS); + + Table t(&db, "DASH_ENI_TABLE"); + vector values = { + {"dashfield1", "dashvalue1"}, + {"dashfield2", "dashvalue2"}}; + + t.set("dputest1", values); + t.set("dputest2", values); + + vector keys; + t.getKeys(keys); + EXPECT_EQ(keys.size(), (size_t)2); + + format fmt("redis-cli -n %1% -p %2% -h %3% hget 'DASH_ENI_TABLE:dputest1' dashfield1"); + SonicDBKey key = db.getDBKey(); + const std::string dbname = db.getDbName(); + std::string command = str( + fmt % SonicDBConfig::getDbId(dbname, key) % SonicDBConfig::getDbPort(dbname, key) % SonicDBConfig::getDbHostname(dbname, key)); + std::unique_ptr pipe(popen(command.c_str(), "r"), pclose); + ASSERT_TRUE(pipe); + char buffer[128] = {0}; + EXPECT_TRUE(fgets(buffer, sizeof(buffer), pipe.get())); + EXPECT_STREQ(buffer, "dashvalue1\n"); +} + +TEST(DBConnector, access_dpu_db_from_npu) +{ + SonicDBKey key; + key.containerName = "dpu0"; + DBConnector db("DPU_APPL_DB", 0, false, key); + TestDPUDatabase(db); +} + +TEST(DBConnector, access_dpu_db_from_dpu) +{ + SonicDBKey key; + key.containerName = "dpu1"; + DBConnector db("DPU_APPL_DB", 0, true, key); + TestDPUDatabase(db); +} diff --git a/tests/test_redis_ut.py b/tests/test_redis_ut.py index 2a8de621e..3f7a7144f 100644 --- a/tests/test_redis_ut.py +++ b/tests/test_redis_ut.py @@ -5,7 +5,7 @@ from threading import Thread from pympler.tracker import SummaryTracker from swsscommon import swsscommon -from swsscommon.swsscommon import ConfigDBPipeConnector, DBInterface, SonicV2Connector, SonicDBConfig, ConfigDBConnector, SonicDBConfig, transpose_pops +from swsscommon.swsscommon import ConfigDBPipeConnector, DBInterface, SonicV2Connector, SonicDBConfig, ConfigDBConnector, SonicDBConfig, transpose_pops, SonicDBKey import json def test_ProducerTable(): @@ -801,4 +801,23 @@ def test_ConfigDBConnector(): allconfig["PORT_TABLE"] = None config_db.mod_config(allconfig) allconfig = config_db.get_config() - assert len(allconfig) == 0 \ No newline at end of file + assert len(allconfig) == 0 + + +def test_SmartSwitchDBConnector(): + test_dir = os.path.dirname(os.path.abspath(__file__)) + global_db_config = os.path.join(test_dir, 'redis_multi_db_ut_config', 'database_global.json') + SonicDBConfig.load_sonic_global_db_config(global_db_config) + db_key = SonicDBKey() + db_key.containerName = "dpu0" + db = swsscommon.DBConnector("DPU_APPL_DB", 0, True, db_key) + tbl = swsscommon.Table(db, "DASH_ENI_TABLE") + fvs = swsscommon.FieldValuePairs([('dashfield1','dashvalue1'), ('dashfield2', 'dashvalue2')]) + tbl.set("dputest1", fvs) + tbl.set("dputest2", fvs) + keys = tbl.getKeys() + assert len(keys) == 2 + assert keys[0] == "dputest1" + assert keys[1] == "dputest2" + assert tbl.get("dputest1")[1][0] == ("dashfield1", "dashvalue1") + assert tbl.get("dputest2")[1][1] == ("dashfield2", "dashvalue2")