test suite reviews and discussions
 help / color / mirror / Atom feed
* [dts] [PATCH V1]tests: Add test suite for exception path sample
@ 2019-02-18  9:58 Lei
  2019-02-26  7:13 ` Tu, Lijuan
  0 siblings, 1 reply; 2+ messages in thread
From: Lei @ 2019-02-18  9:58 UTC (permalink / raw)
  To: dts; +Cc: Lei Yao

From: Lei Yao <lei.a.yao@intel.com>

Add test suite for exception path sample. The first patch will just
include the performance test based on Ixia.

Signed-off-by: Lei Yao <lei.a.yao@intel.com>
---
 tests/TestSuite_exception_path.py | 185 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 185 insertions(+)
 create mode 100644 tests/TestSuite_exception_path.py

diff --git a/tests/TestSuite_exception_path.py b/tests/TestSuite_exception_path.py
new file mode 100644
index 0000000..c1cf5a7
--- /dev/null
+++ b/tests/TestSuite_exception_path.py
@@ -0,0 +1,185 @@
+# BSD LICENSE
+#
+# Copyright(c) 2010-2019 Intel Corporation. All rights reserved.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of Intel Corporation nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+"""
+DPDK Test suite.
+Test exception path feature.
+"""
+
+import dts
+import time
+import utils
+from test_case import TestCase
+
+
+
+class TestExceptionpath(TestCase):
+
+    def set_up_all(self):
+        """
+        Run at the start of each test suite.
+
+        Exception path prerequisites.
+        """
+
+        out = self.dut.send_expect("which brctl", "# ")
+        self.verify('no brctl' not in out,
+                    "The linux tool brctl is needed to run this test suite")
+        self.verify('error' not in out, "Which brctl: %s" % out)
+
+        self.dut_ports = self.dut.get_ports_performance(self.nic, force_same_socket=False, force_different_nic=False)
+        self.verify(len(self.dut_ports) >= 2, "Not enough ports available")
+        self.ports_socket = self.dut.get_numa_id(self.dut_ports[0])
+
+        out = self.dut.build_dpdk_apps('examples/helloworld')
+        self.steps = []  
+        self.steps.append({'cores': '1S/2C/1T', 'ports': 1, 'pps': '', 'bps': ''})
+
+        # If have enough core available
+        if(len(self.dut.get_core_list('1S/4C/1T')) == 4):
+            self.steps.append(
+                {'cores': '1S/4C/1T', 'ports': 2, 'pps': '', 'bps': ''})
+
+    def set_up(self):
+        """
+        Run before each test case.
+        """
+        pass
+
+    def test_perf_exceptionpath_performance(self):
+        """
+        Test the exception path performance.
+        """
+
+        # We create the pcap files to be sent to the DUT from the traffic
+        # generator (the second one is only needed in the last two steps)
+        txPort1 = self.tester.get_local_port(self.dut_ports[0])
+        txPort2 = self.tester.get_local_port(self.dut_ports[1])
+
+        mac1 = self.tester.get_mac(txPort1)
+        mac2 = self.tester.get_mac(txPort2)
+
+        self.tester.scapy_append('dstmac="ff:ff:ff:ff:ff:ff"')
+        self.tester.scapy_append('srcmac="%s"' % mac1)
+        self.tester.scapy_append(
+            'wrpcap("excpath1.pcap", [Ether(src=srcmac,dst=dstmac)/Dot1Q(vlan=1)/IP(len=46)/UDP()/("X"*14)])')
+        self.tester.scapy_append('dstmac="ff:ff:ff:ff:ff:ff"')
+        self.tester.scapy_append('srcmac="%s"' % mac2)
+        self.tester.scapy_append(
+            'wrpcap("excpath2.pcap", [Ether(src=srcmac,dst=dstmac)/Dot1Q(vlan=1)/IP(len=46)/UDP()/("X"*14)])')
+        self.tester.scapy_execute()
+        for n in range(len(self.steps)):
+            coreList = self.dut.get_core_list(
+                self.steps[n]['cores'], socket=self.ports_socket)
+            coreMask = utils.create_mask(coreList)
+
+            if(self.steps[n]['ports'] == 1):
+                portMask = utils.create_mask([self.dut_ports[0]])
+                self.dut.send_expect("./examples/exception_path/build/exception_path -n %d -c %s -- -p %s -i %s -o %s &" % (self.dut.get_memory_channels(), coreMask, portMask, utils.create_mask(
+                    [coreList[1]]), utils.create_mask([coreList[0]])), "APP: Lcore [0-9]+ is reading from tap_dpdk_[0-9]+ and writing to port [0-9]+", 120)
+            elif(self.steps[n]['ports'] == 2):
+                portMask = utils.create_mask(
+                    [self.dut_ports[0], self.dut_ports[1]])
+                self.dut.send_expect("./examples/exception_path/build/exception_path -n %d -c %s -- -p %s -i %s -o %s &" % (self.dut.get_memory_channels(), coreMask, portMask, utils.create_mask(
+                    [coreList[1], coreList[3]]), utils.create_mask([coreList[0], coreList[2]])), "APP: Lcore [0-9]+ is reading from tap_dpdk_[0-9]+ and writing to port [0-9]+", 120)
+
+            self.dut.send_expect(
+                "ifconfig tap_dpdk_%02d up" % int(coreList[0]), "# ")
+            self.dut.send_expect(
+                "ifconfig tap_dpdk_%02d up" % int(coreList[1]), "# ")
+            self.dut.send_expect("brctl addbr \"br_dpdk_00\"", "# ")
+            self.dut.send_expect(
+                "brctl addif br_dpdk_00 tap_dpdk_%02d" % int(coreList[0]), "# ")
+            self.dut.send_expect(
+                "brctl addif br_dpdk_00 tap_dpdk_%02d" % int(coreList[1]), "# ")
+            self.dut.send_expect("ifconfig br_dpdk_00 up", "# ")
+
+            tgenInput = []
+            tgenInput.append((txPort1, txPort1, "excpath1.pcap"))
+
+            if(len(coreList) == 4):
+                self.dut.send_expect(
+                    "ifconfig tap_dpdk_%02d up" % int(coreList[2]), "# ")
+                self.dut.send_expect(
+                    "ifconfig tap_dpdk_%02d up" % int(coreList[3]), "# ")
+                self.dut.send_expect("brctl addbr \"br_dpdk_01\"", "# ")
+                self.dut.send_expect(
+                    "brctl addif br_dpdk_01 tap_dpdk_%02d" % int(coreList[2]), "# ")
+                self.dut.send_expect(
+                    "brctl addif br_dpdk_01 tap_dpdk_%02d" % int(coreList[3]), "# ")
+                self.dut.send_expect("ifconfig br_dpdk_01 up", "# ")
+                tgenInput.append((txPort2, txPort2, "excpath2.pcap"))
+
+            time.sleep(5)
+            bps, pps = self.tester.traffic_generator_throughput(tgenInput)
+            self.steps[n]['pps'] = pps / 1E6
+            self.steps[n]['bps'] = bps
+
+            self.dut.send_expect("ifconfig br_dpdk_00 down", "# ")
+            self.dut.send_expect("brctl delbr \"br_dpdk_00\"", "# ")
+
+            if(len(coreList) == 4):
+                self.dut.send_expect("ifconfig br_dpdk_01 down", "# ")
+                self.dut.send_expect("brctl delbr \"br_dpdk_01\"", "# ")
+
+            self.dut.kill_all()
+
+        for n in range(len(self.steps)):
+            self.verify(self.steps[n]['pps'] != 0, "No traffic detected")
+
+        # Print results
+        header = ['Frame Size', 'Ports', 'S/C/T', 'Mpps',
+                  'Mbps', '% linerate']
+        self.result_table_create(header)
+
+        for step in self.steps:
+            self.result_table_add([64, step['ports'], step['cores'],
+                                       step['pps'],
+                                       step['bps'] / 1E6,
+                                       step[
+                                           'pps'] * 100 / float(self.wirespeed(self.nic,
+                                                                               64, 2))]
+                                      )
+
+        self.result_table_print()
+
+    def tear_down(self):
+        """
+        Run after each test case.
+        """
+        pass
+
+    def tear_down_all(self):
+        """
+        Run after each test suite.
+        """
+        pass
-- 
2.7.4

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [dts] [PATCH V1]tests: Add test suite for exception path sample
  2019-02-18  9:58 [dts] [PATCH V1]tests: Add test suite for exception path sample Lei
@ 2019-02-26  7:13 ` Tu, Lijuan
  0 siblings, 0 replies; 2+ messages in thread
From: Tu, Lijuan @ 2019-02-26  7:13 UTC (permalink / raw)
  To: Yao, Lei A, dts; +Cc: Yao, Lei A

Hi Lei,
Could you kindly please fix these warning?

Applying: tests: Add test suite for exception path sample
.git/rebase-apply/patch:75: trailing whitespace.
        self.steps = []
warning: 1 line adds whitespace errors.

thanks

> -----Original Message-----
> From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of Lei
> Sent: Monday, February 18, 2019 5:59 PM
> To: dts@dpdk.org
> Cc: Yao, Lei A <lei.a.yao@intel.com>
> Subject: [dts] [PATCH V1]tests: Add test suite for exception path sample
> 
> From: Lei Yao <lei.a.yao@intel.com>
> 
> Add test suite for exception path sample. The first patch will just include the
> performance test based on Ixia.
> 
> Signed-off-by: Lei Yao <lei.a.yao@intel.com>
> ---
>  tests/TestSuite_exception_path.py | 185
> ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 185 insertions(+)
>  create mode 100644 tests/TestSuite_exception_path.py
> 
> diff --git a/tests/TestSuite_exception_path.py
> b/tests/TestSuite_exception_path.py
> new file mode 100644
> index 0000000..c1cf5a7
> --- /dev/null
> +++ b/tests/TestSuite_exception_path.py
> @@ -0,0 +1,185 @@
> +# BSD LICENSE
> +#
> +# Copyright(c) 2010-2019 Intel Corporation. All rights reserved.
> +# All rights reserved.
> +#
> +# Redistribution and use in source and binary forms, with or without #
> +modification, are permitted provided that the following conditions #
> +are met:
> +#
> +#   * Redistributions of source code must retain the above copyright
> +#     notice, this list of conditions and the following disclaimer.
> +#   * Redistributions in binary form must reproduce the above copyright
> +#     notice, this list of conditions and the following disclaimer in
> +#     the documentation and/or other materials provided with the
> +#     distribution.
> +#   * Neither the name of Intel Corporation nor the names of its
> +#     contributors may be used to endorse or promote products derived
> +#     from this software without specific prior written permission.
> +#
> +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS #
> +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT #
> +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> FOR #
> +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> COPYRIGHT #
> +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> INCIDENTAL, #
> +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> #
> +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> USE, #
> +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
> ANY #
> +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT #
> +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
> USE #
> +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> +
> +
> +"""
> +DPDK Test suite.
> +Test exception path feature.
> +"""
> +
> +import dts
> +import time
> +import utils
> +from test_case import TestCase
> +
> +
> +
> +class TestExceptionpath(TestCase):
> +
> +    def set_up_all(self):
> +        """
> +        Run at the start of each test suite.
> +
> +        Exception path prerequisites.
> +        """
> +
> +        out = self.dut.send_expect("which brctl", "# ")
> +        self.verify('no brctl' not in out,
> +                    "The linux tool brctl is needed to run this test suite")
> +        self.verify('error' not in out, "Which brctl: %s" % out)
> +
> +        self.dut_ports = self.dut.get_ports_performance(self.nic,
> force_same_socket=False, force_different_nic=False)
> +        self.verify(len(self.dut_ports) >= 2, "Not enough ports available")
> +        self.ports_socket = self.dut.get_numa_id(self.dut_ports[0])
> +
> +        out = self.dut.build_dpdk_apps('examples/helloworld')
> +        self.steps = []
> +        self.steps.append({'cores': '1S/2C/1T', 'ports': 1, 'pps': '',
> + 'bps': ''})
> +
> +        # If have enough core available
> +        if(len(self.dut.get_core_list('1S/4C/1T')) == 4):
> +            self.steps.append(
> +                {'cores': '1S/4C/1T', 'ports': 2, 'pps': '', 'bps':
> + ''})
> +
> +    def set_up(self):
> +        """
> +        Run before each test case.
> +        """
> +        pass
> +
> +    def test_perf_exceptionpath_performance(self):
> +        """
> +        Test the exception path performance.
> +        """
> +
> +        # We create the pcap files to be sent to the DUT from the traffic
> +        # generator (the second one is only needed in the last two steps)
> +        txPort1 = self.tester.get_local_port(self.dut_ports[0])
> +        txPort2 = self.tester.get_local_port(self.dut_ports[1])
> +
> +        mac1 = self.tester.get_mac(txPort1)
> +        mac2 = self.tester.get_mac(txPort2)
> +
> +        self.tester.scapy_append('dstmac="ff:ff:ff:ff:ff:ff"')
> +        self.tester.scapy_append('srcmac="%s"' % mac1)
> +        self.tester.scapy_append(
> +            'wrpcap("excpath1.pcap",
> [Ether(src=srcmac,dst=dstmac)/Dot1Q(vlan=1)/IP(len=46)/UDP()/("X"*14)])')
> +        self.tester.scapy_append('dstmac="ff:ff:ff:ff:ff:ff"')
> +        self.tester.scapy_append('srcmac="%s"' % mac2)
> +        self.tester.scapy_append(
> +            'wrpcap("excpath2.pcap",
> [Ether(src=srcmac,dst=dstmac)/Dot1Q(vlan=1)/IP(len=46)/UDP()/("X"*14)])')
> +        self.tester.scapy_execute()
> +        for n in range(len(self.steps)):
> +            coreList = self.dut.get_core_list(
> +                self.steps[n]['cores'], socket=self.ports_socket)
> +            coreMask = utils.create_mask(coreList)
> +
> +            if(self.steps[n]['ports'] == 1):
> +                portMask = utils.create_mask([self.dut_ports[0]])
> +
> self.dut.send_expect("./examples/exception_path/build/exception_path -n %d -
> c %s -- -p %s -i %s -o %s &" % (self.dut.get_memory_channels(), coreMask,
> portMask, utils.create_mask(
> +                    [coreList[1]]), utils.create_mask([coreList[0]])), "APP: Lcore [0-9]+ is
> reading from tap_dpdk_[0-9]+ and writing to port [0-9]+", 120)
> +            elif(self.steps[n]['ports'] == 2):
> +                portMask = utils.create_mask(
> +                    [self.dut_ports[0], self.dut_ports[1]])
> +
> self.dut.send_expect("./examples/exception_path/build/exception_path -n %d -
> c %s -- -p %s -i %s -o %s &" % (self.dut.get_memory_channels(), coreMask,
> portMask, utils.create_mask(
> +                    [coreList[1], coreList[3]]),
> + utils.create_mask([coreList[0], coreList[2]])), "APP: Lcore [0-9]+ is
> + reading from tap_dpdk_[0-9]+ and writing to port [0-9]+", 120)
> +
> +            self.dut.send_expect(
> +                "ifconfig tap_dpdk_%02d up" % int(coreList[0]), "# ")
> +            self.dut.send_expect(
> +                "ifconfig tap_dpdk_%02d up" % int(coreList[1]), "# ")
> +            self.dut.send_expect("brctl addbr \"br_dpdk_00\"", "# ")
> +            self.dut.send_expect(
> +                "brctl addif br_dpdk_00 tap_dpdk_%02d" % int(coreList[0]), "# ")
> +            self.dut.send_expect(
> +                "brctl addif br_dpdk_00 tap_dpdk_%02d" % int(coreList[1]), "# ")
> +            self.dut.send_expect("ifconfig br_dpdk_00 up", "# ")
> +
> +            tgenInput = []
> +            tgenInput.append((txPort1, txPort1, "excpath1.pcap"))
> +
> +            if(len(coreList) == 4):
> +                self.dut.send_expect(
> +                    "ifconfig tap_dpdk_%02d up" % int(coreList[2]), "# ")
> +                self.dut.send_expect(
> +                    "ifconfig tap_dpdk_%02d up" % int(coreList[3]), "# ")
> +                self.dut.send_expect("brctl addbr \"br_dpdk_01\"", "# ")
> +                self.dut.send_expect(
> +                    "brctl addif br_dpdk_01 tap_dpdk_%02d" % int(coreList[2]), "# ")
> +                self.dut.send_expect(
> +                    "brctl addif br_dpdk_01 tap_dpdk_%02d" % int(coreList[3]), "# ")
> +                self.dut.send_expect("ifconfig br_dpdk_01 up", "# ")
> +                tgenInput.append((txPort2, txPort2, "excpath2.pcap"))
> +
> +            time.sleep(5)
> +            bps, pps = self.tester.traffic_generator_throughput(tgenInput)
> +            self.steps[n]['pps'] = pps / 1E6
> +            self.steps[n]['bps'] = bps
> +
> +            self.dut.send_expect("ifconfig br_dpdk_00 down", "# ")
> +            self.dut.send_expect("brctl delbr \"br_dpdk_00\"", "# ")
> +
> +            if(len(coreList) == 4):
> +                self.dut.send_expect("ifconfig br_dpdk_01 down", "# ")
> +                self.dut.send_expect("brctl delbr \"br_dpdk_01\"", "#
> + ")
> +
> +            self.dut.kill_all()
> +
> +        for n in range(len(self.steps)):
> +            self.verify(self.steps[n]['pps'] != 0, "No traffic
> + detected")
> +
> +        # Print results
> +        header = ['Frame Size', 'Ports', 'S/C/T', 'Mpps',
> +                  'Mbps', '% linerate']
> +        self.result_table_create(header)
> +
> +        for step in self.steps:
> +            self.result_table_add([64, step['ports'], step['cores'],
> +                                       step['pps'],
> +                                       step['bps'] / 1E6,
> +                                       step[
> +                                           'pps'] * 100 / float(self.wirespeed(self.nic,
> +                                                                               64, 2))]
> +                                      )
> +
> +        self.result_table_print()
> +
> +    def tear_down(self):
> +        """
> +        Run after each test case.
> +        """
> +        pass
> +
> +    def tear_down_all(self):
> +        """
> +        Run after each test suite.
> +        """
> +        pass
> --
> 2.7.4

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-02-26  7:14 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-18  9:58 [dts] [PATCH V1]tests: Add test suite for exception path sample Lei
2019-02-26  7:13 ` Tu, Lijuan

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).