summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2023-04-10 01:45:58 +0000
committersongyanchao <[email protected]>2023-04-10 01:45:58 +0000
commit689ca9421f1b057eeff25e1f4a609b7087e298c1 (patch)
tree575dcbbf9e67180e053108441c060c55fea30ddf /test
parent48f8f83281d516b06e05dc037391f4317baf823a (diff)
✨ feat(DPISDN-6): add ptf demo test
add ptf demo test
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt69
-rw-r--r--test/TestHwInfo.cc47
-rw-r--r--test/TestMask.cc34
-rw-r--r--test/TestMrbuf.cc163
-rw-r--r--test/TestStackNeigh.cc107
-rw-r--r--test/TestVMan.cc59
-rw-r--r--test/TestVNode.cc351
-rw-r--r--test/Unittest.cc59
-rw-r--r--test/Unittest.h114
-rw-r--r--test/create_veth.sh36
-rw-r--r--test/demo_test.py276
-rw-r--r--test/mrzcpd.py49
12 files changed, 396 insertions, 968 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 55df185..3412f6d 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,34 +1,35 @@
-add_subdirectory(googletest-master)
-
-find_package(DPDK REQUIRED)
-include_directories(${CMAKE_SOURCE_DIR}/include)
-include_directories(${CMAKE_SOURCE_DIR}/include/extern)
-include_directories(${CMAKE_SOURCE_DIR}/include/internal)
-include_directories(${CMAKE_SOURCE_DIR})
-include_directories(${DPDK_INCLUDE_DIR})
-add_definitions(${DPDK_C_PREDEFINED})
-
-set(TEST_LINK_LIBRARIES ${DPDK_LIBRARY} gtest)
-
-# TestCase 1
-# add_executable(TestDevice TestDevice.cc Unittest.cc)
-# target_link_libraries(TestDevice ${TEST_LINK_LIBRARIES} core)
-
-# TestCase 2
-#add_executable(TestHwInfo TestHwInfo.cc Unittest.cc)
-#target_link_libraries(TestHwInfo ${TEST_LINK_LIBRARIES} core)
-
-# TestCase 3
-add_executable(TestVNode TestVNode.cc Unittest.cc)
-target_link_libraries(TestVNode ${TEST_LINK_LIBRARIES} core)
-
-# TestCase 4
-# add_executable(TestMask TestMask.cc Unittest.cc)
-# target_link_libraries(TestMask ${TEST_LINK_LIBRARIES} core)
-
-# TestCase 5
-# add_executable(TestVMan TestVMan.cc Unittest.cc)
-# target_link_libraries(TestVMan ${TEST_LINK_LIBRARIES} core)
-
-add_executable(TestNeigh TestStackNeigh.cc Unittest.cc)
-target_link_libraries(TestNeigh ${TEST_LINK_LIBRARIES} stack) \ No newline at end of file
+find_package(DPDK REQUIRED)
+include_directories(${CMAKE_SOURCE_DIR}/include)
+include_directories(${CMAKE_SOURCE_DIR}/include/extern)
+include_directories(${CMAKE_SOURCE_DIR}/include/internal)
+include_directories(${CMAKE_SOURCE_DIR})
+include_directories(${DPDK_INCLUDE_DIR})
+add_definitions(${DPDK_C_PREDEFINED})
+
+
+# Create veth
+execute_process(
+ COMMAND /bin/bash ${CMAKE_SOURCE_DIR}/test/create_veth.sh create 24
+ RESULT_VARIABLE VETH_RESULT
+ OUTPUT_VARIABLE VETH_OUTPUT
+ ERROR_VARIABLE VETH_ERROR
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+# Check veth create
+if(VETH_RESULT)
+message(FATAL_ERROR "${CMAKE_SOURCE_DIR}/test/create_veth.sh create 24")
+ message(FATAL_ERROR "Failed to create veth: ${VETH_ERROR}")
+endif()
+
+# Script for generating "--interface"
+# for i in range(0, 24):
+# print(f"--interface {i}@veth{i}-ptf{i}", end=" ")
+
+# Add ptf demo test
+add_test(
+ NAME ptf_demo_test
+ COMMAND python3 /usr/local/bin/ptf --test-dir ${CMAKE_SOURCE_DIR}/test
+ --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 --interface 2@veth2-ptf2 --interface 3@veth3-ptf3 --interface 4@veth4-ptf4 --interface 5@veth5-ptf5 --interface 6@veth6-ptf6 --interface 7@veth7-ptf7 --interface 8@veth8-ptf8 --interface 9@veth9-ptf9 --interface 10@veth10-ptf10 --interface 11@veth11-ptf11 --interface 12@veth12-ptf12 --interface 13@veth13-ptf13 --interface 14@veth14-ptf14 --interface 15@veth15-ptf15 --interface 16@veth16-ptf16 --interface 17@veth17-ptf17 --interface 18@veth18-ptf18 --interface 19@veth19-ptf19 --interface 20@veth20-ptf20 --interface 21@veth21-ptf21 --interface 22@veth22-ptf22 --interface 23@veth23-ptf23
+ demo_test --test-params "source_dir='${CMAKE_SOURCE_DIR}'"
+)
diff --git a/test/TestHwInfo.cc b/test/TestHwInfo.cc
deleted file mode 100644
index 1b92432..0000000
--- a/test/TestHwInfo.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-
-#include <gtest/gtest.h>
-#include <mr_ctx.h>
-#include <mr_hwinfo.h>
-#include <rte_lcore.h>
-
-#include "Unittest.h"
-
-class TestHwInfoBeforePreConfig : public ModuelTestBaseBeforePreConfig {};
-class TestHwInfoBeforeInit : public ModuleTestBaseBeforeInit{};
-
-extern struct mr_module module_desc_hwinfo;
-
-// ע��TestCase��IJ���
-INSTANTIATE_TEST_CASE_P(InsTestHwInfo, TestHwInfoBeforePreConfig, ::testing::Values(&module_desc_hwinfo));
-INSTANTIATE_TEST_CASE_P(InsTestHwInfo, TestHwInfoBeforeInit, ::testing::Values(&module_desc_hwinfo));
-
-TEST_P(TestHwInfoBeforePreConfig, TestPreConfig)
-{
- EXPECT_TRUE(module_g_ctx() == NULL);
- EXPECT_EQ(call_preconfig(), 0);
- EXPECT_TRUE(module_g_ctx() != NULL);
-}
-
-TEST_P(TestHwInfoBeforeInit, TestCPUCounts)
-{
- EXPECT_EQ(mr_hwinfo_nr_cpus(), rte_lcore_count());
- EXPECT_NE(mr_hwinfo_nr_sockets(), 0);
-}
-
-TEST_P(TestHwInfoBeforeInit, TestPhysicalID)
-{
- int nr_cpus = mr_hwinfo_nr_cpus();
- EXPECT_EQ(nr_cpus, rte_lcore_count());
-
- for (int id = 0; id < nr_cpus; id++)
- EXPECT_EQ(mr_hwinfo_physical_cpu_id(id), lcore_config[id].core_id);
-}
-
-TEST_P(TestHwInfoBeforeInit, TestSocketID)
-{
- int nr_cpus = mr_hwinfo_nr_cpus();
- EXPECT_EQ(nr_cpus, rte_lcore_count());
-
- for (int id = 0; id < nr_cpus; id++)
- EXPECT_EQ(mr_hwinfo_socket_id(id), rte_lcore_to_socket_id(id));
-} \ No newline at end of file
diff --git a/test/TestMask.cc b/test/TestMask.cc
deleted file mode 100644
index 1e271ce..0000000
--- a/test/TestMask.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-
-#include <gtest/gtest.h>
-#include <mr_mask.h>
-
-TEST(TestMask, TestPopcnt)
-{
- mask_t test_mask_0 = 0;
- EXPECT_EQ(mask_popcnt(test_mask_0), 0);
-
- mask_t test_mask_1 = 0xAA;
- EXPECT_EQ(mask_popcnt(test_mask_1), 4);
-
- mask_t test_mask_2 = 0xffffffff;
- EXPECT_EQ(mask_popcnt(test_mask_2), 32);
-
- mask_t test_mask_3 = 0xffffffffffffffff;
- EXPECT_EQ(mask_popcnt(test_mask_3), 64);
-}
-
-
-TEST(TestMask, TestLocation)
-{
- mask_t test_mask_0 = 0;
- EXPECT_EQ(mask_location(test_mask_0, 0), -1);
-
- mask_t test_mask_1 = 0x88;
- EXPECT_EQ(mask_location(test_mask_1, 0), 3);
- EXPECT_EQ(mask_location(test_mask_1, 1), 7);
- EXPECT_EQ(mask_location(test_mask_1, 2), -1);
-
- mask_t test_mask_2 = 0xffffffffffffffff;
- for(unsigned id = 0; id < sizeof(mask_t) * 8; id++)
- EXPECT_EQ(mask_location(test_mask_2, id), id);
-} \ No newline at end of file
diff --git a/test/TestMrbuf.cc b/test/TestMrbuf.cc
deleted file mode 100644
index 2616d94..0000000
--- a/test/TestMrbuf.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-#if SELF_TEST
-static struct rte_mempool * g_pktmbuf_pool = NULL;
-#endif
-
-#if SELF_TEST
-
-static void marsio_mbuf_test(void)
-{
-#define BATCH_TEST_NUM (32)
- marsio_buff_t *mbuf, *mnext;
- struct rte_mbuf *rbuf;
- char *data;
- char *pri_data = (char *)"test ctrlzone";
- uint32_t pkt_len;
- int ctrl_id = -1, i;
- marsio_buff_t *batch_mbuf[BATCH_TEST_NUM];
-
- ctrl_id = marsio_buf_ctrlzone_alloc_id();
-
- while (1) {
- printf("ctrl_id = %u\n", ctrl_id);
- mbuf = marsio_buff_alloc();
- rbuf = (struct rte_mbuf *)mbuf;
-
- marsio_buf_batch_alloc(batch_mbuf, BATCH_TEST_NUM);
-
- printf("headroom = %u\n", marsio_buf_headroom(mbuf));
- printf("tailroom = %u\n", marsio_buf_tailroom(mbuf));
- printf("bufaddr-buf = %ld\n", (char *)rbuf->buf_addr - (char *)rbuf);
-
- data = marsio_buff_mtod(mbuf);
- pkt_len = marsio_buff_pkt_len(mbuf);
- printf("init pkt_len = %u\n", pkt_len);
-
- marsio_buff_prepend(mbuf, 20);
- pkt_len = marsio_buff_pkt_len(mbuf);
- printf("after prepend, pkt_len = %u\n", pkt_len);
-
- marsio_buf_append(mbuf, 100);
- pkt_len = marsio_buff_pkt_len(mbuf);
- printf("after append, pkt_len = %u\n", pkt_len);
-
- marsio_buf_trim(mbuf, 60);
- pkt_len = marsio_buff_pkt_len(mbuf);
- printf("after trim, pkt_len = %u\n", pkt_len);
-
- printf("tailroom = %u\n", marsio_buf_tailroom(mbuf));
-
- mnext = marsio_buff_alloc();
-
- marsio_buf_append_pkt(mbuf, mnext);
- printf("next is :%p\n", marsio_buf_get_nextpkt(mbuf));
-
- marsio_buf_set_ctrlzone(mbuf, ctrl_id, (void *)pri_data);
- pri_data = marsio_buf_get_ctrlzone(mbuf, ctrl_id);
- printf("ctrlzone pri data : %s\n", pri_data);
-
-#if MEM_RECORD
- for (i = 0; i < lcore_num; i += 8) {
- printf("%ld %ld %ld %ld %ld %ld %ld %ld\n",
- marsio_buf_record[i].alloc_mbuf_num,
- marsio_buf_record[i + 1].alloc_mbuf_num,
- marsio_buf_record[i + 2].alloc_mbuf_num,
- marsio_buf_record[i + 3].alloc_mbuf_num,
- marsio_buf_record[i + 4].alloc_mbuf_num,
- marsio_buf_record[i + 5].alloc_mbuf_num,
- marsio_buf_record[i + 6].alloc_mbuf_num,
- marsio_buf_record[i + 7].alloc_mbuf_num);
- }
-#endif
-
- marsio_buf_batch_free(batch_mbuf, BATCH_TEST_NUM);
- marsio_buff_free(mnext);
-
- marsio_buf_dup(mbuf);
- marsio_buff_free(mbuf);
- marsio_buff_free(mbuf);
-
- sleep(1);
- printf("\n ---------------------------------------------------- \n");
- }
-
-}
-
-static void *marsio_mbuf_test_thread(void *arg)
-{
- marsio_mbuf_test();
-
- return NULL;
-}
-
-static int dpdk_common_init(int argc, char *argv[])
-{
- int ret;
-
- /* init EAL */
- ret = rte_eal_init(argc, argv);
- if (ret < 0)
- rte_exit(EXIT_FAILURE, "Invalid EAL arguments\n");
-
- /* ��ʼ��ʱ��ô��ÿ��socket����һ��mpool, ����ÿ��core����һ��? */
- g_pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", 1024,
- 256, 128, RTE_MBUF_DEFAULT_BUF_SIZE,
- rte_socket_id());
- if (g_pktmbuf_pool == NULL)
- rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n");
-
- rte_eal_mp_wait_lcore();
-
- return 0;
-}
-
-/*
-��ȡȫ��������.
-*/
-static inline void *marsio_get_global_self_ctx(void)
-{
-#if SELF_TEST
- static char global_tmp[1024];
-#endif
-
- return global_tmp;
-}
-
-/*
-��ȡ��ǰ�������������.
-*/
-static inline void *marsio_get_process_self_ctx(void)
-{
- return MODULE_CTX(mr_proc_ctx_get(), MR_MID_MRBUF_MGR);
-}
-
-/*
-��ȡ��ǰ�߳����������.
-*/
-static inline void *marsio_get_thread_self_ctx(void)
-{
-#if SELF_TEST
- static char thread_tmp[1024];
-#endif
-
- return thread_tmp;
-}
-
-
-int main(int argc, char *argv[])
-{
- pthread_t pid;
-
- marsio_buf_init();
-
- if (dpdk_common_init(argc, argv) < 0) {
- return -1;
- }
-
- while (1) {
- marsio_mbuf_test();
- }
-
- return 0;
-}
-
-#endif
diff --git a/test/TestStackNeigh.cc b/test/TestStackNeigh.cc
deleted file mode 100644
index 43bd9ae..0000000
--- a/test/TestStackNeigh.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-
-#include <gtest/gtest.h>
-#include <sk_device.h>
-#include <netinet/in.h>
-#include <sk_neigh.h>
-#include <arpa/inet.h>
-
-class TCStackNeigh : public ::testing::Test
-{
-protected:
- struct neighbour_manager nbl_object_;
- struct sk_dev_info dev_info_;
-
- virtual void SetUp()
- {
- int ret = neighbour_mamanger_init(&nbl_object_, "TestNeighbour",
- 1024, 8, 0);
- ASSERT_EQ(ret, 0);
- }
-
- virtual void TearDown()
- {
- int ret = neighbour_mamanger_deinit(&nbl_object_);
- ASSERT_EQ(ret, 0);
- }
-};
-
-TEST_F(TCStackNeigh, CreateAndQuery)
-{
- int ret = 0;
- struct in_addr _in_addr;
- inet_pton(AF_INET, "192.168.11.101", &_in_addr);
- struct ether_addr _ether_addr = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
-
- ret = neigh_create_or_update(&nbl_object_,
- _in_addr, &_ether_addr, &dev_info_, 1);
-
- ASSERT_EQ(ret, 0);
-
- struct ether_addr _ether_addr_query;
- struct sk_dev_info * _dev_info_query;
-
- ret = neigh_query(&nbl_object_, _in_addr, &_ether_addr_query,
- &_dev_info_query);
-
- ASSERT_EQ(ret, 0);
- EXPECT_EQ(is_same_ether_addr(&_ether_addr_query, &_ether_addr), 1);
- EXPECT_EQ(_dev_info_query, &dev_info_);
-}
-
-TEST_F(TCStackNeigh, CreateAndUpdate)
-{
- int ret = 0;
- struct in_addr _in_addr;
- inet_pton(AF_INET, "192.168.11.101", &_in_addr);
- struct ether_addr _ether_addr = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
-
- ret = neigh_create_or_update(&nbl_object_,
- _in_addr, &_ether_addr, &dev_info_, 1);
-
- ASSERT_EQ(ret, 0);
-
- struct ether_addr _ether_addr_query;
- struct sk_dev_info * _dev_info_query;
-
- ret = neigh_query(&nbl_object_, _in_addr, &_ether_addr_query,
- &_dev_info_query);
-
- ASSERT_EQ(ret, 0);
- EXPECT_EQ(is_same_ether_addr(&_ether_addr_query, &_ether_addr), 1);
- EXPECT_EQ(_dev_info_query, &dev_info_);
-
- struct ether_addr _ether_addr_update = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
- ret = neigh_create_or_update(&nbl_object_, _in_addr, &_ether_addr_update,
- &dev_info_, 1);
-
- ASSERT_EQ(ret, 0);
-
- ret = neigh_query(&nbl_object_, _in_addr, &_ether_addr_query, &_dev_info_query);
- ASSERT_EQ(ret, 0);
- EXPECT_EQ(is_same_ether_addr(&_ether_addr_query, &_ether_addr_update), 1);
- EXPECT_EQ(_dev_info_query, &dev_info_);
-}
-
-TEST_F(TCStackNeigh, CreateAndDelete)
-{
- int ret = 0;
- struct in_addr _in_addr;
- inet_pton(AF_INET, "192.168.11.101", &_in_addr);
- struct ether_addr _ether_addr = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
-
- ret = neigh_create_or_update(&nbl_object_,
- _in_addr, &_ether_addr, &dev_info_, 1);
-
- ASSERT_EQ(ret, 0);
-
- ret = neigh_delete(&nbl_object_, _in_addr);
- ASSERT_EQ(ret, 0);
-
- struct ether_addr _ether_addr_query;
- struct sk_dev_info * _dev_info_query;
-
- ret = neigh_query(&nbl_object_, _in_addr, &_ether_addr_query,
- &_dev_info_query);
-
- ASSERT_LE(ret, 0);
-} \ No newline at end of file
diff --git a/test/TestVMan.cc b/test/TestVMan.cc
deleted file mode 100644
index 3e30bad..0000000
--- a/test/TestVMan.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-
-/* \brief ����ڵ��������Ԫ���Դ���
- * \author Qiuwen Lu<[email protected]>
- * \date 2016-09-02
- */
-
-#include <gtest/gtest.h>
-#include <mr_ctx.h>
-#include <mr_common.h>
-#include <mr_vman.h>
-
-extern struct mr_module module_desc_vnodeman;
-
-class TestCaseVNodeMan : public ::testing::Test
-{
-protected:
-
- TestCaseVNodeMan()
- {
- }
-
- ~TestCaseVNodeMan()
- {
- }
-
- static void SetUpTestCase()
- {
- mr_global_cfg_init();
- mr_global_ctx_init();
-
- struct mr_global_ctx * g_ctx = mr_global_ctx_get();
- struct mr_config * g_cfg = mr_global_config_get();
-
- int ret = module_desc_vnodeman.preinit(
- &module_desc_vnodeman, g_cfg, g_ctx);
- ASSERT_EQ(ret, 0);
- }
-};
-
-TEST_F(TestCaseVNodeMan, TestRegisterAndAttach)
-{
- int ret = 0;
- ret = mr_vnodeman_create("TN", 1024, 128, 0);
- ASSERT_EQ(ret, 0);
- ret = mr_vnodeman_register_consumer("TN", "TNS",4);
- ASSERT_EQ(ret, 0);
- ret = mr_vnodeman_register_producer("TN", "TNP", 4);
- ASSERT_EQ(ret, 0);
-
- struct vnodeman_attach_desc * cons_desc[4];
- struct vnodeman_attach_desc * prod_desc[4];
- for (int i = 0; i < 4; i++)
- {
- cons_desc[i] = mr_vnodeman_consumer_attach("TN", "TNS");
- ASSERT_TRUE(cons_desc[i] != NULL);
- EXPECT_EQ(cons_desc[i]->desc_type, VNODEMAN_ATTACH_CONSUMER);
- EXPECT_EQ(cons_desc[i]->queue_id, i);
- }
-} \ No newline at end of file
diff --git a/test/TestVNode.cc b/test/TestVNode.cc
deleted file mode 100644
index 325da58..0000000
--- a/test/TestVNode.cc
+++ /dev/null
@@ -1,351 +0,0 @@
-#include <gtest/gtest.h>
-#include <rte_ring.h>
-#include <rte_mempool.h>
-#include <rte_mbuf.h>
-#include <mr_vnode.h>
-
-class VNodeOpsWrapper
-{
-public:
- static void* tunnel_new(const char* symbol, unsigned int size)
- {
- return rte_ring_create(symbol, size, SOCKET_ID_ANY, RING_F_SC_DEQ | RING_F_SP_ENQ);
- }
-
- static int tunnel_delete(void* ring)
- {
- rte_ring_free((struct rte_ring *)ring);
- return 0;
- }
-
- static int tunnel_enqueue(void* ring, void* objects[], int nr_objects)
- {
- struct rte_ring* _ring = (struct rte_ring *)ring;
- return rte_ring_enqueue_burst(_ring, objects, nr_objects);
- }
-
- static int tunnel_dequeue(void* ring, void* objects[], int nr_max_objects)
- {
- struct rte_ring* _ring = (struct rte_ring *)ring;
- return rte_ring_dequeue_burst(_ring, objects, nr_max_objects);
- }
-};
-
-/// 测试用例基类,只提供操作函数的初始化
-class TestCaseVNodeBase : public ::testing::Test
-{
-protected:
- struct vnode_ops* vnode_ops_;
-
- TestCaseVNodeBase() : vnode_ops_(new struct vnode_ops)
- {
- }
-
- ~TestCaseVNodeBase()
- {
- delete vnode_ops_;
- }
-};
-
-/// 测试用例,测试VNode节点的创建和初始化
-TEST_F(TestCaseVNodeBase, TestVNodeCreate)
-{
- std::string strVNodeSym = "TVNCreate";
- struct vnode* node = vnode_create(strVNodeSym.c_str(), vnode_ops_, 512, 8);
-
- ASSERT_TRUE(node != NULL);
- EXPECT_STREQ(node->symbol, strVNodeSym.c_str());
- EXPECT_EQ(node->nr_cons, 0);
- EXPECT_EQ(node->nr_prod, 0);
-}
-
-/// 测试用例,测试VNode的销毁过程
-TEST_F(TestCaseVNodeBase, TestVNodeDelete)
-{
- std::string strVNodeSym = "TVNDelete";
- struct vnode* node = vnode_create(strVNodeSym.c_str(), vnode_ops_, 512, 8);
- ASSERT_TRUE(node != NULL);
- EXPECT_STREQ(node->symbol, strVNodeSym.c_str());
- EXPECT_EQ(node->nr_cons, 0);
- EXPECT_EQ(node->nr_prod, 0);
-
- int ret = vnode_delete(node, vnode_ops_);
- EXPECT_EQ(ret, 0);
-}
-
-/// 测试Case,测试VNode的各项操作。VNode的创建在本测试Case中完成。
-class TestCaseVNodeOps : public TestCaseVNodeBase
-{
-protected:
- struct vnode* node_;
-
- TestCaseVNodeOps() : TestCaseVNodeBase(), node_(NULL)
- {
- }
-
- virtual void SetUp()
- {
- node_ = vnode_create("TVNOps", vnode_ops_, 512, 8);
- ASSERT_TRUE(node_ != NULL);
- }
-
- virtual void TearDown()
- {
- ASSERT_TRUE(node_ != NULL);
- vnode_delete(node_, vnode_ops_);
- }
-};
-
-/// 测试用例,测试VNode创建生产者的过程。
-TEST_F(TestCaseVNodeOps, TestVNodeCreateDeleteProd)
-{
- struct vnode_prod* prod;
- std::string strProdSym = "VProd1";
- prod = vnode_create_prod(node_, vnode_ops_, strProdSym.c_str(), 10);
-
- ASSERT_TRUE(prod != NULL);
- EXPECT_STREQ(prod->symbol, strProdSym.c_str());
- vnode_delete_prod(prod, vnode_ops_);
-}
-
-/// 测试用例,测试VNode创建消费者的过程。
-TEST_F(TestCaseVNodeOps, TestVNodeCreateDeleteCons)
-{
- struct vnode_cons* cons;
- std::string strConsSym = "VCons2";
- cons = vnode_create_cons(node_, vnode_ops_, strConsSym.c_str(), 10);
-
- ASSERT_TRUE(cons != NULL);
- EXPECT_STREQ(cons->symbol, strConsSym.c_str());
- vnode_delete_cons(cons, vnode_ops_);
-}
-
-/// 测试用例,测试生产者、消费者共同创建过程
-TEST_F(TestCaseVNodeOps, TestVNodeProdConsCreate)
-{
- struct vnode_prod* prod;
- std::string strProdSym = "VProd3";
- prod = vnode_create_prod(node_, vnode_ops_, strProdSym.c_str(), 10);
-
- struct vnode_cons* cons;
- std::string strConsSym = "VCons4";
- cons = vnode_create_cons(node_, vnode_ops_, strConsSym.c_str(), 10);
-
- ASSERT_TRUE(prod != NULL);
- ASSERT_TRUE(cons != NULL);
- EXPECT_EQ(node_->nr_cons, 1);
- EXPECT_EQ(node_->nr_prod, 1);
-
- vnode_delete_prod(prod, vnode_ops_);
- vnode_delete_cons(cons, vnode_ops_);
-}
-
-TEST_F(TestCaseVNodeOps, TestVNodeProdConsLookup)
-{
- struct vnode_prod* prod;
- std::string strProdSym = "VProd5";
- prod = vnode_create_prod(node_, vnode_ops_, strProdSym.c_str(), 10);
-
- struct vnode_cons* cons;
- std::string strConsSym = "VCons6";
- cons = vnode_create_cons(node_, vnode_ops_, strConsSym.c_str(), 10);
-
- struct vnode_prod* prod_lookup;
- prod_lookup = vnode_prod_lookup(node_, strProdSym.c_str());
- EXPECT_EQ(prod_lookup, prod);
-
- struct vnode_cons* cons_lookup;
- cons_lookup = vnode_cons_lookup(node_, strConsSym.c_str());
- EXPECT_EQ(cons_lookup, cons);
-
- prod_lookup = vnode_prod_lookup(node_, "");
- EXPECT_TRUE(prod_lookup == NULL);
-
- cons_lookup = vnode_cons_lookup(node_, "");
- EXPECT_TRUE(cons_lookup == NULL);
-
- vnode_delete_prod(prod, vnode_ops_);
- vnode_delete_cons(cons, vnode_ops_);
-}
-
-class TestCaseVNodeDataOps : public TestCaseVNodeBase
-{
-protected:
- struct vnode* node_;
- struct vnode_prod* prod_;
- struct vnode_cons* cons_;
-
- void** buff_send_;
- void** buff_recv_;
- uint32_t* hash_;
- unsigned int bufsize_;
-
- static struct rte_mempool* pool_;
-
- TestCaseVNodeDataOps() : TestCaseVNodeBase(), node_(NULL), prod_(NULL), cons_(NULL),
- buff_send_(NULL), buff_recv_(NULL), hash_(NULL), bufsize_(128)
- {
- }
-
- static void SetUpTestCase()
- {
- TestCaseVNodeOps::SetUpTestCase();
- pool_ = rte_pktmbuf_pool_create("TCVNDataOpsPool", 8192, 512, 0, 512, SOCKET_ID_ANY);
- ASSERT_TRUE(pool_ != NULL);
- }
-
- static void TearDownTestCase()
- {
- TestCaseVNodeOps::TearDownTestCase();
- return;
- }
-
- virtual void VNodeCreate()
- {
- node_ = vnode_create("TVNOps", vnode_ops_, 512, 0);
- ASSERT_TRUE(node_ != NULL);
- }
-
- virtual void VNodeProdCreate()
- {
- std::string strProdSym = "Prod";
- prod_ = vnode_create_prod(node_, vnode_ops_, strProdSym.c_str(), 1);
- }
-
- virtual void VNodeConsCreate()
- {
- std::string strConsSym = "Cons";
- cons_ = vnode_create_cons(node_, vnode_ops_, strConsSym.c_str(), 1);
- }
-
- virtual void SetUp()
- {
- buff_send_ = new void*[bufsize_];
- buff_recv_ = new void*[bufsize_];
- hash_ = new uint32_t[bufsize_];
-
- VNodeCreate();
- VNodeProdCreate();
- VNodeConsCreate();
- }
-
- virtual void TearDown()
- {
- vnode_delete_prod(prod_, vnode_ops_);
- vnode_delete_cons(cons_, vnode_ops_);
- vnode_delete(node_, vnode_ops_);
- delete[] buff_send_;
- delete[] buff_recv_;
- delete[] hash_;
- }
-};
-
-struct rte_mempool* TestCaseVNodeDataOps::pool_;
-
-TEST_F(TestCaseVNodeDataOps, TestSimpleEnqueueDequeue)
-{
- buff_send_[0] = rte_pktmbuf_alloc(pool_);
- hash_[0] = 0;
- ASSERT_TRUE(buff_send_[0] != NULL);
-
- vnode_enqueue_burst_with_hash(prod_, vnode_ops_, 0, buff_send_, hash_, 1);
- int ret = vnode_dequeue_burst(cons_, vnode_ops_, 0, buff_recv_, 128);
- EXPECT_EQ(ret, 1);
- EXPECT_EQ(buff_recv_[0], buff_send_[0]);
-}
-
-TEST_F(TestCaseVNodeDataOps, TestMoreEnqueueDequeue)
-{
- for (int i = 0; i < 128; i++)
- {
- buff_send_[i] = rte_pktmbuf_alloc(pool_);
- hash_[i] = 1;
- ASSERT_TRUE(buff_send_[i]);
- }
-
- vnode_enqueue_burst_with_hash(prod_, vnode_ops_, 0, buff_send_, hash_, 128);
- int ret = vnode_dequeue_burst(cons_, vnode_ops_, 0, buff_recv_, 128);
- EXPECT_EQ(ret, 128);
-
- for (int i = 0; i < 128; i++)
- {
- EXPECT_EQ(buff_send_[i], buff_recv_[i]);
- }
-}
-
-
-class TestCaseVNodeDataMultiQ : public TestCaseVNodeDataOps
-{
-protected:
- std::string vnode_sym_;
- std::string prod_sym_;
- std::string cons_sym_;
-
- unsigned int nr_prodq;
- unsigned int nr_consq;
-
- TestCaseVNodeDataMultiQ() : TestCaseVNodeDataOps(),
- vnode_sym_("VNodeTest"), prod_sym_("Prod"), cons_sym_("Cons"),
- nr_prodq(4), nr_consq(2) {}
-
- static void SetUpTestCase()
- {
- pool_ = rte_pktmbuf_pool_create("TCVNDataMultiQPool", 8192, 512, 0, 512, SOCKET_ID_ANY);
- ASSERT_TRUE(pool_ != NULL);
- }
-
- virtual void VNodeConsCreate()
- {
- cons_ = vnode_create_cons(node_, vnode_ops_, prod_sym_.c_str(), nr_consq);
- ASSERT_TRUE(cons_ != NULL);
- }
-
- virtual void VNodeProdCreate()
- {
- prod_ = vnode_create_prod(node_, vnode_ops_, cons_sym_.c_str(), nr_prodq);
- ASSERT_TRUE(prod_ != NULL);
- }
-};
-
-TEST_F(TestCaseVNodeDataMultiQ, TestMultiQRecv)
-{
- struct rte_mbuf ** mbufs_a = new rte_mbuf * [bufsize_];
- struct rte_mbuf ** mbufs_b = new rte_mbuf * [bufsize_];
-
- for (int i = 0; i < bufsize_; i++)
- {
- mbufs_a[i] = rte_pktmbuf_alloc(pool_);
- mbufs_b[i] = rte_pktmbuf_alloc(pool_);
- ASSERT_TRUE(mbufs_a[i] != NULL);
- ASSERT_TRUE(mbufs_b[i] != NULL);
- }
-
- uint32_t * hash0 = new uint32_t[bufsize_];
- uint32_t * hash1 = new uint32_t[bufsize_];
-
- for (int i = 0; i < bufsize_; i++)
- {
- hash0[i] = 0;
- hash1[i] = 1;
- }
-
- struct rte_mbuf ** recv_a = new rte_mbuf *[bufsize_];
- struct rte_mbuf ** recv_b = new rte_mbuf *[bufsize_];
-
- vnode_enqueue_burst_with_hash(prod_, vnode_ops_, 0, (void **)mbufs_a, hash0, bufsize_);
- vnode_enqueue_burst_with_hash(prod_, vnode_ops_, 0, (void **)mbufs_b, hash1, bufsize_);
-
- int ret1 = vnode_dequeue_burst(cons_, vnode_ops_, 0, (void **)recv_a, bufsize_);
- EXPECT_EQ(ret1, bufsize_);
- int ret2 = vnode_dequeue_burst(cons_, vnode_ops_, 1, (void **)recv_b, bufsize_);
- EXPECT_EQ(ret2, bufsize_);
-
- for (int i = 0; i < bufsize_; i++)
- {
- EXPECT_EQ(recv_a[i], mbufs_a[i]);
- EXPECT_EQ(recv_b[i], mbufs_b[i]);
- }
-}
-
-TEST_F(TestCaseVNodeDataMultiQ, TestMultiQSend)
-{} \ No newline at end of file
diff --git a/test/Unittest.cc b/test/Unittest.cc
deleted file mode 100644
index 5a4ea5a..0000000
--- a/test/Unittest.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-
-#include <rte_eal.h>
-#include <cassert>
-#include <cstdlib>
-#include <cstdio>
-#include <gtest/gtest.h>
-
-#define MRUT_EAL_MAX_PARAMS 32
-#define MRUT_MAX_STRING 1024
-
-#if 0
-/* Launch DPDK EAL Enviorment for all tests */
-int MRUT_EALLaunch(unsigned int cpu_mask, unsigned int no_huge, unsigned int device)
-{
- char * eal_argv[MRUT_EAL_MAX_PARAMS];
- unsigned int eal_argc = 0;
-
- for (int i = 0; i < sizeof(eal_argv)/sizeof(eal_argv[0]); i++)
- {
- eal_argv[i] = (char *)malloc(sizeof(char) * MRUT_MAX_STRING);
- assert(eal_argv[i] != NULL);
- }
-
- if(cpu_mask)
- {
- snprintf(eal_argv[eal_argc++], MRUT_MAX_STRING, "-c");
- snprintf(eal_argv[eal_argc++], MRUT_MAX_STRING, "%x", cpu_mask);
- }
-
- if(no_huge)
- {
- snprintf(eal_argv[eal_argc++], MRUT_MAX_STRING, "--no-huge");
- }
-
- return rte_eal_init(eal_argc, eal_argv);
-}
-
-
-int MRUT_Main(int argc, char * argv[])
-{
- ::testing::InitGoogleTest(&argc, argv);
- return RUN_ALL_TESTS();
-}
-
-#endif
-
-int MRUT_EALMain(int argc, char * argv[])
-{
- if (rte_eal_init(argc, argv) < 0)
- return -1;
-
- ::testing::InitGoogleTest(&argc, argv);
- return RUN_ALL_TESTS();
-}
-
-int main(int argc, char * argv[])
-{
- return MRUT_EALMain(argc, argv);
-} \ No newline at end of file
diff --git a/test/Unittest.h b/test/Unittest.h
deleted file mode 100644
index 0aeae76..0000000
--- a/test/Unittest.h
+++ /dev/null
@@ -1,114 +0,0 @@
-#pragma once
-
-#include <gtest/gtest.h>
-#include <mr_ctx.h>
-
-/// ����������
-class ModuleTestBase : public ::testing::TestWithParam<struct mr_module*>
-{
-protected:
- struct mr_module * mod_desc_;
- struct mr_global_ctx * g_ctx_;
- struct mr_config * g_cfg_;
-
- ModuleTestBase() :
- mod_desc_(GetParam()), g_ctx_(NULL), g_cfg_(NULL)
- {
- return;
- }
-
- int call_preconfig() const
- {
- if (mod_desc_->preconfig != NULL) return (mod_desc_->preconfig)(g_cfg_, g_ctx_);
- return 0;
- }
-
- int call_config() const
- {
- if (mod_desc_->config != NULL) return mod_desc_->config(g_cfg_, g_ctx_);
- return 0;
- }
-
- int call_init() const
- {
- if (mod_desc_->init != NULL) return mod_desc_->init(g_cfg_, g_ctx_);
- return 0;
- }
-
- int call_destory() const
- {
- if (mod_desc_->destory != NULL) return mod_desc_->init(g_cfg_, g_ctx_);
- return 0;
- }
-
- void * module_g_ctx() const
- {
- return g_ctx_->module_ctxs[mod_desc_->mid];
- }
-
- void * module_g_cfg() const
- {
- return g_cfg_->module_cfgs[mod_desc_->mid];
- }
-};
-
-/// ���Ի��࣬����ģ��PreConfig�׶�ǰ�IJ���
-class ModuelTestBaseBeforePreConfig : public ModuleTestBase
-{
-protected:
- ModuelTestBaseBeforePreConfig() : ModuleTestBase()
- {
- return;
- }
-
- virtual void SetUp()
- {
- g_cfg_ = new struct mr_config();
- g_ctx_ = new struct mr_global_ctx();
- }
-
- virtual void TearDown()
- {
- delete g_cfg_;
- delete g_ctx_;
- }
-};
-
-/// ���Ի��࣬����ģ��Config�׶�ǰ�IJ���
-class ModuleTestBaseBeforeConfig : public ModuelTestBaseBeforePreConfig
-{
-protected:
- ModuleTestBaseBeforeConfig() : ModuelTestBaseBeforePreConfig() {}
-
- virtual void SetUp()
- {
- ModuelTestBaseBeforePreConfig::SetUp();
- ASSERT_EQ(call_preconfig(), 0);
- }
-};
-
-/// ���Ի��࣬����ģ��Init�׶�ǰ�IJ���
-class ModuleTestBaseBeforeInit : public ModuleTestBaseBeforeConfig
-{
-protected:
- ModuleTestBaseBeforeInit() : ModuleTestBaseBeforeConfig() {}
-
- virtual void SetUp()
- {
- ModuleTestBaseBeforeConfig::SetUp();
- ASSERT_EQ(call_config(), 0);
- }
-};
-
-/// ���Ի��࣬����ģ��Init�׶κ�IJ���
-class ModuleTestBaseAfterInit : public ModuleTestBaseBeforeInit
-{
-protected:
- ModuleTestBaseAfterInit() : ModuleTestBaseBeforeInit() {}
-
- virtual void SetUp()
- {
- ModuleTestBaseBeforeInit::SetUp();
- ASSERT_EQ(call_init(), 0);
- }
-};
diff --git a/test/create_veth.sh b/test/create_veth.sh
new file mode 100644
index 0000000..335cee1
--- /dev/null
+++ b/test/create_veth.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+function create_veth() {
+ ip link add veth$1 type veth peer name veth$1-ptf$1
+ ip link set veth$1 up
+ ip link set veth$1-ptf$1 up
+}
+
+function delete_veth() {
+ for i in $(seq 0 $(( $1 - 1 )))
+ do
+ ip link delete veth$i
+ echo "Deleted veth interface: veth$i"
+ done
+}
+
+if [[ "$1" == "create" ]]; then
+ if [ -z "$2" ]; then
+ echo "Usage: $0 create <number_of_veth_interfaces>"
+ exit 1
+ fi
+ for i in $(seq 0 $(( $2 - 1 )))
+ do
+ create_veth "$i"
+ echo "Created veth interface: veth$i"
+ done
+elif [[ "$1" == "delete" ]]; then
+ if [ -z "$2" ]; then
+ echo "Usage: $0 delete <number_of_veth_interfaces>"
+ exit 1
+ fi
+ delete_veth "$2"
+else
+ echo "Usage: $0 <create/delete> <number_of_veth_interfaces>"
+ exit 1
+fi
diff --git a/test/demo_test.py b/test/demo_test.py
new file mode 100644
index 0000000..fd2bb6b
--- /dev/null
+++ b/test/demo_test.py
@@ -0,0 +1,276 @@
+import ptf
+from ptf.base_tests import BaseTest
+from ptf import config
+from ptf.testutils import *
+from scapy.all import *
+from mrzcpd import Mrzcpd
+
+conf_demo = """
+[device]
+device = veth0,veth1,veth2,veth3,veth4,veth5,veth6,veth7,veth8,veth9,veth10,veth11,veth12,veth13,veth14,veth15,veth16,veth17,veth18,veth19,veth20,veth21,veth22,veth23
+sz_tunnel = 8192
+sz_buffer = 0
+
+[device:veth0]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth1]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth2]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth3]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth4]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth5]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth6]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth7]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth8]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth9]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth10]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth11]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth12]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth13]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth14]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth15]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth16]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth17]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth18]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth19]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth20]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth21]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth22]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[device:veth23]
+promisc = 1
+mtu = 1500
+driver = 2
+role = 1
+
+[service]
+iocore = 1
+distmode = 2
+hashmode = 0
+
+[eal]
+virtaddr = 0x600000000000
+loglevel = 7
+nohuge = 1
+mem = 65535
+
+[keepalive]
+check_spinlock = 1
+
+[ctrlzone]
+ctrlzone0 = tunnat, 64
+ctrlzone1 = vsys, 64
+
+[pool]
+create_mode = 3
+sz_direct_pktmbuf = 4096
+sz_indirect_pktmbuf = 4096
+sz_cache = 256
+sz_data = 3000
+
+[ctrlmsg]
+listen_addr = 0.0.0.0
+listen_port = 46789
+
+[rpc]
+addr = 127.0.0.1
+port = 56789
+
+# sid
+[etherfabric_adapters]
+sid_range_start=100
+sid_range_end=200
+max_rules=256
+
+[vwires]
+sid_range_start=300
+sid_range_end=400
+max_rules=256
+
+[service_lb]
+sid_range_start=1000
+sid_range_end=2000
+# vwire
+[vwire:0]
+interface_int = veth0
+interface_ext = veth1
+[vwire:1]
+interface_int = veth2
+interface_ext = veth3
+[vwire:2]
+interface_int = veth4
+interface_ext = veth5
+[vwire:3]
+interface_int = veth6
+interface_ext = veth7
+[vwire:4]
+interface_int = veth8
+interface_ext = veth9
+[vwire:5]
+interface_int = veth10
+interface_ext = veth11
+[vwire:6]
+interface_int = veth12
+interface_ext = veth13
+[vwire:7]
+interface_int = veth14
+interface_ext = veth15
+[vwire:8]
+interface_int = veth16
+interface_ext = veth17
+[vwire:9]
+interface_int = veth18
+interface_ext = veth19
+[vwire:10]
+interface_int = veth20
+interface_ext = veth21
+[vwire:11]
+interface_int = veth22
+interface_ext = veth23
+"""
+
+
+@group("demo_test")
+class TestSendAndReceive(BaseTest):
+ # Base test init
+ def __init__(self):
+ BaseTest.__init__(self)
+
+ # Dataplane set up
+ def setUp(self):
+ self.dataplane = ptf.dataplane_instance
+
+ # Run test
+ def runTest(self):
+ # Init & Start mrzcpd
+ mrzcpd = Mrzcpd(str(conf_demo))
+ mrzcpd.start()
+
+ # Create packet
+ pkt = simple_tcp_packet(eth_dst='00:11:11:11:11:11',
+ eth_src='00:22:22:22:22:22',
+ ip_dst='10.0.0.1',
+ ip_id=101,
+ ip_ttl=64)
+
+ # Traverse all ports
+ for i in range(0, 24, 2):
+ # Send pkt for the port
+ send_packet(self, i, pkt)
+ # Verify pkt for specified port
+ verify_packets(self, pkt, [i+1])
+
+ # Stop mrzcpd end test
+ mrzcpd.stop()
diff --git a/test/mrzcpd.py b/test/mrzcpd.py
new file mode 100644
index 0000000..d0d8cce
--- /dev/null
+++ b/test/mrzcpd.py
@@ -0,0 +1,49 @@
+import ptf
+import time
+import os
+import signal
+import subprocess
+import shutil
+from subprocess import Popen, PIPE
+
+mrzcpd_run_dir = "/var/run/mrzcpd"
+
+
+class Mrzcpd:
+ def __init__(self, conf):
+ self.conf = conf
+ self.mrzcpd_path = ptf.testutils.test_param_get(
+ "source_dir") + "/build/service/mrzcpd"
+ self.conf_path = ptf.testutils.test_param_get(
+ "source_dir") + "/test/mrglobal.conf"
+ self.file = open(self.conf_path, 'w')
+ self.file.write(self.conf)
+ self.file.close()
+
+ def start(self):
+ # Create run dir
+ if os.path.exists(mrzcpd_run_dir):
+ shutil.rmtree(mrzcpd_run_dir)
+ os.makedirs(mrzcpd_run_dir)
+
+ # Start mrzcpd
+ mrzcpd_process = Popen(
+ [self.mrzcpd_path, "-c", self.conf_path], stdout=subprocess.PIPE)
+
+ # Check mrzcpd status
+ start_timeout = 10
+ while start_timeout > 0:
+ if os.path.exists(mrzcpd_run_dir + "/mrmonit.daemon"):
+ break
+ else:
+ time.sleep(1)
+ start_timeout = start_timeout - 1
+
+ # Save mrzcpd pid
+ self.pid = mrzcpd_process.pid
+ print("start mrzcpd,pid is:", self.pid)
+
+ def stop(self):
+ print("stop mrzcpd,pid is:", self.pid)
+ os.kill(self.pid, signal.SIGKILL)
+ os.waitpid(self.pid, 0)