From 151d610ce06f9c3e675cd9161fd9c16435639a9d Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Apr 30 2018 13:34:07 +0000 Subject: Add integration tests to iperf3 Justification Adds tests according to the CI wiki specifically the standard test interface in the spec. The playbook includes Tier1 level test cases that have been tested in the following contexts and is passing reliably: Classic. Test logs are stored in the artifacts directory. The following steps are used to execute the tests using the standard test interface: Test enveronment Make sure you have installed packages from the spec ``` ansible-2.4.1.0-2.fc27.noarch python2-dnf-2.7.5-1.fc27.noarch libselinux-python-2.7-2.fc27.x86_64 standard-test-roles-2.5-1.fc27.noarch Run tests for Classic Snip of the example test run for Classic tests: ``` ``` posix on :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: TEST PROTOCOL :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Package : iperf3 Installed : iperf3-3.5-1.fc29.x86_64 beakerlib RPM : beakerlib-1.17-13.fc29.noarch Test started : 2018-04-30 12:21:09 UTC Test finished : Test duration : Test name : miscellaneous-tests Distro : Fedora release 29 (Rawhide) Hostname : localhost Architecture : x86_64 CPUs : 1 x Westmere E56xx/L56xx/X56xx (Nehalem-C) RAM size : 5938 MB HDD size : 39.12 GB :: [ 12:21:09 ] :: [ WARNING ] :: POSIX mode detected and switched off :: [ 12:21:09 ] :: [ WARNING ] :: POSIX mode detected and switched off :: [ 12:21:09 ] :: [ WARNING ] :: Please fix your test to have /bin/bash shebang :: [ 12:21:09 ] :: [ WARNING ] :: Please fix your test to have /bin/bash shebang :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Setup :: Setup :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: iperf3-3.5-1.fc29.x86_64 :: [ 12:21:09 ] :: [ PASS ] :: Checking for the presence of iperf3 rpm :: [ 12:21:09 ] :: [ PASS ] :: Checking for the presence of iperf3 rpm :: [ 12:21:09 ] :: [ LOG ] :: Package versions: :: [ 12:21:09 ] :: [ LOG ] :: Package versions: :: [ 12:21:09 ] :: [ LOG ] :: iperf3-3.5-1.fc29.x86_64 :: [ 12:21:09 ] :: [ LOG ] :: iperf3-3.5-1.fc29.x86_64 :: [ 12:21:09 ] :: [ BEGIN ] :: Running 'cp iperf3-test.py /usr/bin/' :: [ 12:21:09 ] :: [ PASS ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0) :: [ 12:21:09 ] :: [ PASS ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 0s :: Duration: 0s :: Assertions: 2 good, 0 bad :: Assertions: 2 good, 0 bad :: RESULT: PASS :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Test :: Test :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:21:09 ] :: [ LOG ] :: iperf3 tests :: [ 12:21:09 ] :: [ LOG ] :: iperf3 tests :: [ 12:21:09 ] :: [ BEGIN ] :: Running '/usr/bin/python3 /usr/bin/iperf3-test.py' test_basic_tcp_client_default_port_5201 (__main__.Iperf3SanityTests) ... ok test_basic_udp_client_default_port_5201 (__main__.Iperf3SanityTests) ... ok test_server_daemon_pid_equal_to_pid_file (__main__.Iperf3SanityTests) ... ok test_server_log_file_exists (__main__.Iperf3SanityTests) ... ok test_server_pid_file_exists (__main__.Iperf3SanityTests) ... ok test_tcp_client_custom_port_5202 (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_custom_client_port (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_dscp (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_get_server_output (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_mss (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_parallel (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_reverse (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_time_15sec (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_title (__main__.Iperf3Tests) ... ok test_tcp_client_port_5202_ipv6 (__main__.Iperf3Tests) ... ok test_udp_client_custom_port_5202 (__main__.Iperf3Tests) ... ok test_udp_client_port_5202_ipv6 (__main__.Iperf3Tests) ... ok test_tcp_client_bind_to_interface_default_port (__main__.Iperf3TestsBindToInterface) ... ok ---------------------------------------------------------------------- Ran 18 tests in 266.543s OK :: [ 12:25:36 ] :: [ PASS ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0) :: [ 12:25:36 ] :: [ PASS ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 267s :: Duration: 267s :: Assertions: 1 good, 0 bad :: Assertions: 1 good, 0 bad :: RESULT: PASS :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Cleanup :: Cleanup :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:25:36 ] :: [ BEGIN ] :: Running 'rm /usr/bin/iperf3-test.py' :: [ 12:25:36 ] :: [ PASS ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0) :: [ 12:25:36 ] :: [ PASS ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0) :: [ 12:25:36 ] :: [ LOG ] :: iperf3 tests done :: [ 12:25:36 ] :: [ LOG ] :: iperf3 tests done :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 0s :: Duration: 0s :: Assertions: 1 good, 0 bad :: Assertions: 1 good, 0 bad :: RESULT: PASS :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: TEST PROTOCOL :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Package : iperf3 Installed : iperf3-3.5-1.fc29.x86_64 beakerlib RPM : beakerlib-1.17-13.fc29.noarch Test started : 2018-04-30 12:21:09 UTC Test finished : 2018-04-30 12:25:36 UTC (still running) Test duration : 267 seconds Test name : miscellaneous-tests Distro : Fedora release 29 (Rawhide) Hostname : localhost Architecture : x86_64 CPUs : 1 x Westmere E56xx/L56xx/X56xx (Nehalem-C) RAM size : 5938 MB HDD size : 39.12 GB :: [ 12:21:09 ] :: [ WARNING ] :: POSIX mode detected and switched off :: [ 12:21:09 ] :: [ WARNING ] :: Please fix your test to have /bin/bash shebang :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Setup :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:21:09 ] :: [ PASS ] :: Checking for the presence of iperf3 rpm :: [ 12:21:09 ] :: [ LOG ] :: Package versions: :: [ 12:21:09 ] :: [ LOG ] :: iperf3-3.5-1.fc29.x86_64 :: [ 12:21:09 ] :: [ PASS ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 0s :: Assertions: 2 good, 0 bad :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Test :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:21:09 ] :: [ LOG ] :: iperf3 tests :: [ 12:25:36 ] :: [ PASS ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 267s :: Assertions: 1 good, 0 bad :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Cleanup :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:25:36 ] :: [ PASS ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0) :: [ 12:25:36 ] :: [ LOG ] :: iperf3 tests done :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 0s :: Assertions: 1 good, 0 bad :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: miscellaneous-tests :: miscellaneous-tests :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:25:36 ] :: [ LOG ] :: JOURNAL XML: /var/tmp/beakerlib-oMWxgE1/journal.xml :: [ 12:25:36 ] :: [ LOG ] :: JOURNAL XML: /var/tmp/beakerlib-oMWxgE1/journal.xml :: [ 12:25:36 ] :: [ LOG ] :: JOURNAL TXT: /var/tmp/beakerlib-oMWxgE1/journal.txt :: [ 12:25:36 ] :: [ LOG ] :: JOURNAL TXT: /var/tmp/beakerlib-oMWxgE1/journal.txt :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 267s :: Duration: 267s :: Phases: 3 good, 0 bad :: Phases: 3 good, 0 bad :: OVERALL RESULT: PASS :: OVERALL RESULT: PASS posix on :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: TEST PROTOCOL :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Package : iperf3 Installed : iperf3-3.5-1.fc29.x86_64 beakerlib RPM : beakerlib-1.17-13.fc29.noarch Test started : 2018-04-30 12:21:09 UTC Test finished : Test duration : Test name : miscellaneous-tests Distro : Fedora release 29 (Rawhide) Hostname : localhost Architecture : x86_64 CPUs : 1 x Westmere E56xx/L56xx/X56xx (Nehalem-C) RAM size : 5938 MB HDD size : 39.12 GB :: [ 12:21:09 ] :: [ WARNING ] :: POSIX mode detected and switched off :: [ 12:21:09 ] :: [ WARNING ] :: POSIX mode detected and switched off :: [ 12:21:09 ] :: [ WARNING ] :: Please fix your test to have /bin/bash shebang :: [ 12:21:09 ] :: [ WARNING ] :: Please fix your test to have /bin/bash shebang :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Setup :: Setup :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: iperf3-3.5-1.fc29.x86_64 :: [ 12:21:09 ] :: [ PASS ] :: Checking for the presence of iperf3 rpm :: [ 12:21:09 ] :: [ PASS ] :: Checking for the presence of iperf3 rpm :: [ 12:21:09 ] :: [ LOG ] :: Package versions: :: [ 12:21:09 ] :: [ LOG ] :: Package versions: :: [ 12:21:09 ] :: [ LOG ] :: iperf3-3.5-1.fc29.x86_64 :: [ 12:21:09 ] :: [ LOG ] :: iperf3-3.5-1.fc29.x86_64 :: [ 12:21:09 ] :: [ BEGIN ] :: Running 'cp iperf3-test.py /usr/bin/' :: [ 12:21:09 ] :: [ PASS ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0) :: [ 12:21:09 ] :: [ PASS ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 0s :: Duration: 0s :: Assertions: 2 good, 0 bad :: Assertions: 2 good, 0 bad :: RESULT: PASS :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Test :: Test :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:21:09 ] :: [ LOG ] :: iperf3 tests :: [ 12:21:09 ] :: [ LOG ] :: iperf3 tests :: [ 12:21:09 ] :: [ BEGIN ] :: Running '/usr/bin/python3 /usr/bin/iperf3-test.py' test_basic_tcp_client_default_port_5201 (__main__.Iperf3SanityTests) ... ok test_basic_udp_client_default_port_5201 (__main__.Iperf3SanityTests) ... ok test_server_daemon_pid_equal_to_pid_file (__main__.Iperf3SanityTests) ... ok test_server_log_file_exists (__main__.Iperf3SanityTests) ... ok test_server_pid_file_exists (__main__.Iperf3SanityTests) ... ok test_tcp_client_custom_port_5202 (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_custom_client_port (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_dscp (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_get_server_output (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_mss (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_parallel (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_reverse (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_time_15sec (__main__.Iperf3Tests) ... ok test_tcp_client_custom_port_5202_title (__main__.Iperf3Tests) ... ok test_tcp_client_port_5202_ipv6 (__main__.Iperf3Tests) ... ok test_udp_client_custom_port_5202 (__main__.Iperf3Tests) ... ok test_udp_client_port_5202_ipv6 (__main__.Iperf3Tests) ... ok test_tcp_client_bind_to_interface_default_port (__main__.Iperf3TestsBindToInterface) ... ok ---------------------------------------------------------------------- Ran 18 tests in 266.543s OK :: [ 12:25:36 ] :: [ PASS ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0) :: [ 12:25:36 ] :: [ PASS ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 267s :: Duration: 267s :: Assertions: 1 good, 0 bad :: Assertions: 1 good, 0 bad :: RESULT: PASS :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Cleanup :: Cleanup :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:25:36 ] :: [ BEGIN ] :: Running 'rm /usr/bin/iperf3-test.py' :: [ 12:25:36 ] :: [ PASS ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0) :: [ 12:25:36 ] :: [ PASS ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0) :: [ 12:25:36 ] :: [ LOG ] :: iperf3 tests done :: [ 12:25:36 ] :: [ LOG ] :: iperf3 tests done :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 0s :: Duration: 0s :: Assertions: 1 good, 0 bad :: Assertions: 1 good, 0 bad :: RESULT: PASS :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: TEST PROTOCOL :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Package : iperf3 Installed : iperf3-3.5-1.fc29.x86_64 beakerlib RPM : beakerlib-1.17-13.fc29.noarch Test started : 2018-04-30 12:21:09 UTC Test finished : 2018-04-30 12:25:36 UTC (still running) Test duration : 267 seconds Test name : miscellaneous-tests Distro : Fedora release 29 (Rawhide) Hostname : localhost Architecture : x86_64 CPUs : 1 x Westmere E56xx/L56xx/X56xx (Nehalem-C) RAM size : 5938 MB HDD size : 39.12 GB :: [ 12:21:09 ] :: [ WARNING ] :: POSIX mode detected and switched off :: [ 12:21:09 ] :: [ WARNING ] :: Please fix your test to have /bin/bash shebang :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Setup :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:21:09 ] :: [ PASS ] :: Checking for the presence of iperf3 rpm :: [ 12:21:09 ] :: [ LOG ] :: Package versions: :: [ 12:21:09 ] :: [ LOG ] :: iperf3-3.5-1.fc29.x86_64 :: [ 12:21:09 ] :: [ PASS ] :: Command 'cp iperf3-test.py /usr/bin/' (Expected 0, got 0) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 0s :: Assertions: 2 good, 0 bad :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Test :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:21:09 ] :: [ LOG ] :: iperf3 tests :: [ 12:25:36 ] :: [ PASS ] :: Command '/usr/bin/python3 /usr/bin/iperf3-test.py' (Expected 0, got 0) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 267s :: Assertions: 1 good, 0 bad :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Cleanup :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:25:36 ] :: [ PASS ] :: Command 'rm /usr/bin/iperf3-test.py' (Expected 0, got 0) :: [ 12:25:36 ] :: [ LOG ] :: iperf3 tests done :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 0s :: Assertions: 1 good, 0 bad :: RESULT: PASS :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: miscellaneous-tests :: miscellaneous-tests :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: [ 12:25:36 ] :: [ LOG ] :: JOURNAL XML: /var/tmp/beakerlib-oMWxgE1/journal.xml :: [ 12:25:36 ] :: [ LOG ] :: JOURNAL XML: /var/tmp/beakerlib-oMWxgE1/journal.xml :: [ 12:25:36 ] :: [ LOG ] :: JOURNAL TXT: /var/tmp/beakerlib-oMWxgE1/journal.txt :: [ 12:25:36 ] :: [ LOG ] :: JOURNAL TXT: /var/tmp/beakerlib-oMWxgE1/journal.txt :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Duration: 267s :: Duration: 267s :: Phases: 3 good, 0 bad :: Phases: 3 good, 0 bad :: OVERALL RESULT: PASS :: OVERALL RESULT: PASS ``` Tested by : Bruno Goncalves --- diff --git a/tests/miscellaneous-tests/iperf3-test.py b/tests/miscellaneous-tests/iperf3-test.py new file mode 100755 index 0000000..41d4b8f --- /dev/null +++ b/tests/miscellaneous-tests/iperf3-test.py @@ -0,0 +1,348 @@ +#!/usr/bin/env python3 +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# iperf3 integration test +# Description: Test for ipertf3 +# Author: Susant Sahani +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2018 Red Hat, Inc. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +import errno +import os +import sys +import time +import unittest +import subprocess +import signal +import shutil +import re +import psutil + +IPERF3_SERVER_LOGS='/var/run/iperf3-test-log' +IPERF3_PID_FILE='/var/run/iperf3-test-pid' + +TEST_COMPLETE='Test Complete. Summary Results:' +SERVER_TEST_PROTOCOL_TCP_MSG='Starting Test: protocol: TCP' +SERVER_TEST_PROTOCOL_UDP_MSG='Starting Test: protocol: UDP' + +SERVER_LISTENING_PORT_5202_MSG='Server listening on 5202' +SERVER_LISTENING_PORT_5201_MSG='Server listening on 5201' +SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG='local 127.0.0.1 port 5202 connected to 127.0.0.1 port \d+' +SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_IPV6_MSG='local ::1 port 5202 connected to ::1 port \d+' +SERVER_CONNECTED_LOCAL_PORT_5201_WITH_REMOTE_PORT_MSG='local 127.0.0.1 port 5201 connected to 127.0.0.1 port \d+' +SERVER_INCOMING_CONNECTION_MSG='Accepted connection from 127.0.0.1, port \d+' +SERVER_INCOMING_CONNECTION_IPV6_MSG='Accepted connection from ::1, port \d+' + +CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG='local 127.0.0.1 port \d+ connected to 127.0.0.1 port 5202' +CLIENT_CONNECTED_TO_SERVER_PORT_5201_MSG='local 127.0.0.1 port \d+ connected to 127.0.0.1 port 5201' +CLIENT_CONNECTED_TO_SERVER_PORT_5202_IPV6_MSG='local ::1 port \d+ connected to ::1 port 5202' +CLIENT_TEST_COMPLETE_MSG='iperf Done' + +def setUpModule(): + """Initialize the environment, and perform sanity checks on it.""" + + if shutil.which('iperf3') is None: + raise OSError(errno.ENOENT, 'iperf3 not found') + + for pid in psutil.pids(): + p = psutil.Process(pid) + if p.name() == "iperf3": + raise unittest.SkipTest('iperf3 is already active') + +class Iperf3ServerLogUtilities(): + """Provide a set of utility functions to facilitate iperf3 tests. + + This class must be inherited along with unittest.TestCase to define + some required methods. + """ + + def findTextInServerLog(self, **kwargs): + """Look various success lines from iperf3 server logs.""" + + if kwargs is not None: + with open (IPERF3_SERVER_LOGS, 'rt') as in_file: + contents = in_file.read() + for key in kwargs: + self.assertRegex(contents, kwargs[key]) + + def KillIperf3Server(self): + + time.sleep(3) + + try: + with open(IPERF3_PID_FILE, 'r') as f: + pid = f.read().rstrip(' \t\r\n\0') + os.kill(int(pid), signal.SIGTERM) + + os.remove(IPERF3_SERVER_LOGS) + os.remove(IPERF3_PID_FILE) + except IOError: + pass + + def VerifyPortIsOpenAuto(self, port): + """ Tests whether iperf3 is listening on given port """ + netstat_output = subprocess.check_output(['netstat', '-antpl']).rstrip().decode('utf-8') + self.assertIsNotNone(netstat_output) + + match='tcp.*' + str(port) +'.*LISTEN.*/iperf3' + self.assertRegex(netstat_output, match) + +class Iperf3TestsBindToInterface(unittest.TestCase, Iperf3ServerLogUtilities): + + def setUp(self): + + """Setup veth interface""" + subprocess.check_output(['ip', 'link', 'add', 'iperf-veth', 'type', 'veth', 'peer', 'name', 'iperf-veth-peer']) + subprocess.check_output(['ip', 'addr', 'add', '192.168.50.5', 'dev', 'iperf-veth']) + subprocess.check_output(['ip', 'addr', 'add', '192.168.50.6', 'dev', 'iperf-veth-peer']) + subprocess.check_output(['ip', 'link', 'set', 'iperf-veth', 'up']) + subprocess.check_output(['ip', 'link', 'set', 'iperf-veth-peer', 'up']) + + """Start iperf3.""" + subprocess.check_output(['iperf3', '-s', '--daemon', '--verbose' , '--logfile', '/var/run/iperf3-test-log', '--pidfile', '/var/run/iperf3-test-pid', '--bind', '192.168.50.5']) + time.sleep(3) + self.VerifyPortIsOpenAuto(5201) + + def tearDown(self): + self.KillIperf3Server() + subprocess.check_output(['ip', 'link', 'del', 'iperf-veth']) + + def test_tcp_client_bind_to_interface_default_port(self): + + client_output = subprocess.check_output(['iperf3', '-c', '192.168.50.5', '--bind', '192.168.50.6']).rstrip().decode('utf-8') + self.assertRegex(client_output, 'Connecting to host 192.168.50.5, port 5201') + self.assertRegex(client_output, 'local 192.168.50.6 port \d+ connected to 192.168.50.5 port 5201') + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1='Accepted connection from 192.168.50.6, port \d+', + test2='local 192.168.50.5 port 5201 connected to 192.168.50.6 port \d+', + test3=SERVER_TEST_PROTOCOL_TCP_MSG, + test4=TEST_COMPLETE) +class Iperf3Tests(unittest.TestCase, Iperf3ServerLogUtilities): + + def setUp(self): + """Start iperf3.""" + subprocess.check_output(['iperf3', '-s', '-p', '5202', '--daemon', '--verbose' , '--logfile', '/var/run/iperf3-test-log', '--pidfile', '/var/run/iperf3-test-pid']) + time.sleep(3) + self.VerifyPortIsOpenAuto(5202) + + + def tearDown(self): + self.KillIperf3Server() + + def test_tcp_client_custom_port_5202(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG) + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test2=SERVER_INCOMING_CONNECTION_MSG, + test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test4=SERVER_TEST_PROTOCOL_TCP_MSG, + test5=TEST_COMPLETE) + + def test_udp_client_custom_port_5202(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-u', '-p', '5202']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG) + self.assertRegex(client_output, "Total Datagrams") + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test2=SERVER_INCOMING_CONNECTION_MSG, + test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test4=SERVER_TEST_PROTOCOL_UDP_MSG, + test5=TEST_COMPLETE) + + def test_tcp_client_custom_port_5202_time_15sec(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '-t','15']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG) + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test2=SERVER_INCOMING_CONNECTION_MSG, + test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test4=SERVER_TEST_PROTOCOL_TCP_MSG, + test5='15 second test', + test6=TEST_COMPLETE) + + def test_tcp_client_port_5202_ipv6(self): + + client_output = subprocess.check_output(['iperf3', '-c', '::1', '-p', '5202']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_IPV6_MSG) + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_IPV6_MSG, + test2=SERVER_INCOMING_CONNECTION_IPV6_MSG, + test3=SERVER_TEST_PROTOCOL_TCP_MSG, + test4=TEST_COMPLETE) + + def test_udp_client_port_5202_ipv6(self): + + client_output = subprocess.check_output(['iperf3', '-c', '::1', '-u', '-p', '5202']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_IPV6_MSG) + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_IPV6_MSG, + test2=SERVER_INCOMING_CONNECTION_IPV6_MSG, + test3=SERVER_TEST_PROTOCOL_UDP_MSG, + test4=TEST_COMPLETE) + + def test_tcp_client_custom_port_5202_parallel(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--parallel', '10']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG) + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test2=SERVER_INCOMING_CONNECTION_MSG, + test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test4='Starting Test: protocol: TCP, 10 streams', + test5=TEST_COMPLETE) + + def test_tcp_client_custom_port_5202_reverse(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '-R']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG) + self.assertRegex(client_output, 'Reverse mode, remote host 127.0.0.1 is sending') + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test2=SERVER_INCOMING_CONNECTION_MSG, + test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test4=TEST_COMPLETE) + + def test_tcp_client_custom_port_5202_dscp(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--dscp', '22']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG) + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test2=SERVER_INCOMING_CONNECTION_MSG, + test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test4='tos 22', + test5=TEST_COMPLETE) + + def test_tcp_client_custom_port_5202_mss(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--set-mss', '400']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG) + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test2=SERVER_INCOMING_CONNECTION_MSG, + test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test4='TCP MSS: 400', + test5=TEST_COMPLETE) + + def test_tcp_client_custom_port_5202_title(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--title', 'Susant']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG) + self.assertRegex(client_output, "Susant") + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test2=SERVER_INCOMING_CONNECTION_MSG, + test3=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test4=TEST_COMPLETE) + + def test_tcp_client_custom_port_5202_get_server_output(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--get-server-output']).rstrip().decode('utf-8') + self.assertRegex(client_output, "Server output:") + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test2=SERVER_INCOMING_CONNECTION_MSG, + test5=TEST_COMPLETE) + + def test_tcp_client_custom_port_5202_custom_client_port(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-p', '5202', '--bind', '127.0.0.1', '--cport', '5203']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5202_MSG) + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_CONNECTED_LOCAL_PORT_5202_WITH_REMOTE_PORT_MSG, + test2='port 5203', + test3=TEST_COMPLETE) + +class Iperf3SanityTests(unittest.TestCase, Iperf3ServerLogUtilities): + + def setUp(self): + """Start iperf3 default TCP mode.""" + subprocess.check_output(['iperf3', '--daemon', '--server', '--verbose' , '--logfile', '/var/run/iperf3-test-log', '--pidfile', '/var/run/iperf3-test-pid']) + time.sleep(3) + self.VerifyPortIsOpenAuto(5201) + + def tearDown(self): + self.KillIperf3Server() + + def test_basic_tcp_client_default_port_5201(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1',]).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5201_MSG) + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_LISTENING_PORT_5201_MSG, + test2=SERVER_INCOMING_CONNECTION_MSG, + test3=SERVER_CONNECTED_LOCAL_PORT_5201_WITH_REMOTE_PORT_MSG, + test4=SERVER_TEST_PROTOCOL_TCP_MSG, + test5=TEST_COMPLETE) + + def test_server_log_file_exists(self): + self.assertTrue(os.path.exists(IPERF3_SERVER_LOGS)) + + def test_server_pid_file_exists(self): + self.assertTrue(os.path.exists(IPERF3_PID_FILE)) + + def test_server_daemon_pid_equal_to_pid_file(self): + with open(IPERF3_PID_FILE, 'r') as f: + pid = f.read().rstrip(' \t\r\n\0') + + proc_path = os.path.join('/proc/', pid) + self.assertTrue(os.path.exists(proc_path)) + + process = psutil.Process(int(pid)) + self.assertEqual(process.name(), 'iperf3') + + f.close() + + def test_basic_udp_client_default_port_5201(self): + + client_output = subprocess.check_output(['iperf3', '-c', '127.0.0.1', '-u']).rstrip().decode('utf-8') + self.assertRegex(client_output, CLIENT_CONNECTED_TO_SERVER_PORT_5201_MSG) + self.assertRegex(client_output, 'Total Datagrams') + self.assertRegex(client_output, CLIENT_TEST_COMPLETE_MSG) + + self.findTextInServerLog(test1=SERVER_LISTENING_PORT_5201_MSG, + test2=SERVER_INCOMING_CONNECTION_MSG, + test3=SERVER_CONNECTED_LOCAL_PORT_5201_WITH_REMOTE_PORT_MSG, + test4=SERVER_TEST_PROTOCOL_UDP_MSG, + test5=TEST_COMPLETE) + +if __name__ == '__main__': + unittest.main(testRunner=unittest.TextTestRunner(stream=sys.stdout, + verbosity=2)) diff --git a/tests/miscellaneous-tests/runtest.sh b/tests/miscellaneous-tests/runtest.sh new file mode 100755 index 0000000..f1c9072 --- /dev/null +++ b/tests/miscellaneous-tests/runtest.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of iperf3 +# Description: iPerf3 is a tool for active measurements of the maximum +# achievable bandwidth on IP networks. +# Author: Susant Sahani +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2018 Red Hat, Inc. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# This program is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="iperf3" +Iperf3PidFile="/var/run/iperf3-test-pid" + +rlJournalStart + rlPhaseStartSetup + rlAssertRpm $PACKAGE + + if pgrep -x "iperf3" > /dev/null + then + rlLog "Iperf3 is already Running" + fi + + rlRun "cp iperf3-test.py /usr/bin/" + rlPhaseEnd + + rlPhaseStartTest + rlLog "iperf3 tests" + rlRun "/usr/bin/python3 /usr/bin/iperf3-test.py" + rlPhaseEnd + + rlPhaseStartCleanup + rlRun "rm /usr/bin/iperf3-test.py" + + if [ -f "$Iperf3PidFile" ] + then + rlRun "read Iperf3Pid < $Iperf3PidFile" + rlRun "echo $Iperf3Pid" + + if [ -z $Iperf3Pid ] + then + rlRun "kill -9 $Iperf3Pid" + rlRun "rm Iperf3PidFile" + fi + fi + + rlLog "iperf3 tests done" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd + +rlGetTestState diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..20eb755 --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,11 @@ +- hosts: localhost + roles: + - role: standard-test-beakerlib + tags: + - classic + tests: + - miscellaneous-tests + required_packages: + - iperf3 + - python3 + - net-tools