diff options
| author | songyanchao <[email protected]> | 2023-04-10 01:45:58 +0000 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2023-04-10 01:45:58 +0000 |
| commit | 689ca9421f1b057eeff25e1f4a609b7087e298c1 (patch) | |
| tree | 575dcbbf9e67180e053108441c060c55fea30ddf /test | |
| parent | 48f8f83281d516b06e05dc037391f4317baf823a (diff) | |
✨ feat(DPISDN-6): add ptf demo test
add ptf demo test
Diffstat (limited to 'test')
| -rw-r--r-- | test/CMakeLists.txt | 69 | ||||
| -rw-r--r-- | test/TestHwInfo.cc | 47 | ||||
| -rw-r--r-- | test/TestMask.cc | 34 | ||||
| -rw-r--r-- | test/TestMrbuf.cc | 163 | ||||
| -rw-r--r-- | test/TestStackNeigh.cc | 107 | ||||
| -rw-r--r-- | test/TestVMan.cc | 59 | ||||
| -rw-r--r-- | test/TestVNode.cc | 351 | ||||
| -rw-r--r-- | test/Unittest.cc | 59 | ||||
| -rw-r--r-- | test/Unittest.h | 114 | ||||
| -rw-r--r-- | test/create_veth.sh | 36 | ||||
| -rw-r--r-- | test/demo_test.py | 276 | ||||
| -rw-r--r-- | test/mrzcpd.py | 49 |
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) |
