From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 1A70DA04F7 for ; Tue, 17 Dec 2019 03:37:47 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 080EC2B91; Tue, 17 Dec 2019 03:37:47 +0100 (CET) Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) by dpdk.org (Postfix) with ESMTP id 2930A2BBE for ; Tue, 17 Dec 2019 03:37:45 +0100 (CET) Received: by mail-pf1-f195.google.com with SMTP id b19so6691326pfo.2 for ; Mon, 16 Dec 2019 18:37:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=nZ0zV+q1QJUdthkUxXZ0fAsjCL1XbcHRBxa6KTmvPpw=; b=q+3l/GN4he5kJhQbFTCd+1++PJlUEvHS0nFGee37Fpmlb6oeVVzRa0X+h3h15Vl3lI /zZnMX2WXcoJhIIKTRsuNAUg1t+pfMRCIaSf63QeavP8YwRrkRG5AX0f2w7cUZMWlpnm 8O03rQDPQCfMW0tSgEj6zgBt6E6lgA2omaZL4pZR+863/3j1yn45SiN7xpSPZlaoBvqH imOm1kuTxqj69OR4IAdCXBa1hn2VXzvGJjw+dL+1NAORky0jT2OB9B4yKsc8Roe8cTyi dOiqtWeWoh41FRCG++h2fYLsr36kImbqYtGfHjm4WDks2CP/yNmSAjrnIJjTnemDQrK7 zIXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=nZ0zV+q1QJUdthkUxXZ0fAsjCL1XbcHRBxa6KTmvPpw=; b=M7hyf0KcMxKri63WRMy//SzYkrrNObkjJa9Bjenw+mzeNGj4UM5dvXzNymYjzc635C LGS7UyjB3t37NyoDxARa832qXhm8E5F24P/lPLg5Gtyed1dwbzg6zAuvlngvAxUKr0JD be5OdQv3VQRY7SugQzOaU+l8i2egHEK7/B1tsMj1+NAIp8wGlwiKUhxe62lIz6U0O2O5 he3im9e7I2vmRnj0OckC0l9zvUn8HoD7PicgTfrvqbxvEPQnmd8sxS5WZTTeZilXvI0c AMc3f1OZGMWsYPoeXcMoqZ1ResyRkaaq/CWQiY79NQHWrzdKkgl94o1OTioHONA9REBB ofeg== X-Gm-Message-State: APjAAAVN7yvkGjMUlbve/HQYwJd2wln3VaWyx4xZ5lfiYAAAZKRhXzV+ +bS6M+6JkSq8vAQAwtfJLs9JT02Nw44= X-Google-Smtp-Source: APXvYqx6NIdZHBTBLIeGP5mG83xhyXpvAUQ6mgFQOKNFmt15KV2Ib609Gbq7zbxDpVHF6MEG+ha+EQ== X-Received: by 2002:a62:fc93:: with SMTP id e141mr19280998pfh.262.1576550264156; Mon, 16 Dec 2019 18:37:44 -0800 (PST) Received: from localhost.localdomain ([192.47.164.146]) by smtp.gmail.com with ESMTPSA id d23sm23664402pfo.176.2019.12.16.18.37.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Dec 2019 18:37:43 -0800 (PST) From: yasufum.o@gmail.com To: spp@dpdk.org, ferruh.yigit@intel.com, yasufum.o@gmail.com Date: Tue, 17 Dec 2019 11:37:30 +0900 Message-Id: <20191217023730.30477-4-yasufum.o@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191217023730.30477-1-yasufum.o@gmail.com> References: <20191217023730.30477-1-yasufum.o@gmail.com> Subject: [spp] [PATCH 3/3] test: add test for spp_primary X-BeenThere: spp@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Soft Patch Panel List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: spp-bounces@dpdk.org Sender: "spp" From: Yasufumi Ogawa This patch is to add a unit test code for spp_primary. Test cases are defined by following SPP REST API as similar to spp_nfv. Unit tests are expected to be run in the `test` dir. Specify the name of test if you run tests for a process, or all processes without the name. $ cd /path/to/spp/test $ python3 -m unittest test_spp_primary # test only spp_primary # or $ python3 -m unittest # test all Signed-off-by: Yasufumi Ogawa --- test/test_spp_nfv.py | 24 +++--- test/test_spp_primary.py | 177 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 189 insertions(+), 12 deletions(-) create mode 100644 test/test_spp_primary.py diff --git a/test/test_spp_nfv.py b/test/test_spp_nfv.py index 1376df7..cf2cae4 100644 --- a/test/test_spp_nfv.py +++ b/test/test_spp_nfv.py @@ -5,10 +5,10 @@ import configparser import json import requests import time -import unittest +from unittest import TestCase -class TestSppNfv(unittest.TestCase): +class TestSppNfv(TestCase): """Test spp_nfv. Test as following the REST API reference. It does not include terminating @@ -58,7 +58,7 @@ class TestSppNfv(unittest.TestCase): sec_id=self.default_sec_id) response = requests.delete(url) - def _get_status(self): + def _get_nfv_status(self): """Get status of default spp_nfv process.""" url = "{baseurl}/{sec_type}/{sec_id}".format( @@ -102,11 +102,11 @@ class TestSppNfv(unittest.TestCase): def _assert_add_del_port(self, port): self._add_port(port) - nfv = self._get_status() + nfv = self._get_nfv_status() self.assertTrue(port in nfv['ports']) self._del_port(port) - nfv = self._get_status() + nfv = self._get_nfv_status() self.assertFalse(port in nfv['ports']) def _patch(self, src, dst): @@ -138,28 +138,28 @@ class TestSppNfv(unittest.TestCase): def test_sec_id(self): """Confirm sec ID is expected value.""" - nfv = self._get_status() + nfv = self._get_nfv_status() self.assertEqual(nfv['client-id'], 1) def test_forward_stop(self): """Confirm forwarding is started and stopped.""" self._set_forwarding_status('start') - nfv = self._get_status() + nfv = self._get_nfv_status() self.assertEqual(nfv['status'], 'running') self._set_forwarding_status('stop') - nfv = self._get_status() + nfv = self._get_nfv_status() self.assertEqual(nfv['status'], 'idling') def test_add_del_ring(self): - """Check if ring PMD is added.""" + """Check if ring PMD is added and deleted.""" port = 'ring:0' self._assert_add_del_port(port) def test_add_del_vhost(self): - """Check if vhost PMD is added.""" + """Check if vhost PMD is added and deleted.""" port = 'vhost:1' self._assert_add_del_port(port) @@ -179,11 +179,11 @@ class TestSppNfv(unittest.TestCase): for port in ports: self._add_port(port) self._patch(ports[0], ports[1]) - nfv = self._get_status() + nfv = self._get_nfv_status() self.assertTrue({'src': ports[0], 'dst': ports[1]} in nfv['patches']) self._reset_patches() - nfv = self._get_status() + nfv = self._get_nfv_status() self.assertEqual(nfv['patches'], []) for port in ports: diff --git a/test/test_spp_primary.py b/test/test_spp_primary.py new file mode 100644 index 0000000..c93ac85 --- /dev/null +++ b/test/test_spp_primary.py @@ -0,0 +1,177 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Nippon Telegraph and Telephone Corporation + +import configparser +import json +import requests +import time +from unittest import TestCase + + +class TestSppPrimary(TestCase): + """Test spp_primary. + + Test sernarios are following the REST API reference. + """ + + def setUp(self): + """Initialization before the tests.""" + + self.config = configparser.ConfigParser() + self.config.read('config.ini') + + host = self.config['spp-ctl']['host'] + ctl_api_port = self.config['spp-ctl']['ctl_api_port'] + api_version = self.config['spp-ctl']['api_version'] + + self.base_url = 'http://{host}:{port}/{api_ver}'.format( + host=host, port=ctl_api_port, api_ver=api_version) + + def tearDown(self): + """Finalization.""" + + pass + + def _get_status(self): + """Get status of default spp_primary process.""" + + url = "{baseurl}/primary/status".format( + baseurl=self.base_url) + response = requests.get(url) + return response.json() + + def _set_forwarding_status(self, action): + """Set forwarding status as start or stop.""" + + if action in ['start', 'stop']: + url = "{baseurl}/primary/forward".format( + baseurl=self.base_url) + params = {'action': action} + response = requests.put(url, data=json.dumps(params)) + return True + else: + return False + + def _add_or_del_port(self, action, res_uid): + if action in ['add', 'del']: + url = "{baseurl}/primary/ports".format( + baseurl=self.base_url) + params = {'action': action, 'port': res_uid} + requests.put(url, data=json.dumps(params)) + return True + else: + return False + + def _add_port(self, res_uid): + self._add_or_del_port('add', res_uid) + + def _del_port(self, res_uid): + self._add_or_del_port('del', res_uid) + + def _assert_add_del_port(self, port): + self._add_port(port) + stat = self._get_status() + self.assertTrue(port in stat['forwarder']['ports']) + + self._del_port(port) + stat = self._get_status() + self.assertFalse(port in stat['forwarder']['ports']) + + def _patch(self, src, dst): + """Set patch between given ports.""" + + url = "{baseurl}/primary/patches".format( + baseurl=self.base_url) + params = {'src': src, 'dst': dst} + requests.put(url, data=json.dumps(params)) + + def _reset_patches(self): + url = "{baseurl}/primary/patches".format( + baseurl=self.base_url) + requests.delete(url) + + # Test methods for testing spp_primary from here. + def test_forward_stop(self): + """Confirm forwarding is started and stopped.""" + + self._set_forwarding_status('start') + stat = self._get_status() + self.assertEqual(stat['forwarder']['status'], 'running') + + self._set_forwarding_status('stop') + stat = self._get_status() + self.assertEqual(stat['forwarder']['status'], 'idling') + + def test_add_del_ring(self): + """Check if ring PMD is added or deleted.""" + + port = 'ring:0' + self._assert_add_del_port(port) + + def test_add_del_vhost(self): + """Check if vhost PMD is added or deleted.""" + + port = 'vhost:1' + self._assert_add_del_port(port) + + def test_add_del_pcap(self): + """Check if pcap PMD is added or deleted.""" + + # TODO(yasufum): pcap cannot be adde because I do not know why... + port = 'pcap:1' + pass + + def test_make_patch(self): + """Check if patch between ports is created and reseted.""" + + ports = ['ring:1', 'ring:2'] + + for port in ports: + self._add_port(port) + self._patch(ports[0], ports[1]) + stat = self._get_status() + self.assertTrue( + {'src': ports[0], 'dst': ports[1]} in stat['forwarder']['patches']) + + self._reset_patches() + stat = self._get_status() + self.assertEqual(stat['forwarder']['patches'], []) + + for port in ports: + self._del_port(port) + + def test_forwarding(self): + """Check if forwarding packet is counted up. + + This test confirm that packet counter on ring PMD is counted up + after forwarding is started. It waits about 1sec so that + certain amount of packets are forwarded. + """ + + wait_time = 1 # sec, wait for forwarding + ring_idx = 1 + ports = { + 'src': 'nullpmd:1', + 'dst': 'nullpmd:2', + 'ring': 'ring:{}'.format(ring_idx) + } + + for port in ports.values(): + self._add_port(port) + + self._patch(ports['src'], ports['ring']) + self._patch(ports['ring'], ports['dst']) + self._set_forwarding_status('start') + + # NOTE: this test is failed if sleep time is too small. + time.sleep(wait_time) # wait to start forwarding + + self._set_forwarding_status('stop') + self._reset_patches() + for port in ports.values(): + self._del_port(port) + + pri = self._get_status() + + self.assertTrue(pri['ring_ports'][ring_idx]['rx'] > 0) + self.assertTrue(pri['ring_ports'][ring_idx]['tx'] > 0) -- 2.17.1