From: yasufum.o@gmail.com
To: spp@dpdk.org, ferruh.yigit@intel.com, yasufum.o@gmail.com
Subject: [spp] [PATCH 3/3] test: add test for spp_primary
Date: Tue, 17 Dec 2019 11:37:30 +0900 [thread overview]
Message-ID: <20191217023730.30477-4-yasufum.o@gmail.com> (raw)
In-Reply-To: <20191217023730.30477-1-yasufum.o@gmail.com>
From: Yasufumi Ogawa <yasufum.o@gmail.com>
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 <yasufum.o@gmail.com>
---
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
prev parent reply other threads:[~2019-12-17 2:37 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-17 2:37 [spp] [PATCH 0/3] Introduce unit test for SPP processes yasufum.o
2019-12-17 2:37 ` [spp] [PATCH 1/3] test: add test for spp_nfv yasufum.o
2019-12-17 2:37 ` [spp] [PATCH 2/3] test: add spp_nfv test for forwarding yasufum.o
2019-12-17 2:37 ` yasufum.o [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191217023730.30477-4-yasufum.o@gmail.com \
--to=yasufum.o@gmail.com \
--cc=ferruh.yigit@intel.com \
--cc=spp@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).