summaryrefslogtreecommitdiffstats
path: root/vstf/vstf/agent/unittest/perf
diff options
context:
space:
mode:
Diffstat (limited to 'vstf/vstf/agent/unittest/perf')
-rwxr-xr-xvstf/vstf/agent/unittest/perf/Readme7
-rwxr-xr-xvstf/vstf/agent/unittest/perf/__init__.py14
-rwxr-xr-xvstf/vstf/agent/unittest/perf/model.py46
-rwxr-xr-xvstf/vstf/agent/unittest/perf/run_test.py32
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_ethtool.py42
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_netns.py67
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_netperf.py105
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_pktgen.py90
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_qperf.py102
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_utils.py31
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_vnstat.py57
-rwxr-xr-xvstf/vstf/agent/unittest/perf/test_vstfperf.py98
12 files changed, 691 insertions, 0 deletions
diff --git a/vstf/vstf/agent/unittest/perf/Readme b/vstf/vstf/agent/unittest/perf/Readme
new file mode 100755
index 00000000..3ebe6c49
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/Readme
@@ -0,0 +1,7 @@
+To enable Perf unittest, please make sure:
+
+ 1. you have setup a "Tn virtual network" on Target Host, so you can ping from one nic to the other nic.
+ 2. change options in "unittest/configuration.py".
+
+run tests:
+ python run_test.py \ No newline at end of file
diff --git a/vstf/vstf/agent/unittest/perf/__init__.py b/vstf/vstf/agent/unittest/perf/__init__.py
new file mode 100755
index 00000000..89dcd4e2
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/__init__.py
@@ -0,0 +1,14 @@
+# Copyright Huawei Technologies Co., Ltd. 1998-2015.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the License); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an AS IS BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
diff --git a/vstf/vstf/agent/unittest/perf/model.py b/vstf/vstf/agent/unittest/perf/model.py
new file mode 100755
index 00000000..6383ae0c
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/model.py
@@ -0,0 +1,46 @@
+"""
+Created on 2015-9-25
+
+@author: y00228926
+"""
+import unittest
+
+from vstf.agent.unittest import configuration
+from vstf.agent.perf import netns
+
+
+class LocalModel(unittest.TestCase):
+ def _ping(self):
+ device_list, ns_list, ip_setting_list, ip_list = self.device_list, self.ns_list, self.ip_setting_list, self.ip_list
+ for ns, dev, ip_setting in zip(ns_list, device_list, ip_setting_list):
+ netdev = {
+ "namespace": ns,
+ "iface": dev,
+ 'ip_setting': ip_setting
+ }
+ self.mgr.config_dev(netdev)
+ ip_list_copy = ip_list[:]
+ ip_list_copy.reverse()
+ for ns, ip in zip(ns_list, ip_list_copy):
+ self.assertTrue(sself.mgr.ping(ns, ip), True)
+ self.mgr.clean_all_namespace()
+
+ def setUp(self):
+ # make sure you have set up Tn loop on the "Target Host"
+ self.mgr = netns.NetnsManager()
+ self.mgr.clean_all_namespace()
+ self.device_list = configuration.eth_for_test
+ self.mac_list = configuration.mac_of_eth
+ self.ns_list = ['send', 'receive']
+ self.ip_setting_list = ['192.168.1.1/24', '192.168.1.2/24']
+ self.ip_list = ['192.168.1.1', '192.168.1.2']
+
+ def tearDown(self):
+ self.mgr.clean_all_namespace()
+
+
+class Model(LocalModel):
+ def setUp(self):
+ # make sure you have set up Tn loop on the "Target Host"
+ super(Model, self).setUp()
+ self._ping()
diff --git a/vstf/vstf/agent/unittest/perf/run_test.py b/vstf/vstf/agent/unittest/perf/run_test.py
new file mode 100755
index 00000000..684ca183
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/run_test.py
@@ -0,0 +1,32 @@
+"""
+Created on 2015-9-24
+
+@author: y00228926
+"""
+import unittest
+import importlib
+
+test_order_list = [
+ "vstf.agent.unittest.perf.test_utils",
+ "vstf.agent.unittest.perf.test_netns",
+ "vstf.agent.unittest.perf.test_netperf",
+ "vstf.agent.unittest.perf.test_qperf",
+ "vstf.agent.unittest.perf.test_pktgen",
+ "vstf.agent.unittest.perf.test_vstfperf",
+]
+
+
+def main():
+ import logging
+ logging.getLogger(__name__)
+ logging.basicConfig(level=logging.DEBUG)
+ suite = unittest.TestSuite()
+ for mod_name in test_order_list:
+ mod = importlib.import_module(mod_name)
+ suit = unittest.TestLoader().loadTestsFromModule(mod)
+ suite.addTest(suit)
+ unittest.TextTestRunner().run(suite)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/vstf/vstf/agent/unittest/perf/test_ethtool.py b/vstf/vstf/agent/unittest/perf/test_ethtool.py
new file mode 100755
index 00000000..48e0d7f6
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/test_ethtool.py
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+# -*- coding: utf8 -*-
+# author: wly
+# date: 2015/11/13
+# see license for license details
+
+import unittest
+import logging
+from vstf.agent.perf import ethtool
+from vstf.agent.unittest import configuration
+from vstf.common.log import setup_logging
+
+
+LOG = logging.getLogger(__name__)
+
+
+class Testethtool(unittest.TestCase):
+ def setUp(self):
+ LOG.info("start Testethtool unit test.")
+ self._devices = configuration.eth_for_test
+ super(Testethtool, self).setUp()
+
+ def teardown(self):
+ LOG.info("stop Testethtool unit test.")
+
+# @unittest.skip('for now')
+ def test_autoneg_on(self):
+ for dev in self._devices:
+ self.assertTrue(ethtool.autoneg_on(dev), True)
+
+ def test_autoneg_off(self):
+ for dev in self._devices:
+ self.assertTrue(ethtool.autoneg_off(dev), True)
+
+ def test_autoneg_query(self):
+ for dev in self._devices:
+ result = ethtool.autoneg_query(dev)
+ LOG.info(result)
+
+if __name__ == "__main__":
+ setup_logging(level=logging.INFO, log_file="/var/log/vstf/vstf-unit-test.log", clevel=logging.INFO)
+ unittest.main()
diff --git a/vstf/vstf/agent/unittest/perf/test_netns.py b/vstf/vstf/agent/unittest/perf/test_netns.py
new file mode 100755
index 00000000..912358bd
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/test_netns.py
@@ -0,0 +1,67 @@
+"""
+Created on 2015-9-23
+
+@author: y00228926
+"""
+import unittest
+
+from vstf.agent.unittest.perf import model
+from vstf.agent.perf import netns
+
+
+class TestNetnsManager(model.Model):
+ def setUp(self):
+ super(TestNetnsManager, self).setUp()
+ self.ns = netns.Netns()
+
+ def tearDown(self):
+ super(TestNetnsManager, self).tearDown()
+
+ def testNetns(self):
+ device_list,ns_list,ip_setting_list,ip_list = self.device_list,self.ns_list,self.ip_setting_list,self.ip_list
+ net = self.ns
+ for ns in ns_list:
+ self.assertTrue(net.create_namespace(ns),'create_namespace failed')
+ for ns,dev,ip_setting in zip(ns_list,device_list,ip_setting_list):
+ self.assertTrue(net.add_device(ns, dev),'add_device failed')
+ self.assertTrue(net.activate_device(ns,dev),'activate_device failed')
+ self.assertTrue(net.config_ip(ns,dev,ip_setting),'config_ip failed')
+ for ns in ns_list:
+ self.assertTrue(net.remove_namespace(ns),'remove_namespace failed')
+
+ def testNetNsManager(self):
+ mgr = self.mgr
+ device_list,ns_list,ip_setting_list,ip_list = self.device_list,self.ns_list,self.ip_setting_list,self.ip_list
+ for ns,dev,ip_setting in zip(ns_list,device_list,ip_setting_list):
+ netdev = {
+ "namespace":ns,
+ "iface":dev,
+ 'ip_setting':ip_setting
+ }
+ ret = mgr.config_dev(netdev)
+ self.assertTrue(ret,"config_dev failed, netdev=%s" % netdev)
+
+ for ns,dev,ip_setting in zip(ns_list,device_list,ip_setting_list):
+ netdev = {
+ "namespace":ns,
+ "iface":dev,
+ 'ip_setting':ip_setting
+ }
+ self.assertTrue(mgr.recover_dev(netdev),"recover_dev failed, netdev=%s" % netdev)
+
+ for ns,dev,ip_setting in zip(ns_list,device_list,ip_setting_list):
+ netdev = {
+ "namespace":ns,
+ "iface":dev,
+ 'ip_setting':ip_setting
+ }
+ self.assertTrue(mgr.config_dev(netdev),"config_dev failed, netdev=%s" % netdev)
+ self.assertTrue(mgr.clean_all_namespace(),'remove_namespace failed')
+
+
+if __name__ == "__main__":
+ import logging
+ LOG = logging.getLogger(__name__)
+ logging.basicConfig(level = logging.DEBUG)
+ #import sys;sys.argv = ['', 'Test.testName']
+ unittest.main() \ No newline at end of file
diff --git a/vstf/vstf/agent/unittest/perf/test_netperf.py b/vstf/vstf/agent/unittest/perf/test_netperf.py
new file mode 100755
index 00000000..b5f8cb2a
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/test_netperf.py
@@ -0,0 +1,105 @@
+'''
+Created on 2015-9-24
+
+@author: y00228926
+'''
+import unittest
+import time
+import subprocess
+
+from vstf.agent.unittest.perf import model
+from vstf.agent.perf import netperf
+from vstf.agent.perf.utils import get_pid_by_name
+
+
+class TestNetperf(model.Model):
+ '''
+ please make sure 'Tn' network on 'Target Host' is created.
+ '''
+ def setUp(self):
+ super(TestNetperf, self).setUp()
+ subprocess.call("killall netperf", shell = True)
+ subprocess.call("killall netserver",shell = True)
+ for ns, dev, ip_setting in zip(self.ns_list, self.device_list, self.ip_setting_list):
+ netdev = {
+ "namespace":ns,
+ "iface":dev,
+ 'ip_setting':ip_setting
+ }
+ self.mgr.config_dev(netdev)
+ self.send_cfg = {
+ "namespace": "send",
+ "protocol": "udp_bw",
+ "dst":[
+ {"ip": "192.168.1.2"}
+ ],
+ "size": 64,
+ "threads": 1,
+ "time": 10,
+ }
+
+ def tearDown(self):
+ super(TestNetperf, self).tearDown()
+
+ def test_netperf_start_success(self):
+ perf = netperf.Netperf()
+ ret = perf.receive_start(namespace='receive')
+ exp = (0, 'start netserver success')
+ self.assertEqual(ret, exp, "receive_start failed %s" % str(ret))
+
+ ret = perf.send_start(**self.send_cfg)
+ exp = (0,"start netperf send success")
+ self.assertEqual(ret, exp, "failed to start netperf")
+
+ time.sleep(3)
+
+ ret = perf.send_stop()
+ exp = [(0, "process is stopped by killed")]
+ self.assertEqual(ret, exp, "send_stop failed, ret = %s" % str(ret))
+
+ ret = perf.receive_stop()
+ exp = (0, "stop netserver success")
+ self.assertEqual(ret, exp, "receive_stop failedf, ret = %s" % str(ret))
+
+ def test_netperf_start_success_mutil_threads(self):
+ perf = netperf.Netperf()
+ ret = perf.receive_start(namespace='receive')
+ exp = (0, 'start netserver success')
+ self.assertEqual(ret, exp, "receive_start failed %s" % str(ret))
+
+ self.send_cfg.update({"threads":3})
+ exp = (0,"start netperf send success")
+ ret = perf.send_start(**self.send_cfg)
+ self.assertEqual(ret, exp, "failed to start netperf")
+
+ time.sleep(3)
+
+ rets = perf.send_stop()
+ exp = [(0, 'process is stopped by killed'), (0, 'process is stopped by killed'), (0, 'process is stopped by killed')]
+ self.assertEqual(rets, exp, "send_stop failed, rets = %s" % str(rets))
+
+ rets = perf.receive_stop()
+ self.assertEqual(rets, (0, "stop netserver success"), "receive_stop failedf, rets = %s" % str(rets))
+
+ def test_clean(self):
+ perf = netperf.Netperf()
+ ret = perf.receive_start(namespace='receive')
+ exp = (0, 'start netserver success')
+ self.assertEqual(ret, exp, "receive_start failed %s" % str(ret))
+
+ self.send_cfg.update({"threads":3})
+ exp = (0,"start netperf send success")
+ ret = perf.send_start(**self.send_cfg)
+ self.assertEqual(ret, exp, "failed to start netperf")
+ perf.clean()
+ ret = get_pid_by_name('netperf')
+ self.assertEqual(ret, [], "failed to clean netperf")
+ ret = get_pid_by_name('netserver')
+ self.assertEqual(ret, [], "failed to clean netserver")
+
+if __name__ == "__main__":
+ import logging
+ logging.getLogger(__name__)
+ logging.basicConfig(level = logging.DEBUG)
+ #import sys;sys.argv = ['', 'Test.testName']
+ unittest.main() \ No newline at end of file
diff --git a/vstf/vstf/agent/unittest/perf/test_pktgen.py b/vstf/vstf/agent/unittest/perf/test_pktgen.py
new file mode 100755
index 00000000..5e6cdf76
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/test_pktgen.py
@@ -0,0 +1,90 @@
+"""
+Created on 2015-9-24
+
+@author: y00228926
+"""
+import unittest
+import time
+
+from vstf.agent.unittest.perf import model
+from vstf.agent.perf import pktgen
+
+
+class TestPktgen(model.Model):
+ def setUp(self):
+ super(TestPktgen, self).setUp()
+
+ def tearDown(self):
+ super(TestPktgen, self).tearDown()
+
+ def test_single_thread(self):
+ perf = pktgen.Pktgen()
+ print perf.receive_start()
+ send = {
+ "src": [
+ {"iface": self.device_list[0], "mac": self.mac_list[0]}
+ ],
+ "dst": [
+ {"mac": self.mac_list[1]}
+ ],
+ "size": 64,
+ "threads": 1,
+ 'ratep': 0
+ }
+ ret = perf.send_start(**send)
+ self.assertEqual((0, 'start pktgen send success'), ret, "send_start failed, ret=%s" % str(ret))
+ time.sleep(5)
+ ret = perf.send_stop()
+ self.assertEqual([(0, '')], ret, "send_start failed, ret=%s" % ret)
+ ret = perf.receive_stop()
+ self.assertEqual((0, 'pktgen neednt receive stop'), ret, "send_stop failed, ret=%s" % str(ret))
+
+ def test_single_thread_bidirectional(self):
+ perf = pktgen.Pktgen()
+ print perf.receive_start()
+ send = {
+ "src": [
+ {"iface": self.device_list[0], "mac": self.mac_list[0]},
+ {"iface": self.device_list[1], "mac": self.mac_list[1]}
+ ],
+ "dst": [
+ {"mac": self.mac_list[1]},
+ {"mac": self.mac_list[0]}
+ ],
+ "size": 64,
+ "threads": 1,
+ 'ratep': 0
+ }
+ ret = perf.send_start(**send)
+ self.assertEqual((0, 'start pktgen send success'), ret, "send_start failed, ret=%s" % str(ret))
+ time.sleep(5)
+ ret = perf.send_stop()
+ self.assertEqual([(0, '')], ret, "send_start failed, ret=%s" % ret)
+ ret = perf.receive_stop()
+ self.assertEqual((0, 'pktgen neednt receive stop'), ret, "send_stop failed, ret=%s" % str(ret))
+
+ def test_clean(self):
+ perf = pktgen.Pktgen()
+ print perf.receive_start()
+ send = {
+ "src": [
+ {"iface": self.device_list[0], "mac": self.mac_list[0]}
+ ],
+ "dst": [
+ {"mac": self.mac_list[1]}
+ ],
+ "size": 64,
+ "threads": 1,
+ 'ratep': 0
+ }
+ ret = perf.send_start(**send)
+ self.assertEqual((0, 'start pktgen send success'), ret, "send_start failed, ret=%s" % str(ret))
+ perf.clean()
+
+
+if __name__ == "__main__":
+ import logging
+
+ logging.getLogger(__name__)
+ logging.basicConfig(level=logging.DEBUG)
+ unittest.main()
diff --git a/vstf/vstf/agent/unittest/perf/test_qperf.py b/vstf/vstf/agent/unittest/perf/test_qperf.py
new file mode 100755
index 00000000..ec9a290d
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/test_qperf.py
@@ -0,0 +1,102 @@
+'''
+Created on 2015-9-24
+
+@author: y00228926
+'''
+import unittest
+import subprocess
+import time
+
+from vstf.agent.unittest.perf import model
+from vstf.agent.perf import qperf
+from vstf.agent.perf.utils import get_pid_by_name
+
+
+class testQperf(model.Model):
+ def setUp(self):
+ super(testQperf, self).setUp()
+ subprocess.call("killall qperf", shell = True)
+ for ns, dev, ip_setting in zip(self.ns_list, self.device_list, self.ip_setting_list):
+ netdev = {
+ "namespace":ns,
+ "iface":dev,
+ 'ip_setting':ip_setting
+ }
+ self.mgr.config_dev(netdev)
+ self.send_cfg = {
+ "namespace": self.ns_list[0],
+ "time":1,
+ "protocol": "udp_lat",
+ "dst":[
+ {"ip": self.ip_list[1]}
+ ],
+ "size": 64,
+ }
+
+ def tearDown(self):
+ super(testQperf, self).tearDown()
+
+ def test_qperf_quick(self):
+ perf = qperf.Qperf()
+ ret = perf.receive_start(namespace=self.ns_list[1])
+ exp = (0, "start qperf receive success")
+ self.assertEqual(ret, exp, "receive_start failed %s" % str(ret))
+
+ ret = perf.send_start(**self.send_cfg)
+ exp = (0,"start qperf send success")
+ self.assertEqual(ret, exp, "send_start failed")
+
+ time.sleep(3)
+
+ ret = perf.send_stop()
+ for r in ret:
+ self.assertEqual(r[0], 0, "send_stop failed, ret = %s" % str(ret))
+ for key in ('MaximumLatency', 'AverageLatency', 'MinimumLatency'):
+ self.assertIn(key, r[1], "send_stop failed, ret = %s" % str(ret))
+
+ ret = perf.receive_stop()
+ exp = (0, "stop qperf receive success")
+ self.assertEqual(ret, exp, "receive_stop failed, ret = %s" % str(ret))
+
+ def test_qperf_quick_3s(self):
+ perf = qperf.Qperf()
+ self.send_cfg.update({"time":3})
+ ret = perf.receive_start(namespace='receive')
+ exp = (0, 'start qperf receive success')
+ self.assertEqual(ret, exp, "receive_start failed %s" % str(ret))
+
+ self.send_cfg.update({"threads":3})
+ exp = (0,"start qperf send success")
+ ret = perf.send_start(**self.send_cfg)
+ self.assertEqual(ret, exp, "send_start failed %s" % str(ret))
+
+ ret = perf.send_stop()
+ for r in ret:
+ self.assertEqual(r[0], 0, "send_stop failed, ret = %s" % str(ret))
+ for key in ('MaximumLatency', 'AverageLatency', 'MinimumLatency'):
+ self.assertIn(key, r[1], "send_stop failed, ret = %s" % str(ret))
+
+ ret = perf.receive_stop()
+ self.assertEqual(ret, (0, 'stop qperf receive success'), "receive_stop failedf, ret = %s" % str(ret))
+
+ def test_clean(self):
+ perf = qperf.Qperf()
+ self.send_cfg.update({"time":10})
+ ret = perf.receive_start(namespace=self.ns_list[1])
+ exp = (0, "start qperf receive success")
+ self.assertEqual(ret, exp, "receive_start failed %s" % str(ret))
+
+ ret = perf.send_start(**self.send_cfg)
+ exp = (0,"start qperf send success")
+ self.assertEqual(ret, exp, "send_start failed")
+
+ perf.clean()
+ ret = get_pid_by_name('qperf')
+ self.assertEqual(ret, [], "clean qperf failed")
+
+
+if __name__ == "__main__":
+ import logging
+ logging.getLogger(__name__)
+ logging.basicConfig(level = logging.DEBUG)
+ unittest.main() \ No newline at end of file
diff --git a/vstf/vstf/agent/unittest/perf/test_utils.py b/vstf/vstf/agent/unittest/perf/test_utils.py
new file mode 100755
index 00000000..83410c54
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/test_utils.py
@@ -0,0 +1,31 @@
+"""
+Created on 2015-9-24
+
+@author: y00228926
+"""
+import unittest
+from vstf.common import utils
+
+
+class TestUtils(unittest.TestCase):
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_ns_cmd(self):
+ cmd = "ls"
+ ns = "xx"
+ exp_cmd = "ip netns exec xx ls"
+ ret = utils.ns_cmd(ns, cmd)
+ self.assertEqual(ret, exp_cmd, "ns_cmd failed to add ns header prefix:%s != %s" % (ret, exp_cmd))
+
+
+if __name__ == "__main__":
+ import logging
+
+ logging.getLogger(__name__)
+ logging.basicConfig(level=logging.DEBUG)
+ # import sys;sys.argv = ['', 'Test.testName']
+ unittest.main()
diff --git a/vstf/vstf/agent/unittest/perf/test_vnstat.py b/vstf/vstf/agent/unittest/perf/test_vnstat.py
new file mode 100755
index 00000000..f7c31f5b
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/test_vnstat.py
@@ -0,0 +1,57 @@
+"""
+Created on 2015-9-23
+
+@author: y00228926
+"""
+import unittest
+import time
+
+from vstf.agent.perf.utils import get_pid_by_name
+from vstf.agent.unittest.perf import model
+from vstf.agent.perf import vnstat
+
+
+class TestVnstat(model.LocalModel):
+ def setUp(self):
+ super(TestVnstat, self).setUp()
+ self.vnstat = vnstat.VnStat()
+ self.namespace = self.ns_list[0]
+ self.device = self.device_list[0]
+ self.ip_setting = self.ip_setting_list[0]
+ netdev = {
+ "namespace": self.namespace,
+ "iface": self.device,
+ 'ip_setting': self.ip_setting
+ }
+ self.mgr.config_dev(netdev)
+
+ def tearDown(self):
+ super(TestVnstat, self).tearDown()
+
+ def test_run_vnstat(self):
+ logging.basicConfig(level=logging.DEBUG)
+ pid = self.vnstat.run_vnstat(self.device, self.namespace)
+ time.sleep(12)
+ raw = self.vnstat.kill_vnstat(pid, self.namespace)
+ print raw['raw_data']
+ data = self.vnstat.process(raw['raw_data'])
+ self.assertTrue(type(data) is dict)
+ for key in ('rxmB/s', 'txmB', 'rxpck', 'txpck', \
+ 'rxpck_min/s', 'txmB_max/s', 'txpck_max/s', \
+ 'txmB/s', 'rxmB', 'rxmB_max/s', 'rxpck/s', 'rxmB_min/s', \
+ 'time', 'rxpck_max/s', 'txpck_min/s', 'txpck/s', 'txmB_min/s'):
+ self.assertTrue(key in data)
+
+ def test_clean(self):
+ self.vnstat.run_vnstat(self.device, self.namespace)
+ self.vnstat.clean()
+ self.assertTrue(get_pid_by_name('vnstat') == [])
+
+
+if __name__ == "__main__":
+ import logging
+
+ LOG = logging.getLogger(__name__)
+ logging.basicConfig(level=logging.DEBUG)
+ # import sys;sys.argv = ['', 'Test.testName']
+ unittest.main()
diff --git a/vstf/vstf/agent/unittest/perf/test_vstfperf.py b/vstf/vstf/agent/unittest/perf/test_vstfperf.py
new file mode 100755
index 00000000..30d7c7fd
--- /dev/null
+++ b/vstf/vstf/agent/unittest/perf/test_vstfperf.py
@@ -0,0 +1,98 @@
+"""
+Created on 2015-9-28
+
+@author: y00228926
+"""
+import unittest
+
+from vstf.agent.perf.vstfperf import Vstfperf
+from vstf.agent.unittest.perf import model
+
+
+class Test(model.Model):
+ def setUp(self):
+ super(Test, self).setUp()
+
+ for ns, dev, ip_setting in zip(self.ns_list, self.device_list, self.ip_setting_list):
+ net_dev = {
+ "namespace":ns,
+ "iface":dev,
+ 'ip_setting':ip_setting
+ }
+ self.mgr.config_dev(net_dev)
+
+ self.start = {
+ "operation": "start",
+ "action": "send",
+ "tool": "netperf",
+ "params":{
+ "namespace": self.ns_list[0],
+ "protocol": "tcp_lat",
+ "dst":[
+ {"ip": self.ip_list[1]}
+ ],
+ "size": 64,
+ "threads": 1,
+ "time": 1,
+ },
+ }
+ self.stop = {
+ "operation": "stop",
+ "action": "send",
+ "tool": "netperf",
+ "params":{
+ "namespace": self.ns_list[1],
+ },
+ }
+
+ def tearDown(self):
+ super(Test, self).tearDown()
+
+ def testNetperf(self):
+ perf = Vstfperf()
+ self.start['tool'] = 'netperf'
+ self.stop['tool'] = 'netperf'
+ self.start['action'] = 'receive'
+ self.start['operation'] = 'start'
+ self.start['params']['namespace'] = self.ns_list[1]
+ self.start['params']['protocol'] = 'udp_bw'
+ perf.run(**self.start)
+ self.start['action'] = 'send'
+ self.start['operation'] = 'start'
+ self.start['params']['namespace'] = self.ns_list[0]
+ perf.run(**self.start)
+ self.stop['action'] = 'send'
+ self.stop['operation'] = 'stop'
+ self.stop['params']['namespace'] = self.ns_list[0]
+ perf.run(**self.stop)
+ self.stop['action'] = 'receive'
+ self.stop['operation'] = 'stop'
+ self.stop['params']['namespace'] = self.ns_list[1]
+ perf.run(**self.stop)
+
+ def testQperf(self):
+ perf = Vstfperf()
+ self.start['tool'] = 'qperf'
+ self.stop['tool'] = 'qperf'
+ self.start['action'] = 'receive'
+ self.start['operation'] = 'start'
+ self.start['params']['namespace'] = self.ns_list[1]
+ perf.run(**self.start)
+ self.start['action'] = 'send'
+ self.start['operation'] = 'start'
+ self.start['params']['namespace'] = self.ns_list[0]
+ perf.run(**self.start)
+ self.stop['action'] = 'send'
+ self.stop['operation'] = 'stop'
+ self.stop['params']['namespace'] = self.ns_list[0]
+ perf.run(**self.stop)
+ self.stop['action'] = 'receive'
+ self.stop['operation'] = 'stop'
+ self.stop['params']['namespace'] = self.ns_list[1]
+ perf.run(**self.stop)
+
+
+if __name__ == "__main__":
+ import logging
+ logging.basicConfig(level = logging.DEBUG)
+ unittest.main() \ No newline at end of file