summaryrefslogtreecommitdiffstats
path: root/scripts/automation/regression
diff options
context:
space:
mode:
authorYaroslav Brustinov <ybrustin@cisco.com>2016-03-08 10:28:20 +0200
committerYaroslav Brustinov <ybrustin@cisco.com>2016-03-08 10:28:20 +0200
commitafefddfa387dad83bbcb15812bd279cf3197f583 (patch)
treea0da1554a09da985ff65e63bfee7b9e1c4a240f5 /scripts/automation/regression
parent29c78819b903a2933e8ba106faa5ba5745eb527e (diff)
regression: add stateless support (WIP); Scapy builder: fix remove MACs from binary, do not build by default;
Diffstat (limited to 'scripts/automation/regression')
-rwxr-xr-xscripts/automation/regression/aggregate_results.py104
-rwxr-xr-xscripts/automation/regression/functional_unit_tests.py78
-rwxr-xr-xscripts/automation/regression/misc_methods.py19
-rw-r--r--scripts/automation/regression/stl/golden/basic_imix_golden.capbin198474 -> 0 bytes
-rw-r--r--scripts/automation/regression/stl/golden/basic_imix_vm_golden.capbin316552 -> 0 bytes
-rw-r--r--scripts/automation/regression/stl/golden/basic_tuple_gen_golden.capbin38024 -> 0 bytes
-rw-r--r--scripts/automation/regression/stl/golden/udp_590.capbin630 -> 0 bytes
-rw-r--r--scripts/automation/regression/trex.py81
-rwxr-xr-xscripts/automation/regression/trex_unit_test.py306
-rwxr-xr-xscripts/automation/regression/unit_tests/__init__.py1
-rw-r--r--scripts/automation/regression/unit_tests/functional_tests/config.yaml74
-rwxr-xr-xscripts/automation/regression/unit_tests/functional_tests/functional_general_test.py22
-rwxr-xr-xscripts/automation/regression/unit_tests/functional_tests/hltapi_stream_builder_test.py629
-rwxr-xr-xscripts/automation/regression/unit_tests/functional_tests/misc_methods_test.py61
-rwxr-xr-xscripts/automation/regression/unit_tests/functional_tests/pkt_bld_general_test.py28
-rwxr-xr-xscripts/automation/regression/unit_tests/functional_tests/platform_cmd_cache_test.py60
-rwxr-xr-xscripts/automation/regression/unit_tests/functional_tests/platform_cmd_link_test.py62
-rwxr-xr-xscripts/automation/regression/unit_tests/functional_tests/platform_device_cfg_test.py20
-rwxr-xr-xscripts/automation/regression/unit_tests/functional_tests/platform_dual_if_obj_test.py31
-rwxr-xr-xscripts/automation/regression/unit_tests/functional_tests/platform_if_manager_test.py40
-rwxr-xr-xscripts/automation/regression/unit_tests/functional_tests/platform_if_obj_test.py49
-rw-r--r--scripts/automation/regression/unit_tests/functional_tests/scapy_pkt_builder_test.py368
-rw-r--r--scripts/automation/regression/unit_tests/functional_tests/stl_basic_tests.py258
-rwxr-xr-xscripts/automation/regression/unit_tests/tests_exceptions.py37
-rwxr-xr-xscripts/automation/regression/unit_tests/trex_general_test.py350
-rwxr-xr-xscripts/automation/regression/unit_tests/trex_imix_test.py202
-rwxr-xr-xscripts/automation/regression/unit_tests/trex_ipv6_test.py102
-rwxr-xr-xscripts/automation/regression/unit_tests/trex_nat_test.py169
-rwxr-xr-xscripts/automation/regression/unit_tests/trex_nbar_test.py193
-rwxr-xr-xscripts/automation/regression/unit_tests/trex_rx_test.py275
30 files changed, 298 insertions, 3321 deletions
diff --git a/scripts/automation/regression/aggregate_results.py b/scripts/automation/regression/aggregate_results.py
index 01f9ff56..ea782ccf 100755
--- a/scripts/automation/regression/aggregate_results.py
+++ b/scripts/automation/regression/aggregate_results.py
@@ -27,9 +27,9 @@ def is_functional_test_name(testname):
#if testname.startswith(('platform_', 'misc_methods_', 'vm_', 'payload_gen_', 'pkt_builder_')):
# return True
#return False
- if testname.startswith('unit_tests.'):
- return False
- return True
+ if testname.startswith('functional_tests.'):
+ return True
+ return False
def is_good_status(text):
return text in ('Successful', 'Fixed', 'Passed', 'True', 'Pass')
@@ -56,19 +56,20 @@ def add_th_th(key, value):
# returns <div> with table of tests under given category.
# category - string with name of category
-# hidden - bool, true = <div> is hidden by CSS
# tests - list of tests, derived from aggregated xml report, changed a little to get easily stdout etc.
+# tests_type - stateful or stateless
# category_info_dir - folder to search for category info file
# expanded - bool, false = outputs (stdout etc.) of tests are hidden by CSS
# brief - bool, true = cut some part of tests outputs (useful for errors section with expanded flag)
-def add_category_of_tests(category, tests, hidden = False, category_info_dir = None, expanded = False, brief = False):
+def add_category_of_tests(category, tests, tests_type = None, category_info_dir = None, expanded = False, brief = False):
is_actual_category = category not in (FUNCTIONAL_CATEGORY, ERROR_CATEGORY)
- html_output = '<div style="display:%s;" id="cat_tglr_%s">\n' % ('none' if hidden else 'block', category)
-
+ category_id = '_'.join([category, tests_type]) if tests_type else category
+ category_name = ' '.join([category, tests_type.capitalize()]) if tests_type else category
+ html_output = ''
if is_actual_category:
html_output += '<br><table class="reference">\n'
- if category_info_dir:
+ if category_info_dir and tests_type != 'stateless':
category_info_file = '%s/report_%s.info' % (category_info_dir, category)
if os.path.exists(category_info_file):
with open(category_info_file) as f:
@@ -80,6 +81,8 @@ def add_category_of_tests(category, tests, hidden = False, category_info_dir = N
else:
html_output += add_th_td('Info:', 'No info')
print 'add_category_of_tests: no category info %s' % category_info_file
+ if tests_type:
+ html_output += add_th_td('Tests type:', tests_type.capitalize())
if len(tests):
total_duration = 0.0
for test in tests:
@@ -94,7 +97,7 @@ def add_category_of_tests(category, tests, hidden = False, category_info_dir = N
if category == ERROR_CATEGORY:
html_output += 'Setup</th><th align="left">Failed tests:'
else:
- html_output += '%s tests:' % category
+ html_output += '%s tests:' % category_name
html_output += '</th><th align="center">Final Result</th>\n<th align="center">Time (s)</th>\n</tr>\n'
for test in tests:
functional_test = is_functional_test_name(test.attrib['name'])
@@ -103,7 +106,7 @@ def add_category_of_tests(category, tests, hidden = False, category_info_dir = N
if category == ERROR_CATEGORY:
test_id = ('err_' + test.attrib['classname'] + test.attrib['name']).replace('.', '_')
else:
- test_id = (category + test.attrib['name']).replace('.', '_')
+ test_id = (category_id + test.attrib['name']).replace('.', '_')
if expanded:
html_output += '<tr>\n<th>'
else:
@@ -128,6 +131,9 @@ def add_category_of_tests(category, tests, hidden = False, category_info_dir = N
result, result_text = test.attrib.get('result', ('', ''))
if result_text:
+ start_index_errors_stl = result_text.find('STLError: \n******')
+ if start_index_errors_stl > 0:
+ result_text = result_text[start_index_errors_stl:].strip() # cut traceback
start_index_errors = result_text.find('Exception: The test is failed, reasons:')
if start_index_errors > 0:
result_text = result_text[start_index_errors + 10:].strip() # cut traceback
@@ -147,7 +153,7 @@ def add_category_of_tests(category, tests, hidden = False, category_info_dir = N
else:
html_output += '<b style="color:000080;">No output</b></td></tr>'
- html_output += '\n</table>\n</div>'
+ html_output += '\n</table>'
return html_output
style_css = """
@@ -292,35 +298,40 @@ if __name__ == '__main__':
##### aggregate results to 1 single tree
aggregated_root = ET.Element('testsuite')
+ test_types = ('functional', 'stateful', 'stateless')
setups = {}
for job in jobs_list:
- xml_file = '%s/report_%s.xml' % (args.input_dir, job)
- if not os.path.exists(xml_file):
- message = '%s referenced in jobs_list.info does not exist!' % xml_file
+ setups[job] = {}
+ for test_type in test_types:
+ xml_file = '%s/report_%s_%s.xml' % (args.input_dir, job, test_type)
+ if not os.path.exists(xml_file):
+ continue
+ if os.path.basename(xml_file) == os.path.basename(args.output_xmlfile):
+ continue
+ setups[job][test_type] = []
+ print('Processing report: %s.%s' % (job, test_type))
+ tree = ET.parse(xml_file)
+ root = tree.getroot()
+ for key, value in root.attrib.items():
+ if key in aggregated_root.attrib and value.isdigit(): # sum total number of failed tests etc.
+ aggregated_root.attrib[key] = str(int(value) + int(aggregated_root.attrib[key]))
+ else:
+ aggregated_root.attrib[key] = value
+ tests = root.getchildren()
+ if not len(tests): # there should be tests:
+ message = 'No tests in xml %s' % xml_file
+ print message
+ #err.append(message)
+ for test in tests:
+ setups[job][test_type].append(test)
+ test.attrib['name'] = test.attrib['classname'] + '.' + test.attrib['name']
+ test.attrib['classname'] = job
+ aggregated_root.append(test)
+ if not sum([len(x) for x in setups[job].values()]):
+ message = 'No reports from setup %s!' % job
print message
err.append(message)
continue
- if os.path.basename(xml_file) == os.path.basename(args.output_xmlfile):
- continue
- setups[job] = []
- print('Processing setup: %s' % job)
- tree = ET.parse(xml_file)
- root = tree.getroot()
- for key, value in root.attrib.items():
- if key in aggregated_root.attrib and value.isdigit(): # sum total number of failed tests etc.
- aggregated_root.attrib[key] = str(int(value) + int(aggregated_root.attrib[key]))
- else:
- aggregated_root.attrib[key] = value
- tests = root.getchildren()
- if not len(tests): # there should be tests:
- message = 'No tests in xml %s' % xml_file
- print message
- err.append(message)
- for test in tests:
- setups[job].append(test)
- test.attrib['name'] = test.attrib['classname'] + '.' + test.attrib['name']
- test.attrib['classname'] = job
- aggregated_root.append(test)
total_tests_count = int(aggregated_root.attrib.get('tests', 0))
error_tests_count = int(aggregated_root.attrib.get('errors', 0))
@@ -426,7 +437,7 @@ if __name__ == '__main__':
if len(error_tests):
html_output += '\n<button onclick=tgl_cat("cat_tglr_{error}")>{error}</button>'.format(error = ERROR_CATEGORY)
# Setups buttons
- for category, tests in setups.items():
+ for category in setups.keys():
category_arr.append(category)
html_output += '\n<button onclick=tgl_cat("cat_tglr_%s")>%s</button>' % (category_arr[-1], category)
# Functional buttons
@@ -436,13 +447,22 @@ if __name__ == '__main__':
# Adding tests
# Error tests
if len(error_tests):
- html_output += add_category_of_tests(ERROR_CATEGORY, error_tests, hidden=False)
+ html_output += '<div style="display:block;" id="cat_tglr_%s">' % ERROR_CATEGORY
+ html_output += add_category_of_tests(ERROR_CATEGORY, error_tests)
+ html_output += '</div>'
# Setups tests
for category, tests in setups.items():
- html_output += add_category_of_tests(category, tests, hidden=True, category_info_dir=args.input_dir)
+ html_output += '<div style="display:none;" id="cat_tglr_%s">' % category
+ if tests.get('stateful'):
+ html_output += add_category_of_tests(category, tests['stateful'], 'stateful', category_info_dir=args.input_dir)
+ if tests.get('stateless'):
+ html_output += add_category_of_tests(category, tests['stateless'], 'stateless', category_info_dir=args.input_dir)
+ html_output += '</div>'
# Functional tests
if len(functional_tests):
- html_output += add_category_of_tests(FUNCTIONAL_CATEGORY, functional_tests.values(), hidden=True)
+ html_output += '<div style="display:none;" id="cat_tglr_%s">' % FUNCTIONAL_CATEGORY
+ html_output += add_category_of_tests(FUNCTIONAL_CATEGORY, functional_tests.values())
+ html_output += '</div>'
html_output += '\n\n<script type="text/javascript">\n var category_arr = %s\n' % ['cat_tglr_%s' % x for x in category_arr]
html_output += '''
@@ -524,7 +544,7 @@ if __name__ == '__main__':
for test in error_tests:
if test.attrib['classname'] == category:
failing_category = True
- if failing_category or not len(setups[category]):
+ if failing_category or not len(setups[category]) or not sum([len(x) for x in setups[category]]):
mail_output += '<table class="reference_fail" align=left style="Margin-bottom:10;Margin-right:10;">\n'
else:
mail_output += '<table class="reference" align=left style="Margin-bottom:10;Margin-right:10;">\n'
@@ -549,9 +569,9 @@ if __name__ == '__main__':
if len(error_tests) > 5:
mail_output += '\n<font color=red>More than 5 failed tests, showing brief output.<font>\n<br>'
# show only brief version (cut some info)
- mail_output += add_category_of_tests(ERROR_CATEGORY, error_tests, hidden=False, expanded=True, brief=True)
+ mail_output += add_category_of_tests(ERROR_CATEGORY, error_tests, expanded=True, brief=True)
else:
- mail_output += add_category_of_tests(ERROR_CATEGORY, error_tests, hidden=False, expanded=True)
+ mail_output += add_category_of_tests(ERROR_CATEGORY, error_tests, expanded=True)
else:
mail_output += '<table><tr style="font-size:120;color:green;font-family:arial"><td>☺</td><td style="font-size:20">All passed.</td></tr></table>\n'
mail_output += '\n</body>\n</html>'
diff --git a/scripts/automation/regression/functional_unit_tests.py b/scripts/automation/regression/functional_unit_tests.py
deleted file mode 100755
index 30e915c4..00000000
--- a/scripts/automation/regression/functional_unit_tests.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/router/bin/python
-
-__copyright__ = "Copyright 2014"
-
-
-
-import os
-import sys
-import outer_packages
-import nose
-from nose.plugins import Plugin
-import logging
-from rednose import RedNose
-import termstyle
-
-
-
-
-def set_report_dir (report_dir):
- if not os.path.exists(report_dir):
- os.mkdir(report_dir)
-
-if __name__ == "__main__":
-
- # setting defaults. By default we run all the test suite
- specific_tests = False
- disableLogCapture = False
- long_test = False
- report_dir = "reports"
-
- nose_argv= sys.argv + ['-s', '-v', '--exe', '--rednose', '--detailed-errors']
-
-# for arg in sys.argv:
-# if 'unit_tests/' in arg:
-# specific_tests = True
-# if 'log-path' in arg:
-# disableLogCapture = True
-# if arg=='--collect-only': # this is a user trying simply to view the available tests. removing xunit param from nose args
-# nose_argv[5:7] = []
-
-
-
- try:
- result = nose.run(argv = nose_argv, addplugins = [RedNose()])
-
- if (result == True):
- print termstyle.green("""
- ..::''''::..
- .;'' ``;.
- :: :: :: ::
- :: :: :: ::
- :: :: :: ::
- :: .:' :: :: `:. ::
- :: : : ::
- :: `:. .:' ::
- `;..``::::''..;'
- ``::,,,,::''
-
- ___ ___ __________
- / _ \/ _ | / __/ __/ /
- / ___/ __ |_\ \_\ \/_/
- /_/ /_/ |_/___/___(_)
-
- """)
- sys.exit(0)
- else:
- sys.exit(-1)
-
- finally:
- pass
-
-
-
-
-
-
-
-
diff --git a/scripts/automation/regression/misc_methods.py b/scripts/automation/regression/misc_methods.py
index 2341b9be..b5cf79e0 100755
--- a/scripts/automation/regression/misc_methods.py
+++ b/scripts/automation/regression/misc_methods.py
@@ -26,23 +26,16 @@ def run_command(cmd):
(stdout, stderr) = proc.communicate()
if stdout:
print 'Stdout:\n%s' % stdout
- if stderr:
- print 'Stderr:\n%s' % stderr
- print 'Return code: %s' % proc.returncode
+ if proc.returncode:
+ if stderr:
+ print 'Stderr:\n%s' % stderr
+ print 'Return code: %s' % proc.returncode
return (proc.returncode, stdout, stderr)
-def run_remote_command(host, passwd, command_string):
+def run_remote_command(host, command_string):
cmd = 'ssh -tt %s \'sudo sh -c "%s"\'' % (host, command_string)
- print 'Trying connection with ssh...'
- return_code, stdout, stderr = run_command(cmd)
- if return_code == 0:
- return (return_code, stdout, stderr)
- elif passwd is not None:
- print 'Trying connection with expect + sshpass.exp...'
- cmd = 'sshpass.exp %s %s root "%s"' % (passwd, host, command_string)
- return_code, stdout, stderr = run_command(cmd)
- return (return_code, stdout, stderr)
+ return run_command(cmd)
def generate_intf_lists (interfacesList):
diff --git a/scripts/automation/regression/stl/golden/basic_imix_golden.cap b/scripts/automation/regression/stl/golden/basic_imix_golden.cap
deleted file mode 100644
index 6ca32299..00000000
--- a/scripts/automation/regression/stl/golden/basic_imix_golden.cap
+++ /dev/null
Binary files differ
diff --git a/scripts/automation/regression/stl/golden/basic_imix_vm_golden.cap b/scripts/automation/regression/stl/golden/basic_imix_vm_golden.cap
deleted file mode 100644
index 43ae2368..00000000
--- a/scripts/automation/regression/stl/golden/basic_imix_vm_golden.cap
+++ /dev/null
Binary files differ
diff --git a/scripts/automation/regression/stl/golden/basic_tuple_gen_golden.cap b/scripts/automation/regression/stl/golden/basic_tuple_gen_golden.cap
deleted file mode 100644
index 7d5e7ec2..00000000
--- a/scripts/automation/regression/stl/golden/basic_tuple_gen_golden.cap
+++ /dev/null
Binary files differ
diff --git a/scripts/automation/regression/stl/golden/udp_590.cap b/scripts/automation/regression/stl/golden/udp_590.cap
deleted file mode 100644
index 29302f22..00000000
--- a/scripts/automation/regression/stl/golden/udp_590.cap
+++ /dev/null
Binary files differ
diff --git a/scripts/automation/regression/trex.py b/scripts/automation/regression/trex.py
index b9fd87ec..993c5be3 100644
--- a/scripts/automation/regression/trex.py
+++ b/scripts/automation/regression/trex.py
@@ -8,10 +8,33 @@ import re
import signal
import time
from CProgressDisp import TimedProgressBar
-import unit_tests.trex_general_test
-from unit_tests.tests_exceptions import TRexInUseError
+from stateful_tests.tests_exceptions import TRexInUseError
import datetime
+class CTRexScenario:
+ modes = set() # list of modes of this setup: loopback, virtual etc.
+ server_logs = False
+ is_test_list = False
+ is_init = False
+ is_stl_init = False
+ trex_crashed = False
+ configuration = None
+ trex = None
+ stl_trex = None
+ router = None
+ router_cfg = None
+ daemon_log_lines = 0
+ setup_name = None
+ setup_dir = None
+ router_image = None
+ trex_version = None
+ scripts_path = None
+ benchmark = None
+ report_dir = 'reports'
+ # logger = None
+ test_types = {'functional_tests': [], 'stateful_tests': [], 'stateless_tests': []}
+ is_copied = False
+
class CTRexRunner:
"""This is an instance for generating a CTRexRunner"""
@@ -67,7 +90,7 @@ class CTRexRunner:
trex_cmd = trex_cmd_str % (cores,
multiplier,
- duration,
+ duration,
self.yaml)
# self.trex_config['trex_latency'])
@@ -81,8 +104,8 @@ class CTRexRunner:
print "\nT-REX COMMAND: ", trex_cmd
- cmd = 'sshpass.exp %s %s root "cd %s; %s > %s"' % (self.trex_config['trex_password'],
- self.trex_config['trex_name'],
+ cmd = 'sshpass.exp %s %s root "cd %s; %s > %s"' % (self.trex_config['trex_password'],
+ self.trex_config['trex_name'],
self.trex_config['trex_version_path'],
trex_cmd,
export_path)
@@ -91,18 +114,18 @@ class CTRexRunner:
def generate_fetch_cmd (self, result_file_full_path="/tmp/trex.txt"):
""" generate_fetch_cmd(self, result_file_full_path) -> str
-
+
Generates a custom command for which will enable to fetch the resutls of the T-Rex run.
Returns a command (string) to be issued on the trex server.
-
+
Example use: fetch_trex_results() - command that will fetch the content from the default log file- /tmp/trex.txt
fetch_trex_results("/tmp/trex_secondary_file.txt") - command that will fetch the content from a custom log file- /tmp/trex_secondary_file.txt
"""
#dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
script_running_dir = os.path.dirname(os.path.realpath(__file__)) # get the current script working directory so that the sshpass could be accessed.
- cmd = script_running_dir + '/sshpass.exp %s %s root "cat %s"' % (self.trex_config['trex_password'],
- self.trex_config['trex_name'],
- result_file_full_path);
+ cmd = script_running_dir + '/sshpass.exp %s %s root "cat %s"' % (self.trex_config['trex_password'],
+ self.trex_config['trex_name'],
+ result_file_full_path);
return cmd;
@@ -153,10 +176,10 @@ class CTRexRunner:
interrupted = True
if ((end_time - start_time) < 2):
raise TRexInUseError ('T-Rex run failed since T-Rex is used by another process, or due to reachability issues')
- else:
- unit_tests.trex_general_test.CTRexScenario.trex_crashed = True
- # results = subprocess.Popen(cmd, stdout = open(os.devnull, 'wb'),
- # shell=True, preexec_fn=os.setsid)
+ else:
+ CTRexScenario.trex_crashed = True
+ # results = subprocess.Popen(cmd, stdout = open(os.devnull, 'wb'),
+ # shell=True, preexec_fn=os.setsid)
except KeyboardInterrupt:
print "\nT-Rex test interrupted by user during traffic generation!!"
results.killpg(results.pid, signal.SIGTERM) # Send the kill signal to all the process groups
@@ -174,7 +197,7 @@ class CTRexRunner:
sys.stderr.flush()
return None
else:
-
+
if tmp_path:
cmd = self.generate_fetch_cmd( tmp_path )#**kwargs)#results_file_path)
else:
@@ -198,7 +221,7 @@ class CTRexResult():
def __init__ (self, file, buffer = None):
self.file = file
self.buffer = buffer
- self.result = {}
+ self.result = {}
def load_file_lines (self):
@@ -230,7 +253,7 @@ class CTRexResult():
Parameters
----------
- key :
+ key :
Key of the self.result dictionary of the TRexResult instance
val : float
Key of the self.result dictionary of the TRexResult instance
@@ -240,8 +263,8 @@ class CTRexResult():
"""
s = _str.strip()
-
- if s[0]=="G":
+
+ if s[0]=="G":
val = val*1E9
elif s[0]=="M":
val = val*1E6
@@ -262,14 +285,14 @@ class CTRexResult():
def parse (self):
""" parse(self) -> None
- Parse the content of the result file from the TRex test and upload the data into
+ Parse the content of the result file from the TRex test and upload the data into
"""
stop_read = False
d = {
- 'total-tx' : 0,
- 'total-rx' : 0,
- 'total-pps' : 0,
- 'total-cps' : 0,
+ 'total-tx' : 0,
+ 'total-rx' : 0,
+ 'total-pps' : 0,
+ 'total-cps' : 0,
'expected-pps' : 0,
'expected-cps' : 0,
@@ -296,7 +319,7 @@ class CTRexResult():
# # continue to parse !! we try the second
# self.result[key] = val #update latest
- # check if we need to stop reading
+ # check if we need to stop reading
match = re.match(".*latency daemon has stopped.*", line)
if match:
stop_read = True
@@ -307,7 +330,7 @@ class CTRexResult():
key = misc_methods.mix_string(match.group(1))
val = float(match.group(4))
if d.has_key(key):
- if stop_read == False:
+ if stop_read == False:
self.update (key, val, match.group(5))
else:
self.result[key] = val # update latest
@@ -321,7 +344,7 @@ class CTRexResult():
key = misc_methods.mix_string(match.group(1))
val = float(match.group(4))
if d.has_key(key):
- if stop_read == False:
+ if stop_read == False:
self.update (key, val, match.group(5))
else:
self.result[key] = val # update latest
@@ -337,7 +360,7 @@ class CTRexResult():
match = re.match("\W*(\w(\w|[-])+)\W*([:]|[=])\W*(OK)(.*)", line)
if match:
key = misc_methods.mix_string(match.group(1))
- val = 0 # valid
+ val = 0 # valid
self.result[key] = val #update latest
continue
@@ -347,7 +370,7 @@ class CTRexResult():
val = float(match.group(3))
if self.result.has_key(key):
if (self.result[key] < val): # update only if larger than previous value
- self.result[key] = val
+ self.result[key] = val
else:
self.result[key] = val
continue
diff --git a/scripts/automation/regression/trex_unit_test.py b/scripts/automation/regression/trex_unit_test.py
index 1d75a8b6..753fc733 100755
--- a/scripts/automation/regression/trex_unit_test.py
+++ b/scripts/automation/regression/trex_unit_test.py
@@ -34,14 +34,16 @@ import CustomLogger
import misc_methods
from rednose import RedNose
import termstyle
-from unit_tests.trex_general_test import CTRexScenario
+from trex import CTRexScenario
from client.trex_client import *
from common.trex_exceptions import *
+from trex_stl_lib.api import *
import trex
import socket
from pprint import pprint
import subprocess
import re
+import time
def check_trex_path(trex_path):
if os.path.isfile('%s/trex_daemon_server' % trex_path):
@@ -60,34 +62,34 @@ def get_trex_path():
raise Exception('Could not determine trex_under_test folder, try setting env.var. TREX_UNDER_TEST')
return latest_build_path
-def _start_stop_trex_remote_server(trex_data, command):
- # start t-rex server as daemon process
- # subprocess.call(["/usr/bin/python", "trex_daemon_server", "restart"], cwd = trex_latest_build)
- misc_methods.run_remote_command(trex_data['trex_name'],
- trex_data['trex_password'],
- command)
-
-def start_trex_remote_server(trex_data, kill_running = False):
- if kill_running:
- (return_code, stdout, stderr) = misc_methods.run_remote_command(trex_data['trex_name'],
- trex_data['trex_password'],
- 'ps -u root --format comm,pid,cmd | grep t-rex-64')
- if stdout:
- for process in stdout.split('\n'):
- try:
- proc_name, pid, full_cmd = re.split('\s+', process, maxsplit=2)
- if proc_name.find('t-rex-64') >= 0:
- print 'Killing remote process: %s' % full_cmd
- misc_methods.run_remote_command(trex_data['trex_name'],
- trex_data['trex_password'],
- 'kill %s' % pid)
- except:
- continue
-
- _start_stop_trex_remote_server(trex_data, DAEMON_START_COMMAND)
-
-def stop_trex_remote_server(trex_data):
- _start_stop_trex_remote_server(trex_data, DAEMON_STOP_COMMAND)
+STATEFUL_STOP_COMMAND = './trex_daemon_server stop; sleep 1; ./trex_daemon_server stop; sleep 1'
+STATEFUL_RUN_COMMAND = 'rm /var/log/trex/trex_daemon_server.log; ./trex_daemon_server start; sleep 2; ./trex_daemon_server show'
+TREX_FILES = ('_t-rex-64', '_t-rex-64-o', '_t-rex-64-debug', '_t-rex-64-debug-o')
+
+def trex_remote_command(trex_data, command):
+ return misc_methods.run_remote_command(trex_data['trex_name'], ('cd %s; ' % CTRexScenario.scripts_path)+ command)
+
+# 1 = running, 0 - not running
+def check_trex_running(trex_data):
+ commands = []
+ for filename in TREX_FILES:
+ commands.append('ps -C %s > /dev/null' % filename)
+ (return_code, stdout, stderr) = trex_remote_command(trex_data, ' || '.join(commands))
+ return not return_code
+
+def kill_trex_process(trex_data):
+ (return_code, stdout, stderr) = trex_remote_command(trex_data, 'ps -u root --format comm,pid,cmd | grep _t-rex-64 | grep -v grep || true')
+ assert return_code == 0, 'last remote command failed'
+ if stdout:
+ for process in stdout.split('\n'):
+ try:
+ proc_name, pid, full_cmd = re.split('\s+', process, maxsplit=2)
+ if proc_name.find('t-rex-64') >= 0:
+ print 'Killing remote process: %s' % full_cmd
+ trex_remote_command(trex_data, 'kill %s' % pid)
+ except:
+ continue
+ (return_code, stdout, stderr) = trex_remote_command(trex_data, STATEFUL_STOP_COMMAND)
class CTRexTestConfiguringPlugin(Plugin):
def options(self, parser, env = os.environ):
@@ -105,26 +107,36 @@ class CTRexTestConfiguringPlugin(Plugin):
dest='log_path',
help='Specify path for the tests` log to be saved at. Once applied, logs capturing by nose will be disabled.') # Default is CURRENT/WORKING/PATH/trex_log/trex_log.log')
parser.add_option('--verbose-mode', '--verbose_mode', action="store_true", default = False,
- dest="verbose_mode",
+ dest="verbose_mode",
help="Print RPC command and router commands.")
parser.add_option('--server-logs', '--server_logs', action="store_true", default = False,
- dest="server_logs",
+ dest="server_logs",
help="Print server side (TRex and trex_daemon) logs per test.")
- parser.add_option('--kill-running', '--kill_running', action="store_true", default = False,
- dest="kill_running",
+ parser.add_option('--kill-running', action="store_true", default = False,
+ dest="kill_running",
help="Kills running TRex process on remote server (useful for regression).")
- parser.add_option('--functional', action="store_true", default = False,
- dest="functional",
- help="Don't connect to remote server for runnning daemon (For functional tests).")
+ parser.add_option('--func', '--functional', action="store_true", default = False,
+ dest="functional",
+ help="Run functional tests.")
+ parser.add_option('--stl', '--stateless', action="store_true", default = False,
+ dest="stateless",
+ help="Run stateless tests.")
+ parser.add_option('--stf', '--stateful', action="store_true", default = False,
+ dest="stateful",
+ help="Run stateful tests.")
parser.add_option('--copy', action="store_true", default = False,
- dest="copy",
+ dest="copy",
help="Copy TRex server to temp directory and run from there.")
+ parser.add_option('--no-ssh', '--no_ssh', action="store_true", default = False,
+ dest="no_ssh",
+ help="Flag wherever not to connect via ssh to run the daemons etc.")
def configure(self, options, conf):
self.functional = options.functional
+ self.stateless = options.stateless
+ self.stateful = options.stateful
+ self.copy = options.copy
self.collect_only = options.collect_only
- if self.functional or self.collect_only:
- return
if CTRexScenario.setup_dir and options.config_path:
raise Exception('Please either define --cfg or use env. variable SETUP_DIR, not both.')
if not options.config_path and CTRexScenario.setup_dir:
@@ -139,40 +151,69 @@ class CTRexTestConfiguringPlugin(Plugin):
self.kill_running = options.kill_running
self.load_image = options.load_image
self.verbose_mode = options.verbose_mode
+ self.no_ssh = options.no_ssh
self.clean_config = False if options.skip_clean_config else True
self.server_logs = options.server_logs
if options.log_path:
self.loggerPath = options.log_path
def begin (self):
- if self.functional or self.collect_only:
- return
# initialize CTRexScenario global testing class, to be used by all tests
CTRexScenario.configuration = self.configuration
CTRexScenario.benchmark = self.benchmark
CTRexScenario.modes = set(self.modes)
CTRexScenario.server_logs = self.server_logs
-
+ if self.copy and not CTRexScenario.is_copied and not self.no_ssh:
+ new_path = '/tmp/trex_scripts'
+ (return_code, stdout, stderr) = trex_remote_command(CTRexScenario.configuration.trex,
+ 'mkdir -p %s; rsync -L -az %s/ %s' % (new_path, CTRexScenario.scripts_path, new_path))
+ if return_code:
+ print 'Failed copying'
+ sys.exit(-1)
+ CTRexScenario.scripts_path = new_path
+ CTRexScenario.is_copied = True
+ if self.functional or self.collect_only:
+ return
# launch TRex daemon on relevant setup
- start_trex_remote_server(self.configuration.trex, self.kill_running)
- CTRexScenario.trex = CTRexClient(trex_host = self.configuration.trex['trex_name'], verbose = self.verbose_mode)
-
+ if not self.no_ssh:
+ if self.kill_running:
+ kill_trex_process(CTRexScenario.configuration.trex)
+ time.sleep(1)
+ elif check_trex_running(CTRexScenario.configuration.trex):
+ print 'TRex is already running'
+ sys.exit(-1)
+
+
+ if self.stateful:
+ if not self.no_ssh:
+ trex_remote_command(CTRexScenario.configuration.trex, STATEFUL_RUN_COMMAND)
+ CTRexScenario.trex = CTRexClient(trex_host = CTRexScenario.configuration.trex['trex_name'], verbose = self.verbose_mode)
+ elif self.stateless:
+ if not self.no_ssh:
+ trex_remote_command(CTRexScenario.configuration.trex, './t-rex-64 -i&')
+ CTRexScenario.stl_trex = STLClient(username = 'TRexRegression',
+ server = CTRexScenario.configuration.trex['trex_name'],
+ sync_port = 4501,
+ async_port = 4500,
+ verbose_level = self.verbose_mode,
+ logger = None)
if 'loopback' not in self.modes:
- CTRexScenario.router_cfg = dict( config_dict = self.configuration.router,
- forceImageReload = self.load_image,
- silent_mode = not self.verbose_mode,
- forceCleanConfig = self.clean_config,
- tftp_config_dict = self.configuration.tftp )
+ CTRexScenario.router_cfg = dict(config_dict = self.configuration.router,
+ forceImageReload = self.load_image,
+ silent_mode = not self.verbose_mode,
+ forceCleanConfig = self.clean_config,
+ tftp_config_dict = self.configuration.tftp)
try:
CustomLogger.setup_custom_logger('TRexLogger', self.loggerPath)
except AttributeError:
CustomLogger.setup_custom_logger('TRexLogger')
-
+
def finalize(self, result):
if self.functional or self.collect_only:
return
- CTRexScenario.is_init = False
- stop_trex_remote_server(self.configuration.trex)
+ CTRexScenario.is_init = False
+ if not self.no_ssh:
+ kill_trex_process(CTRexScenario.configuration.trex)
def save_setup_info():
@@ -195,102 +236,111 @@ def set_report_dir (report_dir):
if not os.path.exists(report_dir):
os.mkdir(report_dir)
-
if __name__ == "__main__":
-
+
# setting defaults. By default we run all the test suite
specific_tests = False
- disableLogCapture = False
- long_test = False
- xml_name = 'unit_test.xml'
CTRexScenario.report_dir = 'reports'
- CTRexScenario.scripts_path = get_trex_path()
- COMMON_RUN_COMMAND = 'rm /var/log/trex/trex_daemon_server.log; ./trex_daemon_server start; sleep 2; ./trex_daemon_server show'
- COMMON_STOP_COMMAND = './trex_daemon_server stop; sleep 1; ./trex_daemon_server stop; sleep 1'
- if '--copy' in sys.argv:
- new_path = '/tmp/trex_scripts'
- DAEMON_STOP_COMMAND = 'cd %s; %s' % (new_path, COMMON_STOP_COMMAND)
- DAEMON_START_COMMAND = 'mkdir -p %s; cd %s; %s; rsync -L -az %s/ %s; %s' % (new_path, new_path, COMMON_STOP_COMMAND,
- CTRexScenario.scripts_path, new_path, COMMON_RUN_COMMAND)
- else:
- DAEMON_STOP_COMMAND = 'cd %s; %s' % (CTRexScenario.scripts_path, COMMON_STOP_COMMAND)
- DAEMON_START_COMMAND = DAEMON_STOP_COMMAND + COMMON_RUN_COMMAND
-
+ need_to_copy = False
setup_dir = os.getenv('SETUP_DIR', '').rstrip('/')
CTRexScenario.setup_dir = check_setup_path(setup_dir)
+ CTRexScenario.scripts_path = get_trex_path()
if not CTRexScenario.setup_dir:
CTRexScenario.setup_dir = check_setup_path(os.path.join('setups', setup_dir))
-
- if CTRexScenario.setup_dir:
- CTRexScenario.setup_name = os.path.basename(CTRexScenario.setup_dir)
- xml_name = 'report_%s.xml' % CTRexScenario.setup_name
+
nose_argv = ['', '-s', '-v', '--exe', '--rednose', '--detailed-errors']
if '--collect-only' in sys.argv: # this is a user trying simply to view the available tests. no need xunit.
- CTRexScenario.is_test_list = True
+ CTRexScenario.is_test_list = True
+ xml_arg = ''
else:
- nose_argv += ['--with-xunit', '--xunit-file=%s/%s' % (CTRexScenario.report_dir, xml_name)]
+ xml_name = 'unit_test.xml'
+ if CTRexScenario.setup_dir:
+ CTRexScenario.setup_name = os.path.basename(CTRexScenario.setup_dir)
+ xml_name = 'report_%s.xml' % CTRexScenario.setup_name
+ xml_arg= '--xunit-file=%s/%s' % (CTRexScenario.report_dir, xml_name)
set_report_dir(CTRexScenario.report_dir)
+ sys_args = sys.argv[:]
for i, arg in enumerate(sys.argv):
- if 'unit_tests/' in arg:
- specific_tests = True
- sys.argv[i] = arg[arg.find('unit_tests/'):]
if 'log-path' in arg:
- disableLogCapture = True
-
- nose_argv += sys.argv
-
- # Run all of the unit tests or just the selected ones
- if not specific_tests:
- if '--functional' in sys.argv:
- nose_argv += ['unit_tests/functional_tests']
+ nose_argv += ['--nologcapture']
else:
- nose_argv += ['unit_tests']
- if disableLogCapture:
- nose_argv += ['--nologcapture']
+ for tests_type in CTRexScenario.test_types.keys():
+ if tests_type in arg:
+ specific_tests = True
+ CTRexScenario.test_types[tests_type].append(arg[arg.find(tests_type):])
+ sys_args.remove(arg)
+ if not specific_tests:
+ for key in ('--func', '--functional'):
+ if key in sys_args:
+ CTRexScenario.test_types['functional_tests'].append('functional_tests')
+ sys_args.remove(key)
+ for key in ('--stf', '--stateful'):
+ if key in sys_args:
+ CTRexScenario.test_types['stateful_tests'].append('stateful_tests')
+ sys_args.remove(key)
+ for key in ('--stl', '--stateless'):
+ if key in sys_args:
+ CTRexScenario.test_types['stateless_tests'].append('stateless_tests')
+ sys_args.remove(key)
+ # Run all of the tests or just the selected ones
+ if not sum([len(x) for x in CTRexScenario.test_types.values()]):
+ for key in CTRexScenario.test_types.keys():
+ CTRexScenario.test_types[key].append(key)
+
+ nose_argv += sys_args
+
+ config_plugin = CTRexTestConfiguringPlugin()
+ red_nose = RedNose()
+ result = True
try:
- config_plugin = CTRexTestConfiguringPlugin()
- red_nose = RedNose()
- try:
- result = nose.run(argv = nose_argv, addplugins = [red_nose, config_plugin])
- except socket.error: # handle consecutive tests exception, try once again
- print "TRex connectivity error identified. Possibly due to consecutive nightly runs.\nRetrying..."
- result = nose.run(argv = nose_argv, addplugins = [red_nose, config_plugin])
- finally:
- save_setup_info()
-
- if (result == True and not CTRexScenario.is_test_list):
- print termstyle.green("""
- ..::''''::..
- .;'' ``;.
- :: :: :: ::
- :: :: :: ::
- :: :: :: ::
- :: .:' :: :: `:. ::
- :: : : ::
- :: `:. .:' ::
- `;..``::::''..;'
- ``::,,,,::''
-
- ___ ___ __________
- / _ \/ _ | / __/ __/ /
- / ___/ __ |_\ \_\ \/_/
- /_/ /_/ |_/___/___(_)
-
- """)
- sys.exit(0)
- else:
- sys.exit(-1)
-
+ if len(CTRexScenario.test_types['functional_tests']):
+ additional_args = ['--func'] + CTRexScenario.test_types['functional_tests']
+ if xml_arg:
+ additional_args += ['--with-xunit', xml_arg.replace('.xml', '_functional.xml')]
+ result = nose.run(argv = nose_argv + additional_args, addplugins = [red_nose, config_plugin])
+ if len(CTRexScenario.test_types['stateful_tests']):
+ additional_args = ['--stf'] + CTRexScenario.test_types['stateful_tests']
+ if xml_arg:
+ additional_args += ['--with-xunit', xml_arg.replace('.xml', '_stateful.xml')]
+ result = result and nose.run(argv = nose_argv + additional_args, addplugins = [red_nose, config_plugin])
+ if len(CTRexScenario.test_types['stateless_tests']):
+ additional_args = ['--stl'] + CTRexScenario.test_types['stateless_tests']
+ if xml_arg:
+ additional_args += ['--with-xunit', xml_arg.replace('.xml', '_stateless.xml')]
+ result = result and nose.run(argv = nose_argv + additional_args, addplugins = [red_nose, config_plugin])
finally:
- pass
-
-
-
+ save_setup_info()
+
+ if (result == True and not CTRexScenario.is_test_list):
+ print termstyle.green("""
+ ..::''''::..
+ .;'' ``;.
+ :: :: :: ::
+ :: :: :: ::
+ :: :: :: ::
+ :: .:' :: :: `:. ::
+ :: : : ::
+ :: `:. .:' ::
+ `;..``::::''..;'
+ ``::,,,,::''
+
+ ___ ___ __________
+ / _ \/ _ | / __/ __/ /
+ / ___/ __ |_\ \_\ \/_/
+ /_/ /_/ |_/___/___(_)
+
+ """)
+ sys.exit(0)
+ sys.exit(-1)
+
+
+
+
+
-
diff --git a/scripts/automation/regression/unit_tests/__init__.py b/scripts/automation/regression/unit_tests/__init__.py
deleted file mode 100755
index 8b137891..00000000
--- a/scripts/automation/regression/unit_tests/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/scripts/automation/regression/unit_tests/functional_tests/config.yaml b/scripts/automation/regression/unit_tests/functional_tests/config.yaml
deleted file mode 100644
index 4f4c7c40..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/config.yaml
+++ /dev/null
@@ -1,74 +0,0 @@
-################################################################
-#### T-Rex nightly test configuration file ####
-################################################################
-
-
-### T-Rex configuration:
-# hostname - can be DNS name or IP for the TRex machine for ssh to the box
-# password - root password for TRex machine
-# is_dual - should the TRex inject with -p ?
-# version_path - path to the t-rex version and executable
-# cores - how many cores should be used
-# latency - rate of latency packets injected by the TRex
-
-### Router configuration:
-# hostname - the router hostname as apears in ______# cli prefix
-# ip_address - the router's ip that can be used to communicate with
-# image - the desired imaged wished to be loaded as the router's running config
-# line_password - router password when access via Telent
-# en_password - router password when changing to "enable" mode
-# interfaces - an array of client-server pairs, representing the interfaces configurations of the router
-# configurations - an array of configurations that could possibly loaded into the router during the test.
-# The "clean" configuration is a mandatory configuration the router will load with to run the basic test bench
-
-### TFTP configuration:
-# hostname - the tftp hostname
-# ip_address - the tftp's ip address
-# images_path - the tftp's relative path in which the router's images are located
-
-### Test_misc configuration:
-# expected_bw - the "golden" bandwidth (in Gbps) results planned on receiving from the test
-
-trex:
- hostname : hostname
- password : root password
- version_path : not used
- cores : 1
-
-router:
- model : device model
- hostname : device hostname
- ip_address : device ip
- image : device image name
- line_password : telnet pass
- en_password : enable pass
- mgmt_interface : GigabitEthernet0/0/0
- clean_config : path to clean_config file
- intf_masking : 255.255.255.0
- ipv6_mask : 64
- interfaces :
- - client :
- name : GigabitEthernet0/0/1
- src_mac_addr : 0000.0001.0000
- dest_mac_addr : 0000.1000.0000
- server :
- name : GigabitEthernet0/0/2
- src_mac_addr : 0000.0002.0000
- dest_mac_addr : 0000.2000.0000
- vrf_name : null
- - client :
- name : GigabitEthernet0/0/3
- src_mac_addr : 0000.0003.0000
- dest_mac_addr : 0000.3000.0000
- server :
- name : GigabitEthernet0/0/4
- src_mac_addr : 0000.0004.0000
- dest_mac_addr : 0000.4000.0000
- vrf_name : dup
-
-
-tftp:
- hostname : tftp hostname
- ip_address : tftp ip
- root_dir : tftp root dir
- images_path : path related to root dir
diff --git a/scripts/automation/regression/unit_tests/functional_tests/functional_general_test.py b/scripts/automation/regression/unit_tests/functional_tests/functional_general_test.py
deleted file mode 100755
index 525b58d2..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/functional_general_test.py
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/router/bin/python
-
-from nose.tools import assert_equal
-from nose.tools import assert_not_equal
-from nose.tools import assert_raises
-from nose.tools import raises
-
-
-class CGeneralFunctional_Test(object):
- def __init__(self):
- pass
-
-
- def setUp(self):
- pass
-
-
- def tearDown(self):
- pass
-
-if __name__ == "__main__":
- pass
diff --git a/scripts/automation/regression/unit_tests/functional_tests/hltapi_stream_builder_test.py b/scripts/automation/regression/unit_tests/functional_tests/hltapi_stream_builder_test.py
deleted file mode 100755
index c6b477aa..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/hltapi_stream_builder_test.py
+++ /dev/null
@@ -1,629 +0,0 @@
-#!/router/bin/python
-
-import os
-import unittest
-from trex_stl_lib.trex_stl_hltapi import STLHltStream
-from trex_stl_lib.trex_stl_types import validate_type
-from nose.plugins.attrib import attr
-from nose.tools import nottest
-
-def compare_yamls(yaml1, yaml2):
- validate_type('yaml1', yaml1, str)
- validate_type('yaml2', yaml2, str)
- i = 0
- for line1, line2 in zip(yaml1.strip().split('\n'), yaml2.strip().split('\n')):
- i += 1
- assert line1 == line2, 'yamls are not equal starting from line %s:\n%s\n Golden <-> Generated\n%s' % (i, line1.strip(), line2.strip())
-
-# TODO: move the tests to compare pcaps, not yamls
-@nottest
-class CTRexHltApi_Test(unittest.TestCase):
- ''' Checks correct HLTAPI creation of packet/VM '''
-
- def setUp(self):
- self.golden_yaml = None
- self.test_yaml = None
-
- def tearDown(self):
- compare_yamls(self.golden_yaml, self.test_yaml)
-
- # Eth/IP/TCP, all values default, no VM instructions + test MACs correction
- def test_hlt_basic(self):
- STLHltStream(mac_src = 'a0:00:01:::01', mac_dst = '0d 00 01 00 00 01',
- mac_src2 = '{00 b0 01 00 00 01}', mac_dst2 = 'd0.00.01.00.00.01')
- with self.assertRaises(Exception):
- STLHltStream(mac_src2 = '00:00:00:00:00:0k')
- with self.assertRaises(Exception):
- STLHltStream(mac_dst2 = '100:00:00:00:00:00')
- # wrong encap
- with self.assertRaises(Exception):
- STLHltStream(l2_encap = 'ethernet_sdfgsdfg')
- # all default values
- test_stream = STLHltStream()
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- self.golden_yaml = '''
-- stream:
- action_count: 0
- enabled: true
- flags: 3
- isg: 0.0
- mode:
- percentage: 10.0
- type: continuous
- packet:
- binary: AAAAAAAAAAABAAABCABFAAAyAAAAAEAGusUAAAAAwAAAAQQAAFAAAAABAAAAAVAAD+U1/QAAISEhISEhISEhIQ==
- meta: ''
- flow_stats:
- enabled: false
- self_start: true
- vm:
- instructions: []
- split_by_var: ''
-'''
-
- # Eth/IP/TCP, test MAC fields VM, wait for masking of variables for MAC
- @nottest
- def test_macs_vm(self):
- test_stream = STLHltStream(name = 'stream-0', )
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- self.golden_yaml = '''
-TBD
-'''
-
-
- # Eth/IP/TCP, ip src and dest is changed by VM
- def test_ip_ranges(self):
- # running on single core not implemented yet
- with self.assertRaises(Exception):
- test_stream = STLHltStream(split_by_cores = 'single',
- ip_src_addr = '192.168.1.1',
- ip_src_mode = 'increment',
- ip_src_count = 5,)
- # wrong type
- with self.assertRaises(Exception):
- test_stream = STLHltStream(split_by_cores = 12345,
- ip_src_addr = '192.168.1.1',
- ip_src_mode = 'increment',
- ip_src_count = 5,)
-
- test_stream = STLHltStream(split_by_cores = 'duplicate',
- ip_src_addr = '192.168.1.1',
- ip_src_mode = 'increment',
- ip_src_count = 5,
- ip_dst_addr = '5.5.5.5',
- ip_dst_count = 2,
- ip_dst_mode = 'random',
- name = 'test_ip_ranges',
- rate_pps = 1)
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- self.golden_yaml = '''
-- name: test_ip_ranges
- stream:
- action_count: 0
- enabled: true
- flags: 3
- isg: 0.0
- mode:
- pps: 1.0
- type: continuous
- packet:
- binary: AAAAAAAAAAABAAABCABFAAAyAAAAAEAGrxPAqAEBBQUFBQQAAFAAAAABAAAAAVAAD+UqSwAAISEhISEhISEhIQ==
- meta: ''
- flow_stats:
- enabled: false
- self_start: true
- vm:
- instructions:
- - init_value: 0
- max_value: 4
- min_value: 0
- name: inc_4_4_1
- op: inc
- size: 4
- step: 1
- type: flow_var
- - add_value: 3232235777
- is_big_endian: true
- name: inc_4_4_1
- pkt_offset: 26
- type: write_flow_var
- - init_value: 0
- max_value: 4294967295
- min_value: 0
- name: ip_dst_random
- op: random
- size: 4
- step: 1
- type: flow_var
- - add_value: 0
- is_big_endian: true
- name: ip_dst_random
- pkt_offset: 30
- type: write_flow_var
- - pkt_offset: 14
- type: fix_checksum_ipv4
- split_by_var: ''
-'''
-
- # Eth / IP / TCP, tcp ports are changed by VM
- def test_tcp_ranges(self):
- test_stream = STLHltStream(tcp_src_port_mode = 'decrement',
- tcp_src_port_count = 10,
- tcp_dst_port_mode = 'random',
- tcp_dst_port_count = 10,
- tcp_dst_port = 1234,
- name = 'test_tcp_ranges',
- rate_pps = '2')
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- self.golden_yaml = '''
-- name: test_tcp_ranges
- stream:
- action_count: 0
- enabled: true
- flags: 3
- isg: 0.0
- mode:
- pps: 2.0
- type: continuous
- packet:
- binary: AAAAAAAAAAABAAABCABFAAAyAAAAAEAGusUAAAAAwAAAAQQABNIAAAABAAAAAVAAD+UxewAAISEhISEhISEhIQ==
- meta: ''
- flow_stats:
- enabled: false
- self_start: true
- vm:
- instructions:
- - init_value: 9
- max_value: 9
- min_value: 0
- name: dec_2_9_1
- op: dec
- size: 2
- step: 1
- type: flow_var
- - add_value: 1015
- is_big_endian: true
- name: dec_2_9_1
- pkt_offset: 34
- type: write_flow_var
- - init_value: 0
- max_value: 65535
- min_value: 0
- name: tcp_dst_random
- op: random
- size: 2
- step: 1
- type: flow_var
- - add_value: 0
- is_big_endian: true
- name: tcp_dst_random
- pkt_offset: 36
- type: write_flow_var
- - pkt_offset: 14
- type: fix_checksum_ipv4
- split_by_var: dec_2_9_1
-'''
-
- # Eth / IP / UDP, udp ports are changed by VM
- def test_udp_ranges(self):
- # UDP is not set, expecting ignore of wrong UDP arguments
- STLHltStream(udp_src_port_mode = 'qwerqwer',
- udp_src_port_count = 'weqwer',
- udp_src_port = 'qwerqwer',
- udp_dst_port_mode = 'qwerqwe',
- udp_dst_port_count = 'sfgsdfg',
- udp_dst_port = 'sdfgsdfg')
- # UDP is set, expecting fail due to wrong UDP arguments
- with self.assertRaises(Exception):
- STLHltStream(l4_protocol = 'udp',
- udp_src_port_mode = 'qwerqwer',
- udp_src_port_count = 'weqwer',
- udp_src_port = 'qwerqwer',
- udp_dst_port_mode = 'qwerqwe',
- udp_dst_port_count = 'sfgsdfg',
- udp_dst_port = 'sdfgsdfg')
- # generate it already with correct arguments
- test_stream = STLHltStream(l4_protocol = 'udp',
- udp_src_port_mode = 'decrement',
- udp_src_port_count = 10,
- udp_src_port = 1234,
- udp_dst_port_mode = 'increment',
- udp_dst_port_count = 10,
- udp_dst_port = 1234,
- name = 'test_udp_ranges',
- rate_percent = 20,)
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- self.golden_yaml = '''
-- name: test_udp_ranges
- stream:
- action_count: 0
- enabled: true
- flags: 3
- isg: 0.0
- mode:
- percentage: 20.0
- type: continuous
- packet:
- binary: AAAAAAAAAAABAAABCABFAAAyAAAAAEARuroAAAAAwAAAAQTSBNIAHsmgISEhISEhISEhISEhISEhISEhISEhIQ==
- meta: ''
- flow_stats:
- enabled: false
- self_start: true
- vm:
- instructions:
- - init_value: 9
- max_value: 9
- min_value: 0
- name: dec_2_9_1
- op: dec
- size: 2
- step: 1
- type: flow_var
- - add_value: 1225
- is_big_endian: true
- name: dec_2_9_1
- pkt_offset: 34
- type: write_flow_var
- - init_value: 0
- max_value: 9
- min_value: 0
- name: inc_2_9_1
- op: inc
- size: 2
- step: 1
- type: flow_var
- - add_value: 1234
- is_big_endian: true
- name: inc_2_9_1
- pkt_offset: 36
- type: write_flow_var
- - pkt_offset: 14
- type: fix_checksum_ipv4
- split_by_var: dec_2_9_1
-'''
-
- # Eth/IP/TCP, packet length is changed in VM by frame_size
- def test_pkt_len_by_framesize(self):
- # just check errors, no compare to golden
- STLHltStream(length_mode = 'increment',
- frame_size_min = 100,
- frame_size_max = 3000)
- test_stream = STLHltStream(length_mode = 'decrement',
- frame_size_min = 100,
- frame_size_max = 3000,
- name = 'test_pkt_len_by_framesize',
- rate_bps = 1000)
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- self.golden_yaml = '''
-- name: test_pkt_len_by_framesize
- stream:
- action_count: 0
- enabled: true
- flags: 3
- isg: 0.0
- mode:
- bps_L2: 1000.0
- type: continuous
- packet:
- binary: AAAAAAAAAAABAAABCABFAAuqAAAAAEAGr00AAAAAwAAAAQQAAFAAAAABAAAAAVAAD+UwiwAAISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEh
- meta: ''
- flow_stats:
- enabled: false
- self_start: true
- vm:
- instructions:
- - init_value: 3000
- max_value: 3000
- min_value: 100
- name: pkt_len
- op: dec
- size: 2
- step: 1
- type: flow_var
- - name: pkt_len
- type: trim_pkt_size
- - add_value: -14
- is_big_endian: true
- name: pkt_len
- pkt_offset: 16
- type: write_flow_var
- - pkt_offset: 14
- type: fix_checksum_ipv4
- split_by_var: pkt_len
-'''
-
- # Eth/IP/UDP, packet length is changed in VM by l3_length
- def test_pkt_len_by_l3length(self):
- test_stream = STLHltStream(l4_protocol = 'udp',
- length_mode = 'random',
- l3_length_min = 100,
- l3_length_max = 400,
- name = 'test_pkt_len_by_l3length')
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- self.golden_yaml = '''
-- name: test_pkt_len_by_l3length
- stream:
- action_count: 0
- enabled: true
- flags: 3
- isg: 0.0
- mode:
- percentage: 10.0
- type: continuous
- packet:
- binary: AAAAAAAAAAABAAABCABFAAGQAAAAAEARuVwAAAAAwAAAAQQAAFABfCaTISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEh
- meta: ''
- flow_stats:
- enabled: false
- self_start: true
- vm:
- instructions:
- - init_value: 114
- max_value: 414
- min_value: 114
- name: pkt_len
- op: random
- size: 2
- step: 1
- type: flow_var
- - name: pkt_len
- type: trim_pkt_size
- - add_value: -14
- is_big_endian: true
- name: pkt_len
- pkt_offset: 16
- type: write_flow_var
- - add_value: -34
- is_big_endian: true
- name: pkt_len
- pkt_offset: 38
- type: write_flow_var
- - pkt_offset: 14
- type: fix_checksum_ipv4
- split_by_var: ''
-'''
-
- # Eth/IP/TCP, with vlan, no VM
- def test_vlan_basic(self):
- with self.assertRaises(Exception):
- STLHltStream(l2_encap = 'ethernet_ii',
- vlan_id = 'sdfgsdgf')
- test_stream = STLHltStream(l2_encap = 'ethernet_ii')
- assert ':802.1Q:' not in test_stream.get_pkt_type(), 'Default packet should not include dot1q'
-
- test_stream = STLHltStream(name = 'test_vlan_basic', l2_encap = 'ethernet_ii_vlan')
- assert ':802.1Q:' in test_stream.get_pkt_type(), 'No dot1q in packet with encap ethernet_ii_vlan'
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- self.golden_yaml = '''
-- name: test_vlan_basic
- stream:
- action_count: 0
- enabled: true
- flags: 3
- isg: 0.0
- mode:
- percentage: 10.0
- type: continuous
- packet:
- binary: AAAAAAAAAAABAAABgQAwAAgARQAALgAAAABABrrJAAAAAMAAAAEEAABQAAAAAQAAAAFQAA/leEMAACEhISEhIQ==
- meta: ''
- flow_stats:
- enabled: false
- self_start: true
- vm:
- instructions: []
- split_by_var: ''
-'''
-
- # Eth/IP/TCP, with 4 vlan
- def test_vlan_multiple(self):
- # default frame size should be not enough
- with self.assertRaises(Exception):
- STLHltStream(vlan_id = [1, 2, 3, 4])
- test_stream = STLHltStream(name = 'test_vlan_multiple', frame_size = 100,
- vlan_id = [1, 2, 3, 4], # can be either array or string separated by spaces
- vlan_protocol_tag_id = '8100 0x8100')
- pkt_layers = test_stream.get_pkt_type()
- assert '802.1Q:' * 4 in pkt_layers, 'No four dot1q layers in packet: %s' % pkt_layers
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- self.golden_yaml = '''
-- name: test_vlan_multiple
- stream:
- action_count: 0
- enabled: true
- flags: 3
- isg: 0.0
- mode:
- percentage: 10.0
- type: continuous
- packet:
- binary: AAAAAAAAAAABAAABgQAwAYEAMAKBADADgQAwBAgARQAARgAAAABABrqxAAAAAMAAAAEEAABQAAAAAQAAAAFQAA/l6p0AACEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQ==
- meta: ''
- flow_stats:
- enabled: false
- self_start: true
- vm:
- instructions: []
- split_by_var: ''
-'''
-
- # Eth/IP/TCP, with 5 vlans and VMs on vlan_id
- def test_vlan_vm(self):
- test_stream = STLHltStream(name = 'test_vlan_vm', frame_size = 100,
- vlan_id = '1 2 1000 4 5', # 5 vlans
- vlan_id_mode = 'increment fixed decrement random', # 5th vlan will be default fixed
- vlan_id_step = 2, # 1st vlan step will be 2, others - default 1
- vlan_id_count = [4, 1, 10], # 4th independent on count, 5th will be fixed
- )
- pkt_layers = test_stream.get_pkt_type()
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- assert '802.1Q:' * 5 in pkt_layers, 'No five dot1q layers in packet: %s' % pkt_layers
- self.golden_yaml = '''
-- name: test_vlan_vm
- stream:
- action_count: 0
- enabled: true
- flags: 3
- isg: 0.0
- mode:
- percentage: 10.0
- type: continuous
- packet:
- binary: AAAAAAAAAAABAAABgQAwAYEAMAKBADPogQAwBIEAMAUIAEUAAEIAAAAAQAa6tQAAAADAAAABBAAAUAAAAAEAAAABUAAP5SzkAAAhISEhISEhISEhISEhISEhISEhISEhISEhIQ==
- meta: ''
- flow_stats:
- enabled: false
- self_start: true
- vm:
- instructions:
- - init_value: 0
- max_value: 6
- min_value: 0
- name: dec_2_3_2
- op: inc
- size: 2
- step: 2
- type: flow_var
- - add_value: 1
- is_big_endian: true
- mask: 4095
- name: dec_2_3_2
- pkt_cast_size: 2
- pkt_offset: 14
- shift: 0
- type: write_mask_flow_var
- - init_value: 9
- max_value: 9
- min_value: 0
- name: dec_2_9_1
- op: dec
- size: 2
- step: 1
- type: flow_var
- - add_value: 991
- is_big_endian: true
- mask: 4095
- name: dec_2_9_1
- pkt_cast_size: 2
- pkt_offset: 22
- shift: 0
- type: write_mask_flow_var
- - init_value: 0
- max_value: 65535
- min_value: 0
- name: vlan_id_random
- op: random
- size: 2
- step: 1
- type: flow_var
- - add_value: 0
- is_big_endian: true
- mask: 4095
- name: vlan_id_random
- pkt_cast_size: 2
- pkt_offset: 26
- shift: 0
- type: write_mask_flow_var
- split_by_var: dec_2_9_1
-'''
-
-
- # Eth/IPv6/TCP, no VM
- def test_ipv6_basic(self):
- # default frame size should be not enough
- with self.assertRaises(Exception):
- STLHltStream(l3_protocol = 'ipv6')
- # error should not affect
- STLHltStream(ipv6_src_addr = 'asdfasdfasgasdf')
- # error should affect
- with self.assertRaises(Exception):
- STLHltStream(l3_protocol = 'ipv6', ipv6_src_addr = 'asdfasdfasgasdf')
- test_stream = STLHltStream(name = 'test_ipv6_basic', l3_protocol = 'ipv6', length_mode = 'fixed', l3_length = 150, )
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- self.golden_yaml = '''
-- name: test_ipv6_basic
- stream:
- action_count: 0
- enabled: true
- flags: 3
- isg: 0.0
- mode:
- percentage: 10.0
- type: continuous
- packet:
- binary: AAAAAAAAAAABAAABht1gAAAAAG4GQP6AAAAAAAAAAAAAAAAAABL+gAAAAAAAAAAAAAAAAAAiBAAAUAAAAAEAAAABUAAP5ctLAAAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE=
- meta: ''
- flow_stats:
- enabled: false
- self_start: true
- vm:
- instructions: []
- split_by_var: ''
-'''
-
- # Eth/IPv6/UDP, VM on ipv6 fields
- def test_ipv6_src_dst_ranges(self):
- test_stream = STLHltStream(name = 'test_ipv6_src_dst_ranges', l3_protocol = 'ipv6', l3_length = 150, l4_protocol = 'udp',
- ipv6_src_addr = '1111:2222:3333:4444:5555:6666:7777:8888',
- ipv6_dst_addr = '1111:1111:1111:1111:1111:1111:1111:1111',
- ipv6_src_mode = 'increment', ipv6_src_step = 5, ipv6_src_count = 10,
- ipv6_dst_mode = 'decrement', ipv6_dst_step = '1111:1111:1111:1111:1111:1111:0000:0011', ipv6_dst_count = 150,
- )
- self.test_yaml = test_stream.dump_to_yaml(self.yaml_save_location())
- self.golden_yaml = '''
-- name: test_ipv6_src_dst_ranges
- stream:
- action_count: 0
- enabled: true
- flags: 3
- isg: 0.0
- mode:
- percentage: 10.0
- type: continuous
- packet:
- binary: AAAAAAAAAAABAAABht1gAAAAAG4RQBERIiIzM0REVVVmZnd3iIgRERERERERERERERERERERBAAAUABucjohISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE=
- meta: ''
- flow_stats:
- enabled: false
- self_start: true
- vm:
- instructions:
- - init_value: 0
- max_value: 45
- min_value: 0
- name: inc_4_9_5
- op: inc
- size: 4
- step: 5
- type: flow_var
- - add_value: 2004322440
- is_big_endian: true
- name: inc_4_9_5
- pkt_offset: 34
- type: write_flow_var
- - init_value: 2533
- max_value: 2533
- min_value: 0
- name: dec_4_149_17
- op: dec
- size: 4
- step: 17
- type: flow_var
- - add_value: 286328620
- is_big_endian: true
- name: dec_4_149_17
- pkt_offset: 50
- type: write_flow_var
- split_by_var: dec_4_149_17
-'''
-
-
-
-
-
- def yaml_save_location(self):
- #return os.devnull
- # debug/deveopment, comment line above
- return '/tmp/%s.yaml' % self._testMethodName
-
-
diff --git a/scripts/automation/regression/unit_tests/functional_tests/misc_methods_test.py b/scripts/automation/regression/unit_tests/functional_tests/misc_methods_test.py
deleted file mode 100755
index 096f86d8..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/misc_methods_test.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/router/bin/python
-
-import functional_general_test
-import misc_methods
-from nose.tools import assert_equal
-from nose.tools import assert_not_equal
-from nose.tools import assert_raises
-from nose.tools import raises
-
-
-class MiscMethods_Test(functional_general_test.CGeneralFunctional_Test):
-
- def setUp(self):
- self.ipv4_gen = misc_methods.get_network_addr()
- self.ipv6_gen = misc_methods.get_network_addr(ip_type = 'ipv6')
- pass
-
- def test_ipv4_gen(self):
- for i in range(1, 255):
- assert_equal( next(self.ipv4_gen), [".".join( map(str, [1, 1, i, 0])), '255.255.255.0'] )
-
- def test_ipv6_gen(self):
- tmp_ipv6_addr = ['2001', 'DB8', 0, '2222', 0, 0, 0, 0]
- for i in range(0, 255):
- tmp_ipv6_addr[2] = hex(i)[2:]
- assert_equal( next(self.ipv6_gen), ":".join( map(str, tmp_ipv6_addr)) )
-
- def test_get_ipv4_client_addr(self):
- tmp_ipv4_addr = next(self.ipv4_gen)[0]
- assert_equal ( misc_methods.get_single_net_client_addr(tmp_ipv4_addr), '1.1.1.1')
- assert_raises (ValueError, misc_methods.get_single_net_client_addr, tmp_ipv4_addr, {'3' : 255} )
-
- def test_get_ipv6_client_addr(self):
- tmp_ipv6_addr = next(self.ipv6_gen)
- assert_equal ( misc_methods.get_single_net_client_addr(tmp_ipv6_addr, {'7' : 1}, ip_type = 'ipv6'), '2001:DB8:0:2222:0:0:0:1')
- assert_equal ( misc_methods.get_single_net_client_addr(tmp_ipv6_addr, {'7' : 2}, ip_type = 'ipv6'), '2001:DB8:0:2222:0:0:0:2')
- assert_raises (ValueError, misc_methods.get_single_net_client_addr, tmp_ipv6_addr, {'7' : 70000} )
-
-
- @raises(ValueError)
- def test_ipv4_client_addr_exception(self):
- tmp_ipv4_addr = next(self.ipv4_gen)[0]
- misc_methods.get_single_net_client_addr(tmp_ipv4_addr, {'4' : 1})
-
- @raises(ValueError)
- def test_ipv6_client_addr_exception(self):
- tmp_ipv6_addr = next(self.ipv6_gen)
- misc_methods.get_single_net_client_addr(tmp_ipv6_addr, {'8' : 1}, ip_type = 'ipv6')
-
- @raises(StopIteration)
- def test_gen_ipv4_to_limit (self):
- while(True):
- next(self.ipv4_gen)
-
- @raises(StopIteration)
- def test_gen_ipv6_to_limit (self):
- while(True):
- next(self.ipv6_gen)
-
- def tearDown(self):
- pass
diff --git a/scripts/automation/regression/unit_tests/functional_tests/pkt_bld_general_test.py b/scripts/automation/regression/unit_tests/functional_tests/pkt_bld_general_test.py
deleted file mode 100755
index 5f89eaff..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/pkt_bld_general_test.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/router/bin/python
-
-from nose.tools import assert_equal
-from nose.tools import assert_not_equal
-from nose.tools import assert_raises
-from nose.tools import raises
-import sys
-import outer_packages
-
-
-class CGeneralPktBld_Test(object):
- def __init__(self):
- pass
-
- @staticmethod
- def print_packet(pkt_obj):
- print "\nGenerated packet:\n{}".format(repr(pkt_obj))
-
-
- def setUp(self):
- pass
-
-
- def tearDown(self):
- pass
-
-if __name__ == "__main__":
- pass
diff --git a/scripts/automation/regression/unit_tests/functional_tests/platform_cmd_cache_test.py b/scripts/automation/regression/unit_tests/functional_tests/platform_cmd_cache_test.py
deleted file mode 100755
index 24ccf7a5..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/platform_cmd_cache_test.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/router/bin/python
-
-from platform_cmd_link import *
-import functional_general_test
-from nose.tools import assert_equal
-from nose.tools import assert_not_equal
-
-
-class CCommandCache_Test(functional_general_test.CGeneralFunctional_Test):
-
- def setUp(self):
- self.cache = CCommandCache()
- self.cache.add('IF', "ip nbar protocol-discovery", 'GigabitEthernet0/0/1')
- self.cache.add('IF', "ip nbar protocol-discovery", 'GigabitEthernet0/0/2')
- self.cache.add('conf', "arp 1.1.1.1 0000.0001.0000 arpa")
- self.cache.add('conf', "arp 1.1.2.1 0000.0002.0000 arpa")
- self.cache.add('exec', "show ip nbar protocol-discovery stats packet-count")
-
- def test_add(self):
- assert_equal(self.cache.cache['IF'],
- {'GigabitEthernet0/0/1' : ['ip nbar protocol-discovery'],
- 'GigabitEthernet0/0/2' : ['ip nbar protocol-discovery']
- })
- assert_equal(self.cache.cache['CONF'],
- ["arp 1.1.1.1 0000.0001.0000 arpa",
- "arp 1.1.2.1 0000.0002.0000 arpa"]
- )
- assert_equal(self.cache.cache['EXEC'],
- ["show ip nbar protocol-discovery stats packet-count"])
-
- def test_dump_config (self):
- import sys
- from StringIO import StringIO
- saved_stdout = sys.stdout
- try:
- out = StringIO()
- sys.stdout = out
- self.cache.dump_config()
- output = out.getvalue().strip()
- assert_equal(output,
- "configure terminal\ninterface GigabitEthernet0/0/1\nip nbar protocol-discovery\ninterface GigabitEthernet0/0/2\nip nbar protocol-discovery\nexit\narp 1.1.1.1 0000.0001.0000 arpa\narp 1.1.2.1 0000.0002.0000 arpa\nexit\nshow ip nbar protocol-discovery stats packet-count"
- )
- finally:
- sys.stdout = saved_stdout
-
- def test_get_config_list (self):
- assert_equal(self.cache.get_config_list(),
- ["configure terminal", "interface GigabitEthernet0/0/1", "ip nbar protocol-discovery", "interface GigabitEthernet0/0/2", "ip nbar protocol-discovery", "exit", "arp 1.1.1.1 0000.0001.0000 arpa", "arp 1.1.2.1 0000.0002.0000 arpa", "exit", "show ip nbar protocol-discovery stats packet-count"]
- )
-
- def test_clear_cache (self):
- self.cache.clear_cache()
- assert_equal(self.cache.cache,
- {"IF" : {},
- "CONF" : [],
- "EXEC" : []}
- )
-
- def tearDown(self):
- self.cache.clear_cache()
diff --git a/scripts/automation/regression/unit_tests/functional_tests/platform_cmd_link_test.py b/scripts/automation/regression/unit_tests/functional_tests/platform_cmd_link_test.py
deleted file mode 100755
index 7a31815b..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/platform_cmd_link_test.py
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/router/bin/python
-
-from platform_cmd_link import *
-import functional_general_test
-from nose.tools import assert_equal
-from nose.tools import assert_not_equal
-
-
-class CCommandLink_Test(functional_general_test.CGeneralFunctional_Test):
-
- def setUp(self):
- self.cache = CCommandCache()
- self.cache.add('IF', "ip nbar protocol-discovery", 'GigabitEthernet0/0/1')
- self.cache.add('IF', "ip nbar protocol-discovery", 'GigabitEthernet0/0/2')
- self.cache.add('conf', "arp 1.1.1.1 0000.0001.0000 arpa")
- self.cache.add('conf', "arp 1.1.2.1 0000.0002.0000 arpa")
- self.cache.add('exec', "show ip nbar protocol-discovery stats packet-count")
- self.com_link = CCommandLink()
-
- def test_transmit(self):
- # test here future implemntatin of platform physical link
- pass
-
- def test_run_cached_command (self):
- self.com_link.run_command([self.cache])
-
- assert_equal (self.com_link.get_history(),
- ["configure terminal", "interface GigabitEthernet0/0/1", "ip nbar protocol-discovery", "interface GigabitEthernet0/0/2", "ip nbar protocol-discovery", "exit", "arp 1.1.1.1 0000.0001.0000 arpa", "arp 1.1.2.1 0000.0002.0000 arpa", "exit", "show ip nbar protocol-discovery stats packet-count"]
- )
-
- self.com_link.clear_history()
- self.com_link.run_single_command(self.cache)
- assert_equal (self.com_link.get_history(),
- ["configure terminal", "interface GigabitEthernet0/0/1", "ip nbar protocol-discovery", "interface GigabitEthernet0/0/2", "ip nbar protocol-discovery", "exit", "arp 1.1.1.1 0000.0001.0000 arpa", "arp 1.1.2.1 0000.0002.0000 arpa", "exit", "show ip nbar protocol-discovery stats packet-count"]
- )
-
- def test_run_single_command(self):
- self.com_link.run_single_command("show ip nbar protocol-discovery stats packet-count")
- assert_equal (self.com_link.get_history(),
- ["show ip nbar protocol-discovery stats packet-count"]
- )
-
- def test_run_mixed_commands (self):
- self.com_link.run_single_command("show ip nbar protocol-discovery stats packet-count")
- self.com_link.run_command([self.cache])
- self.com_link.run_command(["show ip interface brief"])
-
- assert_equal (self.com_link.get_history(),
- ["show ip nbar protocol-discovery stats packet-count",
- "configure terminal", "interface GigabitEthernet0/0/1", "ip nbar protocol-discovery", "interface GigabitEthernet0/0/2", "ip nbar protocol-discovery", "exit", "arp 1.1.1.1 0000.0001.0000 arpa", "arp 1.1.2.1 0000.0002.0000 arpa", "exit", "show ip nbar protocol-discovery stats packet-count",
- "show ip interface brief"]
- )
-
- def test_clear_history (self):
- self.com_link.run_command(["show ip interface brief"])
- self.com_link.clear_history()
- assert_equal (self.com_link.get_history(), [])
-
- def tearDown(self):
- self.cache.clear_cache()
-
-
diff --git a/scripts/automation/regression/unit_tests/functional_tests/platform_device_cfg_test.py b/scripts/automation/regression/unit_tests/functional_tests/platform_device_cfg_test.py
deleted file mode 100755
index 890d0cb9..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/platform_device_cfg_test.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/router/bin/python
-
-from platform_cmd_link import *
-import functional_general_test
-from nose.tools import assert_equal
-from nose.tools import assert_not_equal
-
-
-class CDeviceCfg_Test(functional_general_test.CGeneralFunctional_Test):
-
- def setUp(self):
- self.dev_cfg = CDeviceCfg('./unit_tests/functional_tests/config.yaml')
-
- def test_get_interfaces_cfg(self):
- assert_equal (self.dev_cfg.get_interfaces_cfg(),
- [{'client': {'src_mac_addr': '0000.0001.0000', 'name': 'GigabitEthernet0/0/1', 'dest_mac_addr': '0000.1000.0000'}, 'vrf_name': None, 'server': {'src_mac_addr': '0000.0002.0000', 'name': 'GigabitEthernet0/0/2', 'dest_mac_addr': '0000.2000.0000'}}, {'client': {'src_mac_addr': '0000.0003.0000', 'name': 'GigabitEthernet0/0/3', 'dest_mac_addr': '0000.3000.0000'}, 'vrf_name': 'dup', 'server': {'src_mac_addr': '0000.0004.0000', 'name': 'GigabitEthernet0/0/4', 'dest_mac_addr': '0000.4000.0000'}}]
- )
-
- def tearDown(self):
- pass
diff --git a/scripts/automation/regression/unit_tests/functional_tests/platform_dual_if_obj_test.py b/scripts/automation/regression/unit_tests/functional_tests/platform_dual_if_obj_test.py
deleted file mode 100755
index ff54b9ee..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/platform_dual_if_obj_test.py
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/router/bin/python
-
-from platform_cmd_link import *
-import functional_general_test
-from nose.tools import assert_equal
-from nose.tools import assert_not_equal
-
-
-class CDualIfObj_Test(functional_general_test.CGeneralFunctional_Test):
-
- def setUp(self):
- self.if_1 = CIfObj('gig0/0/1', '1.1.1.1', '2001:DB8:0:2222:0:0:0:1', '0000.0001.0000', '0000.0001.0000', IFType.Client)
- self.if_2 = CIfObj('gig0/0/2', '1.1.2.1', '2001:DB8:1:2222:0:0:0:1', '0000.0002.0000', '0000.0002.0000', IFType.Server)
- self.if_3 = CIfObj('gig0/0/3', '1.1.3.1', '2001:DB8:2:2222:0:0:0:1', '0000.0003.0000', '0000.0003.0000', IFType.Client)
- self.if_4 = CIfObj('gig0/0/4', '1.1.4.1', '2001:DB8:3:2222:0:0:0:1', '0000.0004.0000', '0000.0004.0000', IFType.Server)
- self.dual_1 = CDualIfObj(None, self.if_1, self.if_2)
- self.dual_2 = CDualIfObj('dup', self.if_3, self.if_4)
-
- def test_id_allocation(self):
- assert (self.dual_1.get_id() < self.dual_2.get_id() < CDualIfObj._obj_id)
-
- def test_get_vrf_name (self):
- assert_equal ( self.dual_1.get_vrf_name() , None )
- assert_equal ( self.dual_2.get_vrf_name() , 'dup' )
-
- def test_is_duplicated (self):
- assert_equal ( self.dual_1.is_duplicated() , False )
- assert_equal ( self.dual_2.is_duplicated() , True )
-
- def tearDown(self):
- pass \ No newline at end of file
diff --git a/scripts/automation/regression/unit_tests/functional_tests/platform_if_manager_test.py b/scripts/automation/regression/unit_tests/functional_tests/platform_if_manager_test.py
deleted file mode 100755
index 7ba6e66e..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/platform_if_manager_test.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/router/bin/python
-
-from platform_cmd_link import *
-import functional_general_test
-from nose.tools import assert_equal
-from nose.tools import assert_not_equal
-
-
-class CIfManager_Test(functional_general_test.CGeneralFunctional_Test):
-
- def setUp(self):
- self.dev_cfg = CDeviceCfg('./unit_tests/functional_tests/config.yaml')
- self.if_mng = CIfManager()
-
- # main testing method to check the entire class
- def test_load_config (self):
- self.if_mng.load_config(self.dev_cfg)
-
- # check the number of items in each qeury
- assert_equal( len(self.if_mng.get_if_list()), 4 )
- assert_equal( len(self.if_mng.get_if_list(if_type = IFType.Client)), 2 )
- assert_equal( len(self.if_mng.get_if_list(if_type = IFType.Client, is_duplicated = True)), 1 )
- assert_equal( len(self.if_mng.get_if_list(if_type = IFType.Client, is_duplicated = False)), 1 )
- assert_equal( len(self.if_mng.get_if_list(if_type = IFType.Server)), 2 )
- assert_equal( len(self.if_mng.get_if_list(if_type = IFType.Server, is_duplicated = True)), 1 )
- assert_equal( len(self.if_mng.get_if_list(if_type = IFType.Server, is_duplicated = False)), 1 )
- assert_equal( len(self.if_mng.get_duplicated_if()), 2 )
- assert_equal( len(self.if_mng.get_dual_if_list()), 2 )
-
- # check the classification with intf name
- assert_equal( map(CIfObj.get_name, self.if_mng.get_if_list() ), ['GigabitEthernet0/0/1','GigabitEthernet0/0/2','GigabitEthernet0/0/3','GigabitEthernet0/0/4'] )
- assert_equal( map(CIfObj.get_name, self.if_mng.get_if_list(is_duplicated = True) ), ['GigabitEthernet0/0/3','GigabitEthernet0/0/4'] )
- assert_equal( map(CIfObj.get_name, self.if_mng.get_if_list(is_duplicated = False) ), ['GigabitEthernet0/0/1','GigabitEthernet0/0/2'] )
- assert_equal( map(CIfObj.get_name, self.if_mng.get_duplicated_if() ), ['GigabitEthernet0/0/3', 'GigabitEthernet0/0/4'] )
-
- # check the classification with vrf name
- assert_equal( map(CDualIfObj.get_vrf_name, self.if_mng.get_dual_if_list() ), [None, 'dup'] )
-
- def tearDown(self):
- pass
diff --git a/scripts/automation/regression/unit_tests/functional_tests/platform_if_obj_test.py b/scripts/automation/regression/unit_tests/functional_tests/platform_if_obj_test.py
deleted file mode 100755
index 534d4170..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/platform_if_obj_test.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/router/bin/python
-
-from platform_cmd_link import *
-import functional_general_test
-from nose.tools import assert_equal
-from nose.tools import assert_not_equal
-
-
-class CIfObj_Test(functional_general_test.CGeneralFunctional_Test):
- test_idx = 1
-
- def setUp(self):
- self.if_1 = CIfObj('gig0/0/1', '1.1.1.1', '2001:DB8:0:2222:0:0:0:1', '0000.0001.0000', '0000.0001.0000', IFType.Client)
- self.if_2 = CIfObj('TenGig0/0/0', '1.1.2.1', '2001:DB8:1:2222:0:0:0:1', '0000.0002.0000', '0000.0002.0000', IFType.Server)
- CIfObj_Test.test_idx += 1
-
- def test_id_allocation(self):
- assert (self.if_1.get_id() < self.if_2.get_id() < CIfObj._obj_id)
-
- def test_isClient(self):
- assert_equal (self.if_1.is_client(), True)
-
- def test_isServer(self):
- assert_equal (self.if_2.is_server(), True)
-
- def test_get_name (self):
- assert_equal (self.if_1.get_name(), 'gig0/0/1')
- assert_equal (self.if_2.get_name(), 'TenGig0/0/0')
-
- def test_get_src_mac_addr (self):
- assert_equal (self.if_1.get_src_mac_addr(), '0000.0001.0000')
-
- def test_get_dest_mac (self):
- assert_equal (self.if_2.get_dest_mac(), '0000.0002.0000')
-
- def test_get_ipv4_addr (self):
- assert_equal (self.if_1.get_ipv4_addr(), '1.1.1.1' )
- assert_equal (self.if_2.get_ipv4_addr(), '1.1.2.1' )
-
- def test_get_ipv6_addr (self):
- assert_equal (self.if_1.get_ipv6_addr(), '2001:DB8:0:2222:0:0:0:1' )
- assert_equal (self.if_2.get_ipv6_addr(), '2001:DB8:1:2222:0:0:0:1' )
-
- def test_get_type (self):
- assert_equal (self.if_1.get_if_type(), IFType.Client)
- assert_equal (self.if_2.get_if_type(), IFType.Server)
-
- def tearDown(self):
- pass
diff --git a/scripts/automation/regression/unit_tests/functional_tests/scapy_pkt_builder_test.py b/scripts/automation/regression/unit_tests/functional_tests/scapy_pkt_builder_test.py
deleted file mode 100644
index 7e2f6271..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/scapy_pkt_builder_test.py
+++ /dev/null
@@ -1,368 +0,0 @@
-#!/router/bin/python
-
-import pkt_bld_general_test
-
-#HACK FIX ME START
-import sys
-import os
-
-CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(CURRENT_PATH, '../../../trex_control_plane/stl/'))
-#HACK FIX ME END
-from trex_stl_lib.trex_stl_packet_builder_scapy import *
-
-from scapy.all import *
-from nose.tools import assert_equal
-from nose.tools import assert_not_equal
-from nose.tools import assert_raises
-from nose.tools import raises
-import os
-import random
-import pprint
-
-class CTRexPktBuilderSanitySCapy_Test(pkt_bld_general_test.CGeneralPktBld_Test):
-
- def setUp(self):
- pass
-
- def test_simple_vm1(self):
- raw1 = CTRexScRaw( [ CTRexVmDescFlowVar(name="a",min_value="16.0.0.1",max_value="16.0.0.10",init_value="16.0.0.1",size=4,op="inc"),
- CTRexVmDescWrFlowVar (fv_name="a",pkt_offset= "IP.src"),
- CTRexVmDescFixIpv4(offset = "IP")]
- );
-
- pkt_builder = CScapyTRexPktBuilder();
-
- py='5'*128
- pkt=Ether()/ \
- IP(src="16.0.0.1",dst="48.0.0.1")/ \
- UDP(dport=12,sport=1025)/IP()/py
-
- # set packet
- pkt_builder.set_packet(pkt);
- pkt_builder.add_command ( raw1 )
- pkt_builder.compile();
-
- pkt_builder.dump_scripts ()
-
- print pkt_builder.get_vm_data()
-
- assert_equal( pkt_builder.get_vm_data(), {'split_by_var': '', 'instructions': [{'name': 'a', 'max_value': 268435466, 'min_value': 268435457, 'init_value': 268435457, 'size': 4, 'type': 'flow_var', 'step':1,'op': 'inc'}, {'is_big_endian': True, 'pkt_offset': 26, 'type': 'write_flow_var', 'name': 'a', 'add_value': 0}, {'pkt_offset': 14, 'type': 'fix_checksum_ipv4'}]} )
-
-
-
- def test_simple_no_vm1(self):
-
- pkt_builder = CScapyTRexPktBuilder();
-
- py='5'*128
- pkt=Ether()/ \
- IP(src="16.0.0.1",dst="48.0.0.1")/ \
- UDP(dport=12,sport=1025)/IP()/py
-
- # set packet
- pkt_builder.set_packet(pkt);
-
- pkt_builder.compile();
-
- pkt_builder.dump_scripts ()
-
- assert_equal( pkt_builder.get_vm_data(),
- { 'instructions': [ ],
- 'split_by_var': ''}
- )
-
-
- def test_simple_mac_default(self):
-
- pkt = Ether()/IP()/UDP()
-
-
- pkt_builder = CScapyTRexPktBuilder(pkt = pkt);
-
- assert_equal( pkt_builder.is_def_src_mac () ,True)
- assert_equal( pkt_builder.is_def_dst_mac () ,True)
-
- pkt = Ether(src="00:00:00:00:00:01")/IP()/UDP()
-
- pkt_builder = CScapyTRexPktBuilder(pkt = pkt);
-
- assert_equal( pkt_builder.is_def_src_mac (), False)
- assert_equal( pkt_builder.is_def_dst_mac (), True)
-
- pkt = Ether(dst="00:00:00:00:00:01")/IP()/UDP()
-
- pkt_builder = CScapyTRexPktBuilder(pkt = pkt);
-
- assert_equal( pkt_builder.is_def_src_mac (),True)
- assert_equal( pkt_builder.is_def_dst_mac (),False)
-
-
-
-
- def test_simple_teredo(self):
-
- pkt = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=3797,sport=3544)/IPv6(src="2001:0:4137:9350:8000:f12a:b9c8:2815",dst="2001:4860:0:2001::68")/UDP(dport=12,sport=1025)/ICMPv6Unknown()
-
- pkt.build();
- p_utl=CTRexScapyPktUtl(pkt);
-
- assert_equal( p_utl.get_field_offet_by_str("IPv6.src"), (50,16) )
- assert_equal( p_utl.get_field_offet_by_str("IPv6.dst"), (66,16) )
-
-
-
-
- def test_simple_scapy_vlan(self):
-
- py='5'*(9)
- p1=Ether(src="00:00:00:01:00:00",dst="00:00:00:01:00:00")/ \
- Dot1Q(vlan=12)/ \
- Dot1Q(vlan=17)/ \
- IP(src="10.0.0.10",dst="48.0.0.1")/ \
- UDP(dport=12,sport=1025)/py
-
- p1.build();
- p1.dump_layers_offset()
- p1.show2();
- hexdump(p1);
- #wrpcap("ipv4_udp_9k.pcap", p1);
-
- p_utl=CTRexScapyPktUtl(p1);
-
- assert_equal(p_utl.get_pkt_layers(),"Ethernet:802.1Q:802.1Q:IP:UDP:Raw")
- assert_equal(p_utl.layer_offset("802.1Q",0),14);
- assert_equal(p_utl.layer_offset("802.1Q",1),18);
- assert_equal(p_utl.get_field_offet_by_str("802|1Q.vlan"),(14,0));
- assert_equal(p_utl.get_field_offet_by_str("802|1Q:1.vlan"),(18,0));
- assert_equal(p_utl.get_field_offet_by_str("IP.src"),(34,4));
-
- def test_simple_scapy_128_udp(self):
- """
- build 128 byte packet with 0x35 as pyld
- """
-
-
- pkt_size =128
- p1=Ether(src="00:00:00:01:00:00",dst="00:00:00:01:00:00")/ \
- IP(src="16.0.0.1",dst="48.0.0.1")/ \
- UDP(dport=12,sport=1025)
- pyld_size=pkt_size-len(p1);
-
- pkt=p1/('5'*(pyld_size))
-
- pkt.show2();
- hexdump(pkt);
- assert_equal(len(pkt),128)
-
- def test_simple_scapy_9k_ip_len(self):
- """
- build 9k ipv4 len packet
- """
-
-
- ip_pkt_size =9*1024
- p_l2=Ether(src="00:00:00:01:00:00",dst="00:00:00:01:00:00");
- p_l3= IP(src="16.0.0.1",dst="48.0.0.1")/ \
- UDP(dport=12,sport=1025)
- pyld_size = ip_pkt_size-len(p_l3);
-
- pkt=p_l2/p_l3/('\x55'*(pyld_size))
-
- #pkt.show2();
- #hexdump(pkt);
- assert_equal(len(pkt),9*1024+14)
-
- def test_simple_scapy_ipv6_1(self):
- """
- build ipv6 packet
- """
-
- print "start "
- py='\x55'*(64)
-
- p=Ether()/IPv6()/UDP(dport=12,sport=1025)/py
- #p.build();
- #p.dump_layers_offset()
- hexdump(p);
- p.show2();
-
- p_utl=CTRexScapyPktUtl(p);
-
- assert_equal(p_utl.get_field_offet_by_str("IPv6.src"),(22,16));
-
-
- def test_simple_vm2(self):
- raw1 = CTRexScRaw( [ CTRexVmDescFlowVar(name="my_valn",min_value=0,max_value=10,init_value=2,size=1,op="inc"),
- CTRexVmDescWrFlowVar (fv_name="my_valn",pkt_offset= "802|1Q.vlan" ,offset_fixup=3) # fix the offset as valn is bitfield and not supported right now
- ]
- );
-
- pkt_builder = CScapyTRexPktBuilder();
-
- py='5'*128
- pkt=Ether()/ \
- Dot1Q(vlan=12)/ \
- IP(src="16.0.0.1",dst="48.0.0.1")/ \
- UDP(dport=12,sport=1025)/IP()/py
-
- # set packet
- pkt_builder.set_packet(pkt);
- pkt_builder.add_command ( raw1 )
- pkt_builder.compile();
-
-
- d= pkt_builder.get_vm_data()
- assert_equal(d['instructions'][1]['pkt_offset'],17)
-
- def test_simple_vm3(self):
- try:
- raw1 = CTRexScRaw( [ CTRexVmDescFlowVar(name="my_valn",min_value=0,max_value=10,init_value=2,size=1,op="inc"),
- CTRexVmDescWrFlowVar (fv_name="my_valn_err",pkt_offset= "802|1Q.vlan" ,offset_fixup=3) # fix the offset as valn is bitfield and not supported right now
- ]
- );
-
- pkt_builder = CScapyTRexPktBuilder();
-
- py='5'*128
- pkt=Ether()/ \
- Dot1Q(vlan=12)/ \
- IP(src="16.0.0.1",dst="48.0.0.1")/ \
- UDP(dport=12,sport=1025)/IP()/py
-
- # set packet
- pkt_builder.set_packet(pkt);
- pkt_builder.add_command ( raw1 )
- pkt_builder.compile();
-
-
- d= pkt_builder.get_vm_data()
- except CTRexPacketBuildException as e:
- assert_equal(str(e), "[errcode:-11] 'variable my_valn_err does not exists '")
-
- def test_simple_tuple_gen(self):
- vm = CTRexScRaw( [ CTRexVmDescTupleGen (name="tuple"), # define tuple gen
- CTRexVmDescWrFlowVar (fv_name="tuple.ip", pkt_offset= "IP.src" ), # write ip to packet IP.src
- CTRexVmDescFixIpv4(offset = "IP"), # fix checksum
- CTRexVmDescWrFlowVar (fv_name="tuple.port", pkt_offset= "UDP.sport" ) #write udp.port
- ]
- );
- pkt_builder = CScapyTRexPktBuilder();
-
- py='5'*128
- pkt=Ether()/ \
- Dot1Q(vlan=12)/ \
- IP(src="16.0.0.1",dst="48.0.0.1")/ \
- UDP(dport=12,sport=1025)/IP()/py
-
- # set packet
- pkt_builder.set_packet(pkt);
- pkt_builder.add_command ( vm )
- pkt_builder.compile();
- d= pkt_builder.get_vm_data()
- pkt_builder.dump_vm_data_as_yaml()
-
- assert_equal(d['instructions'][1]['pkt_offset'],30)
- assert_equal(d['instructions'][3]['pkt_offset'],38)
-
- def test_simple_random_pkt_size(self):
-
- ip_pkt_size = 9*1024
- p_l2 = Ether();
- p_l3 = IP(src="16.0.0.1",dst="48.0.0.1")
- p_l4 = UDP(dport=12,sport=1025)
- pyld_size = ip_pkt_size-len(p_l3/p_l4);
-
- pkt =p_l2/p_l3/p_l4/('\x55'*(pyld_size))
-
- l3_len_fix =-(len(p_l2));
- l4_len_fix =-(len(p_l2/p_l3));
-
- vm = CTRexScRaw( [ CTRexVmDescFlowVar(name="fv_rand", min_value=64, max_value=len(pkt), size=2, op="random"),
- CTRexVmDescTrimPktSize("fv_rand"), # total packet size
- CTRexVmDescWrFlowVar(fv_name="fv_rand", pkt_offset= "IP.len", add_val=l3_len_fix),
- CTRexVmDescFixIpv4(offset = "IP"), # fix checksum
- CTRexVmDescWrFlowVar(fv_name="fv_rand", pkt_offset= "UDP.len", add_val=l4_len_fix)
- ]
- )
- pkt_builder = CScapyTRexPktBuilder();
-
- # set packet
- pkt_builder.set_packet(pkt);
- pkt_builder.add_command ( vm )
- pkt_builder.compile();
- d= pkt_builder.get_vm_data()
- pkt_builder.dump_vm_data_as_yaml()
-
- assert_equal(d['instructions'][0]['max_value'],9230)
- assert_equal(d['instructions'][2]['pkt_offset'],16)
- assert_equal(d['instructions'][4]['pkt_offset'],38)
-
- def test_simple_pkt_loader(self):
- p=RawPcapReader("stl/golden/basic_imix_golden.cap")
- print ""
- for pkt in p:
- print pkt[1]
- print hexdump(str(pkt[0]))
- break;
-
- def test_simple_pkt_loader1(self):
-
- pkt_builder = CScapyTRexPktBuilder(pkt = "stl/golden/udp_590.cap", build_raw = False);
- print ""
- pkt_builder.dump_as_hex()
- r = pkt_builder.pkt_raw
- assert_equal(ord(r[1]),0x50)
- assert_equal(ord(r[0]),0x00)
- assert_equal(ord(r[0x240]),0x16)
- assert_equal(ord(r[0x24d]),0x79)
- assert_equal(len(r),590)
-
- print len(r)
-
- def test_simple_pkt_loader2(self):
-
- pkt_builder = CScapyTRexPktBuilder(pkt = "stl/golden/basic_imix_golden.cap");
- assert_equal(pkt_builder.pkt_layers_desc (), "Ethernet:IP:UDP:Raw");
-
- def test_simple_pkt_loader3(self):
-
- #pkt_builder = CScapyTRexPktBuilder(pkt = "stl/golden/basic_imix_golden.cap");
- #r = pkt_builder.pkt_raw
- #print ""
- #hexdump(str(r))
-
-
- #print pkt_builder.pkt_layers_desc ()
-
-
- #pkt_builder.set_packet(pkt);
-
- py='\x55'*(64)
-
- p=Ether()/IP()/UDP(dport=12,sport=1025)/py
- pkt_str = str(p);
- print ""
- hexdump(pkt_str);
- scapy_pkt = Ether(pkt_str);
- scapy_pkt.show2();
-
- def tearDown(self):
- pass
-
-
-class CTRexPktBuilderScapy_Test(pkt_bld_general_test.CGeneralPktBld_Test):
-
- def setUp(self):
- pass;
- #self.pkt_bld = CTRexPktBuilder()
- #self.pkt_bld.add_pkt_layer("l2", dpkt.ethernet.Ethernet())
- #self.pp = pprint.PrettyPrinter(indent=4)
-
- def tearDown(self):
- pass
-
-
-if __name__ == "__main__":
- pass
-
diff --git a/scripts/automation/regression/unit_tests/functional_tests/stl_basic_tests.py b/scripts/automation/regression/unit_tests/functional_tests/stl_basic_tests.py
deleted file mode 100644
index cd653895..00000000
--- a/scripts/automation/regression/unit_tests/functional_tests/stl_basic_tests.py
+++ /dev/null
@@ -1,258 +0,0 @@
-
-import outer_packages
-from platform_cmd_link import *
-import functional_general_test
-from nose.tools import assert_equal
-from nose.tools import assert_not_equal
-from nose.tools import nottest
-from nose.plugins.attrib import attr
-from unit_tests.trex_general_test import CTRexScenario
-from dpkt import pcap
-from trex_stl_lib import trex_stl_sim
-import sys
-import os
-import subprocess
-import shlex
-from threading import Thread
-
-@attr('run_on_trex')
-class CStlBasic_Test(functional_general_test.CGeneralFunctional_Test):
- def setUp (self):
- self.test_path = os.path.abspath(os.getcwd())
- self.scripts_path = CTRexScenario.scripts_path
-
- self.verify_exists(os.path.join(self.scripts_path, "bp-sim-64-debug"))
-
- self.stl_sim = os.path.join(self.scripts_path, "stl-sim")
-
- self.verify_exists(self.stl_sim)
-
- self.profiles_path = os.path.join(self.scripts_path, "stl/yaml/")
-
- self.profiles = {}
- self.profiles['imix_3pkt'] = os.path.join(self.profiles_path, "imix_3pkt.yaml")
- self.profiles['imix_3pkt_vm'] = os.path.join(self.profiles_path, "imix_3pkt_vm.yaml")
- self.profiles['random_size_9k'] = os.path.join(self.profiles_path, "../udp_rand_len_9k.py")
- self.profiles['imix_tuple_gen'] = os.path.join(self.profiles_path, "imix_1pkt_tuple_gen.yaml")
-
- for k, v in self.profiles.iteritems():
- self.verify_exists(v)
-
- self.valgrind_profiles = [ self.profiles['imix_3pkt_vm'],
- self.profiles['random_size_9k'],
- self.profiles['imix_tuple_gen'] ]
-
- self.golden_path = os.path.join(self.test_path,"stl/golden/")
-
- os.chdir(self.scripts_path)
-
-
- def tearDown (self):
- os.chdir(self.test_path)
-
-
-
- def get_golden (self, name):
- golden = os.path.join(self.golden_path, name)
- self.verify_exists(golden)
- return golden
-
-
- def verify_exists (self, name):
- if not os.path.exists(name):
- raise Exception("cannot find '{0}'".format(name))
-
-
- def compare_caps (self, cap1, cap2, max_diff_sec = 0.01):
- with open(cap1, 'r') as f1:
- reader1 = pcap.Reader(f1)
- pkts1 = reader1.readpkts()
-
- with open(cap2, 'r') as f2:
- reader2 = pcap.Reader(f2)
- pkts2 = reader2.readpkts()
-
- assert_equal(len(pkts1), len(pkts2))
-
- for pkt1, pkt2, i in zip(pkts1, pkts2, xrange(1, len(pkts1))):
- ts1 = pkt1[0]
- ts2 = pkt2[0]
- if abs(ts1-ts2) > 0.000005: # 5 nsec
- raise AssertionError("TS error: cap files '{0}', '{1}' differ in cap #{2} - '{3}' vs. '{4}'".format(cap1, cap2, i, ts1, ts2))
-
- if pkt1[1] != pkt2[1]:
- raise AssertionError("RAW error: cap files '{0}', '{1}' differ in cap #{2}".format(cap1, cap2, i))
-
-
-
- def run_sim (self, yaml, output, options = "", silent = False, obj = None):
- if output:
- user_cmd = "-f {0} -o {1} {2}".format(yaml, output, options)
- else:
- user_cmd = "-f {0} {1}".format(yaml, options)
-
- if silent:
- user_cmd += " --silent"
-
- rc = trex_stl_sim.main(args = shlex.split(user_cmd))
- if obj:
- obj['rc'] = (rc == 0)
-
- return (rc == 0)
-
-
-
- def run_py_profile_path (self, profile, options,silent = False, do_no_remove=False,compare =True, test_generated=True):
- output_cap = "a.pcap"
- input_file = os.path.join('stl/', profile)
- golden_file = os.path.join('exp',os.path.basename(profile).split('.')[0]+'.pcap');
- if os.path.exists(output_cap):
- os.unlink(output_cap)
- try:
- rc = self.run_sim(input_file, output_cap, options, silent)
- assert_equal(rc, True)
- #s='cp '+output_cap+' '+golden_file;
- #print s
- #os.system(s)
-
- if compare:
- self.compare_caps(output_cap, golden_file)
- finally:
- if not do_no_remove:
- os.unlink(output_cap)
- if test_generated:
- try:
- from trex_stl_lib.api import STLProfile # if test is skipped, don't load it
- generated_filename = input_file.replace('.py', '_GENERATED.py').replace('.yaml', '_GENERATED.py')
- if input_file.endswith('.py'):
- profile = STLProfile.load_py(input_file)
- elif input_file.endswith('.yaml'):
- profile = STLProfile.load_yaml(input_file)
- profile.dump_to_code(generated_filename)
- rc = self.run_sim(generated_filename, output_cap, options, silent)
- assert_equal(rc, True)
-
- if compare:
- self.compare_caps(output_cap, golden_file)
- finally:
- if not do_no_remove:
- os.unlink(generated_filename)
- os.unlink(output_cap)
-
-
- def test_stl_profiles (self):
-
- p = [
- ["udp_1pkt_1mac_override.py","-m 1 -l 50",True],
- ["syn_attack.py","-m 1 -l 50",True], # can't compare random now
- ["udp_1pkt_1mac.py","-m 1 -l 50",True],
- ["udp_1pkt_mac.py","-m 1 -l 50",True],
- ["udp_1pkt.py","-m 1 -l 50",True],
- ["udp_1pkt_tuple_gen.py","-m 1 -l 50",True],
- ["udp_rand_len_9k.py","-m 1 -l 50",True], # can't do the compare
- ["udp_1pkt_mpls.py","-m 1 -l 50",True],
- ["udp_1pkt_mpls_vm.py","-m 1 ",True],
- ["imix.py","-m 1 -l 100",True],
- ["udp_inc_len_9k.py","-m 1 -l 100",True],
- ["udp_1pkt_range_clients.py","-m 1 -l 100",True],
- ["multi_burst_2st_1000pkt.py","-m 1 -l 100",True],
- ["pcap.py", "-m 1", True],
- ["pcap_with_vm.py", "-m 1", True],
-
- # YAML test
- ["yaml/burst_1000_pkt.yaml","-m 1 -l 100",True],
- ["yaml/burst_1pkt_1burst.yaml","-m 1 -l 100",True],
- ["yaml/burst_1pkt_vm.yaml","-m 1 -l 100",True],
- ["yaml/imix_1pkt.yaml","-m 1 -l 100",True],
- ["yaml/imix_1pkt_2.yaml","-m 1 -l 100",True],
- ["yaml/imix_1pkt_tuple_gen.yaml","-m 1 -l 100",True],
- ["yaml/imix_1pkt_vm.yaml","-m 1 -l 100",True],
- ["udp_1pkt_pcap.py","-m 1 -l 10",True],
- ["udp_3pkt_pcap.py","-m 1 -l 10",True],
- #["udp_1pkt_simple.py","-m 1 -l 3",True],
- ["udp_1pkt_pcap_relative_path.py","-m 1 -l 3",True],
- ["udp_1pkt_tuple_gen_split.py","-m 1 -c 2 -l 100",True],
- ["udp_1pkt_range_clients_split.py","-m 1 -c 2 -l 100",True],
- ["udp_1pkt_vxlan.py","-m 1 -c 1 -l 17",True, False], # can't generate: no VXLAN in Scapy, only in profile
- ["udp_1pkt_ipv6_in_ipv4.py","-m 1 -c 1 -l 17",True],
- ["yaml/imix_3pkt.yaml","-m 50kpps --limit 20 --cores 2",True],
- ["yaml/imix_3pkt_vm.yaml","-m 50kpps --limit 20 --cores 2",True],
- ["udp_1pkt_simple_mac_dst.py","-m 1 -l 1 ",True],
- ["udp_1pkt_simple_mac_src.py","-m 1 -l 1 ",True],
- ["udp_1pkt_simple_mac_dst_src.py","-m 1 -l 1 ",True],
- ["burst_3st_loop_x_times.py","-m 1 -l 20 ",True],
- ["udp_1pkt_mac_step.py","-m 1 -l 20 ",True],
- ["udp_1pkt_mac_mask1.py","-m 1 -l 20 ",True] ,
- ["udp_1pkt_mac_mask2.py","-m 1 -l 20 ",True],
- ["udp_1pkt_mac_mask3.py","-m 1 -l 20 ",True],
- ["udp_1pkt_simple_test2.py","-m 1 -l 10 ",True], # test split of packet with ip option
- ["udp_1pkt_simple_test.py","-m 1 -l 10 ",True],
- ["udp_1pkt_mac_mask5.py","-m 1 -l 30 ",True],
- ["udp_1pkt_range_clients_split_garp.py","-m 1 -l 50",True]
-
-
- ];
-
-
- p1 = [ ["udp_1pkt_range_clients_split_garp.py","-m 1 -l 50",True] ]
-
-
- for obj in p:
- try:
- test_generated = obj[3]
- except: # check generated if not said otherwise
- test_generated = True
- self.run_py_profile_path (obj[0],obj[1],compare =obj[2], test_generated = test_generated, do_no_remove=True)
-
-
- def test_hlt_profiles (self):
- p = (
- ['hlt/hlt_udp_inc_dec_len_9k.py', '-m 1 -l 20', True],
- ['hlt/hlt_imix_default.py', '-m 1 -l 20', True],
- ['hlt/hlt_imix_4rates.py', '-m 1 -l 20', True],
- ['hlt/hlt_david1.py', '-m 1 -l 20', True],
- ['hlt/hlt_david2.py', '-m 1 -l 20', True],
- ['hlt/hlt_david3.py', '-m 1 -l 20', True],
- ['hlt/hlt_david4.py', '-m 1 -l 20', True],
- ['hlt/hlt_wentong1.py', '-m 1 -l 20', True],
- ['hlt/hlt_wentong2.py', '-m 1 -l 20', True],
- ['hlt/hlt_tcp_ranges.py', '-m 1 -l 20', True],
- ['hlt/hlt_udp_ports.py', '-m 1 -l 20', True],
- ['hlt/hlt_udp_random_ports.py', '-m 1 -l 20', True],
- ['hlt/hlt_ip_ranges.py', '-m 1 -l 20', True],
- ['hlt/hlt_framesize_vm.py', '-m 1 -l 20', True],
- ['hlt/hlt_l3_length_vm.py', '-m 1 -l 20', True],
- ['hlt/hlt_vlan_default.py', '-m 1 -l 20', True],
- ['hlt/hlt_4vlans.py', '-m 1 -l 20', True],
- ['hlt/hlt_vlans_vm.py', '-m 1 -l 20', True],
- ['hlt/hlt_ipv6_default.py', '-m 1 -l 20', True],
- ['hlt/hlt_ipv6_ranges.py', '-m 1 -l 20', True],
- ['hlt/hlt_mac_ranges.py', '-m 1 -l 20', True],
- )
-
- for obj in p:
- self.run_py_profile_path (obj[0], obj[1], compare =obj[2], do_no_remove=True)
-
- # valgrind tests - this runs in multi thread as it safe (no output)
- def test_valgrind_various_profiles (self):
-
- print "\n"
- threads = []
- for profile in self.valgrind_profiles:
- print "\n*** VALGRIND: testing profile '{0}' ***\n".format(profile)
- obj = {'t': None, 'rc': None}
- t = Thread(target = self.run_sim,
- kwargs = {'obj': obj, 'yaml': profile, 'output':None, 'options': "--cores 8 --limit 20 --valgrind", 'silent': True})
- obj['t'] = t
-
- threads.append(obj)
- t.start()
-
- for obj in threads:
- obj['t'].join()
-
- for obj in threads:
- assert_equal(obj['rc'], True)
-
-
-
diff --git a/scripts/automation/regression/unit_tests/tests_exceptions.py b/scripts/automation/regression/unit_tests/tests_exceptions.py
deleted file mode 100755
index 604efcc8..00000000
--- a/scripts/automation/regression/unit_tests/tests_exceptions.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/router/bin/python
-
-class TRexInUseError(Exception):
- def __init__(self, value):
- self.value = value
- def __str__(self):
- return repr(self.value)
-
-class TRexRunFailedError(Exception):
- def __init__(self, value):
- self.value = value
- def __str__(self):
- return repr(self.value)
-
-class TRexIncompleteRunError(Exception):
- def __init__(self, value):
- self.value = value
- def __str__(self):
- return repr(self.value)
-
-class TRexLowCpuUtilError(Exception):
- def __init__(self, value):
- self.value = value
- def __str__(self):
- return repr(self.value)
-
-class AbnormalResultError(Exception):
- def __init__(self, value):
- self.value = value
- def __str__(self):
- return repr(self.value)
-
-class ClassificationMissmatchError(Exception):
- def __init__(self, value):
- self.value = value
- def __str__(self):
- return repr(self.value)
diff --git a/scripts/automation/regression/unit_tests/trex_general_test.py b/scripts/automation/regression/unit_tests/trex_general_test.py
deleted file mode 100755
index f367a397..00000000
--- a/scripts/automation/regression/unit_tests/trex_general_test.py
+++ /dev/null
@@ -1,350 +0,0 @@
-#!/router/bin/python
-
-__copyright__ = "Copyright 2014"
-
-"""
-Name:
- trex_general_test.py
-
-
-Description:
-
- This script creates the functionality to test the performance of the T-Rex traffic generator
- The tested scenario is a T-Rex TG directly connected to a Cisco router.
-
-::
-
- Topology:
-
- ------- --------
- | | Tx---1gig/10gig----Rx | |
- | T-Rex | | router |
- | | Rx---1gig/10gig----Tx | |
- ------- --------
-
-"""
-from nose.plugins import Plugin
-from nose.plugins.skip import SkipTest
-import trex
-import misc_methods
-import sys
-import os
-# from CPlatformUnderTest import *
-from CPlatform import *
-import termstyle
-import threading
-from tests_exceptions import *
-from platform_cmd_link import *
-import unittest
-
-
-class CTRexScenario():
- modes = set() # list of modes of this setup: loopback, virtual etc.
- server_logs = False
- is_test_list = False
- is_init = False
- trex_crashed = False
- configuration = None
- trex = None
- router = None
- router_cfg = None
- daemon_log_lines = 0
- setup_name = None
- setup_dir = None
- router_image = None
- trex_version = None
- scripts_path = None
- benchmark = None
- report_dir = 'reports'
- # logger = None
-
-#scenario = CTRexScenario()
-
-def setUpModule(module):
-# print ("") # this is to get a newline after the dots
-# print ("setup_module before anything in this file")
-# # ff = CTRexScenario()
-# scenario.configuration = misc_methods.load_complete_config_file('config/config.yaml')
-# scenario.trex = trex.CTRexRunner(scenario.configuration[0], None)
-# scenario.router = CPlatform(scenario.configuration[1], False, scenario.configuration[2])
-# scenario.router.platform.preCheck()
-# print "Done instantiating trex scenario!"
- pass
-
-def tearDownModule(module):
-# print ("") # this is to get a newline after the dots
-# scenario.router.platform.postCheck()
-# print ("teardown_module after anything in this file")
- pass
-
-
-
-class CTRexGeneral_Test(unittest.TestCase):
- """This class defines the general testcase of the T-Rex traffic generator"""
- def __init__ (self, *args, **kwargs):
- unittest.TestCase.__init__(self, *args, **kwargs)
- if CTRexScenario.is_test_list:
- return
- # Point test object to scenario global object
- self.configuration = CTRexScenario.configuration
- self.benchmark = CTRexScenario.benchmark
- self.trex = CTRexScenario.trex
- self.trex_crashed = CTRexScenario.trex_crashed
- self.modes = CTRexScenario.modes
- self.skipping = False
- self.fail_reasons = []
- if not hasattr(self, 'unsupported_modes'):
- self.unsupported_modes = []
- self.is_loopback = True if 'loopback' in self.modes else False
- self.is_virt_nics = True if 'virt_nics' in self.modes else False
- self.is_VM = True if 'VM' in self.modes else False
-
- if not CTRexScenario.is_init:
- CTRexScenario.trex_version = self.trex.get_trex_version()
- if not self.is_loopback:
- # initilize the scenario based on received configuration, once per entire testing session
- CTRexScenario.router = CPlatform(CTRexScenario.router_cfg['silent_mode'])
- device_cfg = CDeviceCfg()
- device_cfg.set_platform_config(CTRexScenario.router_cfg['config_dict'])
- device_cfg.set_tftp_config(CTRexScenario.router_cfg['tftp_config_dict'])
- CTRexScenario.router.load_platform_data_from_file(device_cfg)
- CTRexScenario.router.launch_connection(device_cfg)
- running_image = CTRexScenario.router.get_running_image_details()['image']
- print 'Current router image: %s' % running_image
- if CTRexScenario.router_cfg['forceImageReload']:
- needed_image = device_cfg.get_image_name()
- if not CTRexScenario.router.is_image_matches(needed_image):
- print 'Setting router image: %s' % needed_image
- CTRexScenario.router.config_tftp_server(device_cfg)
- CTRexScenario.router.load_platform_image(needed_image)
- CTRexScenario.router.set_boot_image(needed_image)
- CTRexScenario.router.reload_platform(device_cfg)
- CTRexScenario.router.launch_connection(device_cfg)
- running_image = CTRexScenario.router.get_running_image_details()['image'] # verify image
- if not CTRexScenario.router.is_image_matches(needed_image):
- self.fail('Unable to set router image: %s, current image is: %s' % (needed_image, running_image))
- else:
- print 'Matches needed image: %s' % needed_image
- CTRexScenario.router_image = running_image
-
- if self.modes:
- print termstyle.green('\t!!!\tRunning with modes: %s, not suitable tests will be skipped.\t!!!' % list(self.modes))
-
- CTRexScenario.is_init = True
- print termstyle.green("Done instantiating T-Rex scenario!\n")
-
-# raise RuntimeError('CTRexScenario class is not initialized!')
- self.router = CTRexScenario.router
-
-
-
-# def assert_dict_eq (self, dict, key, val, error=''):
-# v1 = int(dict[key]))
-# self.assertEqual(v1, int(val), error)
-#
-# def assert_dict_gt (self, d, key, val, error=''):
-# v1 = int(dict[key])
-# self.assert_gt(v1, int(val), error)
-
- def assertEqual(self, v1, v2, s):
- if v1 != v2:
- error='ERROR '+str(v1)+' != '+str(v2)+ ' '+s;
- self.fail(error)
-
- def assert_gt(self, v1, v2, s):
- if not v1 > v2:
- error='ERROR {big} < {small} {str}'.format(big = v1, small = v2, str = s)
- self.fail(error)
-
- def check_results_eq (self,res,name,val):
- if res is None:
- self.fail('TRex results cannot be None !')
- return
-
- if name not in res:
- self.fail('TRex results does not include key %s' % name)
- return
-
- if res[name] != float(val):
- self.fail('TRex results[%s]==%f and not as expected %f ' % (name, res[name], val))
-
- def check_CPU_benchmark (self, trex_res, err = 10, minimal_cpu = 30, maximal_cpu = 85):
- #cpu_util = float(trex_res.get_last_value("trex-global.data.m_cpu_util"))
- cpu_util = sum([float(x) for x in trex_res.get_value_list("trex-global.data.m_cpu_util")[-4:-1]]) / 3 # mean of 3 values before last
-
- if not self.is_virt_nics:
- if cpu_util > maximal_cpu:
- self.fail("CPU is too high (%s%%), probably queue full." % cpu_util )
- if cpu_util < minimal_cpu:
- self.fail("CPU is too low (%s%%), can't verify performance in such low CPU%%." % cpu_util )
-
- cores = self.get_benchmark_param('cores')
- trex_tx_bps = trex_res.get_last_value("trex-global.data.m_total_tx_bytes")
- test_norm_cpu = 100.0*(trex_tx_bps/(cores*cpu_util))/1e6
-
- print "TRex CPU utilization: %g%%, norm_cpu is : %d Mb/core" % (round(cpu_util), int(test_norm_cpu))
-
- #expected_norm_cpu = self.get_benchmark_param('cpu_to_core_ratio')
-
- #calc_error_precent = abs(100.0*(test_norm_cpu/expected_norm_cpu)-100.0)
-
-# if calc_error_precent > err:
-# msg ='Normalized bandwidth to CPU utilization ratio is %2.0f Mb/core expected %2.0f Mb/core more than %2.0f %% - ERROR' % (test_norm_cpu, expected_norm_cpu, err)
-# raise AbnormalResultError(msg)
-# else:
-# msg ='Normalized bandwidth to CPU utilization ratio is %2.0f Mb/core expected %2.0f Mb/core less than %2.0f %% - OK' % (test_norm_cpu, expected_norm_cpu, err)
-# print msg
-
-
- def check_results_gt (self, res, name, val):
- if res is None:
- self.fail('TRex results canot be None !')
- return
-
- if name not in res:
- self.fail('TRex results does not include key %s' % name)
- return
-
- if res[name]< float(val):
- self.fail('TRex results[%s]<%f and not as expected greater than %f ' % (name, res[name], val))
-
- def check_for_trex_crash(self):
- pass
-
- def get_benchmark_param (self, param, sub_param = None, test_name = None):
- if not test_name:
- test_name = self.get_name()
- if test_name not in self.benchmark:
- self.skip('No data in benchmark.yaml for test: %s, param: %s. Skipping.' % (test_name, param))
- if sub_param:
- return self.benchmark[test_name][param].get(sub_param)
- else:
- return self.benchmark[test_name].get(param)
-
- def check_general_scenario_results (self, trex_res, check_latency = True):
-
- try:
- # check if test is valid
- if not trex_res.is_done_warmup():
- self.fail('T-Rex did not reach warm-up situtaion. Results are not valid.')
-
- # check history size is enough
- if len(trex_res._history) < 5:
- self.fail('T-Rex results list is too short. Increase the test duration or check unexpected stopping.')
-
- # check T-Rex number of drops
- trex_tx_pckt = trex_res.get_last_value("trex-global.data.m_total_tx_pkts")
- trex_drops = trex_res.get_total_drops()
- trex_drop_rate = trex_res.get_drop_rate()
- if ( trex_drops > 0.001 * trex_tx_pckt) and (trex_drop_rate > 0.0): # deliberately mask kickoff drops when T-Rex first initiated
- self.fail('Number of packet drops larger than 0.1% of all traffic')
-
- # check queue full, queue drop, allocation error
- m_total_alloc_error = trex_res.get_last_value("trex-global.data.m_total_alloc_error")
- m_total_queue_full = trex_res.get_last_value("trex-global.data.m_total_queue_full")
- m_total_queue_drop = trex_res.get_last_value("trex-global.data.m_total_queue_drop")
- self.assert_gt(1000, m_total_alloc_error, 'Got allocation errors. (%s), please review multiplier and templates configuration.' % m_total_alloc_error)
- self.assert_gt(1000, m_total_queue_drop, 'Too much queue_drop (%s), please review multiplier.' % m_total_queue_drop)
-
- if self.is_VM:
- allowed_queue_full = 10000 + trex_tx_pckt / 100
- else:
- allowed_queue_full = 1000 + trex_tx_pckt / 1000
- self.assert_gt(allowed_queue_full, m_total_queue_full, 'Too much queue_full (%s), please review multiplier.' % m_total_queue_full)
-
- # # check T-Rex expected counters
- #trex_exp_rate = trex_res.get_expected_tx_rate().get('m_tx_expected_bps')
- #assert trex_exp_rate is not None
- #trex_exp_gbps = trex_exp_rate/(10**9)
-
- if check_latency:
- # check that max latency does not exceed 1 msec in regular setup or 100ms in VM
- allowed_latency = 9999999 if self.is_VM else 1000
- if max(trex_res.get_max_latency().values()) > allowed_latency:
- self.fail('LatencyError: Maximal latency exceeds %s (usec)' % allowed_latency)
-
- # check that avg latency does not exceed 1 msec in regular setup or 3ms in VM
- allowed_latency = 9999999 if self.is_VM else 1000
- if max(trex_res.get_avg_latency().values()) > allowed_latency:
- self.fail('LatencyError: Average latency exceeds %s (usec)' % allowed_latency)
-
- if not self.is_loopback:
- # check router number of drops --> deliberately masked- need to be figured out!!!!!
- pkt_drop_stats = self.router.get_drop_stats()
-# assert pkt_drop_stats['total_drops'] < 20
-
- # check for trex-router packet consistency
- # TODO: check if it's ok
- print 'router drop stats: %s' % pkt_drop_stats
- print 'TRex drop stats: %s' % trex_drops
- #self.assertEqual(pkt_drop_stats, trex_drops, "TRex's and router's drop stats don't match.")
-
- except KeyError as e:
- self.fail(e)
- #assert False
-
- # except AssertionError as e:
- # e.args += ('T-Rex has crashed!')
- # raise
-
- # We encountered error, don't fail the test immediately
- def fail(self, reason = 'Unknown error'):
- print 'Error: %s' % reason
- self.fail_reasons.append(reason)
-
- # skip running of the test, counts as 'passed' but prints 'skipped'
- def skip(self, message = 'Unknown reason'):
- print 'Skip: %s' % message
- self.skipping = True
- raise SkipTest(message)
-
- # get name of currently running test
- def get_name(self):
- return self._testMethodName
-
- def setUp(self):
- test_setup_modes_conflict = self.modes & set(self.unsupported_modes)
- if test_setup_modes_conflict:
- self.skip("The test can't run with following modes of given setup: %s " % test_setup_modes_conflict)
- if not self.trex.is_idle():
- print 'Warning: TRex is not idle at setUp, trying to stop it.'
- self.trex.force_kill(confirm = False)
- if not self.is_loopback:
- print ''
- self.router.load_clean_config()
- self.router.clear_counters()
- self.router.clear_packet_drop_stats()
-
- ########################################################################
- #### DO NOT ADD TESTS TO THIS FILE ####
- #### Added tests here will held once for EVERY test sub-class ####
- ########################################################################
-
- # masked example to such test. uncomment to watch how it affects #
-# def test_isInitialized(self):
-# assert CTRexScenario.is_init == True
- def tearDown(self):
- if not self.trex.is_idle():
- print 'Warning: TRex is not idle at tearDown, trying to stop it.'
- self.trex.force_kill(confirm = False)
- if not self.skipping:
- # print server logs of test run
- if CTRexScenario.server_logs:
- try:
- print termstyle.green('\n>>>>>>>>>>>>>>> Daemon log <<<<<<<<<<<<<<<')
- daemon_log = self.trex.get_trex_daemon_log()
- log_size = len(daemon_log)
- print ''.join(daemon_log[CTRexScenario.daemon_log_lines:])
- CTRexScenario.daemon_log_lines = log_size
- except Exception as e:
- print "Can't get TRex daemon log:", e
- try:
- print termstyle.green('>>>>>>>>>>>>>>>> Trex log <<<<<<<<<<<<<<<<')
- print ''.join(self.trex.get_trex_log())
- except Exception as e:
- print "Can't get TRex log:", e
- if len(self.fail_reasons):
- raise Exception('The test is failed, reasons:\n%s' % '\n'.join(self.fail_reasons))
-
- def check_for_trex_crash(self):
- pass
diff --git a/scripts/automation/regression/unit_tests/trex_imix_test.py b/scripts/automation/regression/unit_tests/trex_imix_test.py
deleted file mode 100755
index 43dea900..00000000
--- a/scripts/automation/regression/unit_tests/trex_imix_test.py
+++ /dev/null
@@ -1,202 +0,0 @@
-#!/router/bin/python
-from trex_general_test import CTRexGeneral_Test
-from CPlatform import CStaticRouteConfig
-from tests_exceptions import *
-#import sys
-import time
-
-class CTRexIMIX_Test(CTRexGeneral_Test):
- """This class defines the IMIX testcase of the T-Rex traffic generator"""
- def __init__(self, *args, **kwargs):
- # super(CTRexIMIX_Test, self).__init__()
- CTRexGeneral_Test.__init__(self, *args, **kwargs)
- pass
-
- def setUp(self):
- super(CTRexIMIX_Test, self).setUp() # launch super test class setUp process
- # CTRexGeneral_Test.setUp(self) # launch super test class setUp process
- # self.router.clear_counters()
- pass
-
- def test_routing_imix_64(self):
- # test initializtion
- if not self.is_loopback:
- self.router.configure_basic_interfaces()
- self.router.config_pbr(mode = "config")
-
-# self.trex.set_yaml_file('cap2/imix_64.yaml')
- mult = self.get_benchmark_param('multiplier')
- core = self.get_benchmark_param('cores')
-
-# trex_res = self.trex.run(multiplier = mult, cores = core, duration = 30, l = 1000, p = True)
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- d = 30,
- f = 'cap2/imix_64.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- # trex_res is a CTRexResult instance- and contains the summary of the test results
- # you may see all the results keys by simply calling here for 'print trex_res.result'
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
-
- self.check_general_scenario_results(trex_res)
- self.check_CPU_benchmark(trex_res)
-
- # the name intentionally not matches nose default pattern, including the test should be specified explicitly
- def dummy(self):
- self.assertEqual(1, 2, 'boo')
- self.assertEqual(2, 2, 'boo')
- self.assertEqual(2, 3, 'boo')
- #print ''
- #print dir(self)
- #print locals()
- #print ''
- #print_r(unittest.TestCase)
- #print ''
- #print_r(self)
- print ''
- #print unittest.TestCase.shortDescription(self)
- #self.skip("I'm just a dummy test")
-
-
- def test_routing_imix (self):
- # test initializtion
- if not self.is_loopback:
- self.router.configure_basic_interfaces()
- self.router.config_pbr(mode = "config")
-
-# self.trex.set_yaml_file('cap2/imix_fast_1g.yaml')
- mult = self.get_benchmark_param('multiplier')
- core = self.get_benchmark_param('cores')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- d = 60,
- f = 'cap2/imix_fast_1g.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- # trex_res is a CTRexResult instance- and contains the summary of the test results
- # you may see all the results keys by simply calling here for 'print trex_res.result'
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
-
- self.check_general_scenario_results(trex_res)
-
- self.check_CPU_benchmark(trex_res)
-
-
- def test_static_routing_imix (self):
- if self.is_loopback:
- self.skip('In loopback mode the test is same as test_routing_imix')
- # test initializtion
- if not self.is_loopback:
- self.router.configure_basic_interfaces()
-
- # Configure static routing based on benchmark data input
- stat_route_dict = self.get_benchmark_param('stat_route_dict')
- stat_route_obj = CStaticRouteConfig(stat_route_dict)
- self.router.config_static_routing(stat_route_obj, mode = "config")
-
- mult = self.get_benchmark_param('multiplier')
- core = self.get_benchmark_param('cores')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- d = 60,
- f = 'cap2/imix_fast_1g.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- # trex_res is a CTRexResult instance- and contains the summary of the test results
- # you may see all the results keys by simply calling here for 'print trex_res.result'
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
- print ("\nLATEST DUMP:")
- print trex_res.get_latest_dump()
-
- self.check_general_scenario_results(trex_res)
- self.check_CPU_benchmark(trex_res)
-
-
- def test_static_routing_imix_asymmetric (self):
- # test initializtion
- if not self.is_loopback:
- self.router.configure_basic_interfaces()
-
- # Configure static routing based on benchmark data input
- stat_route_dict = self.get_benchmark_param('stat_route_dict')
- stat_route_obj = CStaticRouteConfig(stat_route_dict)
- self.router.config_static_routing(stat_route_obj, mode = "config")
-
- mult = self.get_benchmark_param('multiplier')
- core = self.get_benchmark_param('cores')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- nc = True,
- d = 100,
- f = 'cap2/imix_fast_1g.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- # trex_res is a CTRexResults instance- and contains the summary of the test results
- # you may see all the results keys by simply calling here for 'print trex_res.result'
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
-
- self.check_general_scenario_results(trex_res)
-
- self.check_CPU_benchmark(trex_res)
-
-
- def test_jumbo(self):
- if not self.is_loopback:
- self.router.configure_basic_interfaces(mtu = 9216)
- self.router.config_pbr(mode = "config")
-
- mult = self.get_benchmark_param('multiplier')
- core = self.get_benchmark_param('cores')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- d = 100,
- f = 'cap2/imix_9k.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- # trex_res is a CTRexResults instance- and contains the summary of the test results
- # you may see all the results keys by simply calling here for 'print trex_res.result'
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
-
- self.check_general_scenario_results(trex_res)
- self.check_CPU_benchmark(trex_res, minimal_cpu = 0, maximal_cpu = 10)
-
- def tearDown(self):
- CTRexGeneral_Test.tearDown(self)
- # remove nbar config here
- pass
-
-if __name__ == "__main__":
- pass
diff --git a/scripts/automation/regression/unit_tests/trex_ipv6_test.py b/scripts/automation/regression/unit_tests/trex_ipv6_test.py
deleted file mode 100755
index bffb4754..00000000
--- a/scripts/automation/regression/unit_tests/trex_ipv6_test.py
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/router/bin/python
-from trex_general_test import CTRexGeneral_Test
-from tests_exceptions import *
-import time
-from nose.tools import assert_equal
-
-class CTRexIPv6_Test(CTRexGeneral_Test):
- """This class defines the IPv6 testcase of the T-Rex traffic generator"""
- def __init__(self, *args, **kwargs):
- super(CTRexIPv6_Test, self).__init__(*args, **kwargs)
- pass
-
- def setUp(self):
- super(CTRexIPv6_Test, self).setUp() # launch super test class setUp process
-# print " before sleep setup !!"
-# time.sleep(100000);
-# pass
-
- def test_ipv6_simple(self):
- if self.is_virt_nics:
- self.skip('--ipv6 flag does not work correctly in with virtual NICs') # TODO: fix
- # test initializtion
- if not self.is_loopback:
- self.router.configure_basic_interfaces()
-
- self.router.config_pbr(mode = "config")
- self.router.config_ipv6_pbr(mode = "config")
-
- mult = self.get_benchmark_param('multiplier')
- core = self.get_benchmark_param('cores')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- ipv6 = True,
- d = 60,
- f = 'avl/sfr_delay_10_1g.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- # trex_res is a CTRexResult instance- and contains the summary of the test results
- # you may see all the results keys by simply calling here for 'print trex_res.result'
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
-
- self.check_general_scenario_results(trex_res)
-
- self.check_CPU_benchmark (trex_res, 10.0)
-
- assert True
-
-
- def test_ipv6_negative (self):
- if self.is_loopback:
- self.skip('The test checks ipv6 drops by device and we are in loopback setup')
- # test initializtion
- self.router.configure_basic_interfaces()
-
- # NOT CONFIGURING IPv6 INTENTIONALLY TO GET DROPS!
- self.router.config_pbr(mode = "config")
-
- # same params as test_ipv6_simple
- mult = self.get_benchmark_param('multiplier', test_name = 'test_ipv6_simple')
- core = self.get_benchmark_param('cores', test_name = 'test_ipv6_simple')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- ipv6 = True,
- d = 60,
- f = 'avl/sfr_delay_10_1g.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- # trex_res is a CTRexResult instance- and contains the summary of the test results
- # you may see all the results keys by simply calling here for 'print trex_res.result'
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
-
- trex_tx_pckt = float(trex_res.get_last_value("trex-global.data.m_total_tx_pkts"))
- trex_drops = int(trex_res.get_total_drops())
-
- trex_drop_rate = trex_res.get_drop_rate()
-
- # make sure that at least 50% of the total transmitted packets failed
- self.assert_gt((trex_drops/trex_tx_pckt), 0.5, 'packet drop ratio is not high enough')
-
-
-
- def tearDown(self):
- CTRexGeneral_Test.tearDown(self)
- # remove config here
- pass
-
-if __name__ == "__main__":
- pass
diff --git a/scripts/automation/regression/unit_tests/trex_nat_test.py b/scripts/automation/regression/unit_tests/trex_nat_test.py
deleted file mode 100755
index e7fe5ca5..00000000
--- a/scripts/automation/regression/unit_tests/trex_nat_test.py
+++ /dev/null
@@ -1,169 +0,0 @@
-#!/router/bin/python
-from trex_general_test import CTRexGeneral_Test
-from tests_exceptions import *
-import time
-from CPlatform import CStaticRouteConfig, CNatConfig
-from nose.tools import assert_equal
-
-
-class CTRexNoNat_Test(CTRexGeneral_Test):#(unittest.TestCase):
- """This class defines the NAT testcase of the T-Rex traffic generator"""
- def __init__(self, *args, **kwargs):
- super(CTRexNoNat_Test, self).__init__(*args, **kwargs)
- self.unsupported_modes = ['loopback'] # NAT requires device
- pass
-
- def setUp(self):
- super(CTRexNoNat_Test, self).setUp() # launch super test class setUp process
- pass
-
- def check_nat_stats (self, nat_stats):
- pass
-
-
- def test_nat_learning(self):
- # test initializtion
- self.router.configure_basic_interfaces()
-
- stat_route_dict = self.get_benchmark_param('stat_route_dict')
- stat_route_obj = CStaticRouteConfig(stat_route_dict)
- self.router.config_static_routing(stat_route_obj, mode = "config")
-
- self.router.config_nat_verify() # shutdown duplicate interfaces
-
-# self.trex.set_yaml_file('cap2/http_simple.yaml')
- mult = self.get_benchmark_param('multiplier')
- core = self.get_benchmark_param('cores')
-
-# trex_res = self.trex.run(multiplier = mult, cores = core, duration = 100, l = 1000, learn_verify = True)
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- learn_verify = True,
- d = 100,
- f = 'cap2/http_simple.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
- print ("\nLATEST DUMP:")
- print trex_res.get_latest_dump()
-
-
- expected_nat_opened = self.get_benchmark_param('nat_opened')
- learning_stats = trex_res.get_last_value("trex-global.data", ".*nat.*") # extract all nat data
-
- if self.get_benchmark_param('allow_timeout_dev'):
- nat_timeout_ratio = learning_stats['m_total_nat_time_out']/learning_stats['m_total_nat_open']
- if nat_timeout_ratio > 0.005:
- self.fail('TRex nat_timeout ratio %f > 0.005 (0.5%) and not as expected to be less than 0.5%' %(nat_timeout_ratio))
- else:
- self.check_results_eq (learning_stats, 'm_total_nat_time_out', 0.0)
- self.check_results_eq (learning_stats, 'm_total_nat_no_fid', 0.0)
- self.check_results_gt (learning_stats, 'm_total_nat_learn_error', 0.0)
-#
- self.check_results_gt (learning_stats, 'm_total_nat_open', expected_nat_opened)
-
- self.check_general_scenario_results(trex_res)
- self.check_CPU_benchmark(trex_res, minimal_cpu = 10, maximal_cpu = 85)
-
- def tearDown(self):
- CTRexGeneral_Test.tearDown(self)
- pass
-
-
-class CTRexNat_Test(CTRexGeneral_Test):#(unittest.TestCase):
- """This class defines the NAT testcase of the T-Rex traffic generator"""
- def __init__(self, *args, **kwargs):
- super(CTRexNat_Test, self).__init__(*args, **kwargs)
- self.unsupported_modes = ['loopback'] # NAT requires device
- pass
-
- def setUp(self):
- super(CTRexNat_Test, self).setUp() # launch super test class setUp process
- # config nat here
-
-
- def check_nat_stats (self, nat_stats):
- pass
-
-
- def test_nat_simple_mode1(self):
- self.nat_simple_helper(learn_mode=1)
-
- def test_nat_simple_mode2(self):
- self.nat_simple_helper(learn_mode=2)
-
- def nat_simple_helper(self, learn_mode=1):
- # test initializtion
- self.router.configure_basic_interfaces()
-
-
- stat_route_dict = self.get_benchmark_param('stat_route_dict')
- stat_route_obj = CStaticRouteConfig(stat_route_dict)
- self.router.config_static_routing(stat_route_obj, mode = "config")
-
- nat_dict = self.get_benchmark_param('nat_dict')
- nat_obj = CNatConfig(nat_dict)
- self.router.config_nat(nat_obj)
-
-# self.trex.set_yaml_file('cap2/http_simple.yaml')
- mult = self.get_benchmark_param('multiplier')
- core = self.get_benchmark_param('cores')
-
-# trex_res = self.trex.run(nc=False,multiplier = mult, cores = core, duration = 100, l = 1000, learn = True)
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- learn_mode = learn_mode,
- d = 100,
- f = 'cap2/http_simple.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
- print ("\nLATEST DUMP:")
- print trex_res.get_latest_dump()
-
- trex_nat_stats = trex_res.get_last_value("trex-global.data", ".*nat.*") # extract all nat data
- if self.get_benchmark_param('allow_timeout_dev'):
- nat_timeout_ratio = trex_nat_stats['m_total_nat_time_out']/trex_nat_stats['m_total_nat_open']
- if nat_timeout_ratio > 0.005:
- self.fail('TRex nat_timeout ratio %f > 0.5%%' % nat_timeout_ratio)
- else:
- self.check_results_eq (trex_nat_stats,'m_total_nat_time_out', 0.0)
- self.check_results_eq (trex_nat_stats,'m_total_nat_no_fid', 0.0)
- self.check_results_gt (trex_nat_stats,'m_total_nat_open', 6000)
-
-
- self.check_general_scenario_results(trex_res, check_latency = False) # NAT can cause latency
-## test_norm_cpu = 2*(trex_res.result['total-tx']/(core*trex_res.result['cpu_utilization']))
-# trex_tx_pckt = trex_res.get_last_value("trex-global.data.m_total_tx_bps")
-# cpu_util = int(trex_res.get_last_value("trex-global.data.m_cpu_util"))
-# test_norm_cpu = 2*(trex_tx_pckt/(core*cpu_util))
-# print "test_norm_cpu is: ", test_norm_cpu
-
- self.check_CPU_benchmark(trex_res, minimal_cpu = 10, maximal_cpu = 85)
-
- #if ( abs((test_norm_cpu/self.get_benchmark_param('cpu_to_core_ratio')) - 1) > 0.03):
- # raiseraise AbnormalResultError('Normalized bandwidth to CPU utilization ratio exceeds 3%')
-
- nat_stats = self.router.get_nat_stats()
- print nat_stats
-
- self.assert_gt(nat_stats['total_active_trans'], 5000, 'total active translations is not high enough')
- self.assert_gt(nat_stats['dynamic_active_trans'], 5000, 'total dynamic active translations is not high enough')
- self.assertEqual(nat_stats['static_active_trans'], 0, "NAT statistics nat_stats['static_active_trans'] should be zero")
- self.assert_gt(nat_stats['num_of_hits'], 50000, 'total nat hits is not high enough')
-
- def tearDown(self):
- CTRexGeneral_Test.tearDown(self)
- self.router.clear_nat_translations()
-
-
-if __name__ == "__main__":
- pass
diff --git a/scripts/automation/regression/unit_tests/trex_nbar_test.py b/scripts/automation/regression/unit_tests/trex_nbar_test.py
deleted file mode 100755
index 74d0227b..00000000
--- a/scripts/automation/regression/unit_tests/trex_nbar_test.py
+++ /dev/null
@@ -1,193 +0,0 @@
-#!/router/bin/python
-from trex_general_test import CTRexGeneral_Test
-from tests_exceptions import *
-from interfaces_e import IFType
-from nose.tools import nottest
-from misc_methods import print_r
-
-class CTRexNbar_Test(CTRexGeneral_Test):
- """This class defines the NBAR testcase of the T-Rex traffic generator"""
- def __init__(self, *args, **kwargs):
- super(CTRexNbar_Test, self).__init__(*args, **kwargs)
- self.unsupported_modes = ['loopback'] # obviously no NBar in loopback
- pass
-
- def setUp(self):
- super(CTRexNbar_Test, self).setUp() # launch super test class setUp process
-# self.router.kill_nbar_flows()
- self.router.clear_cft_counters()
- self.router.clear_nbar_stats()
-
- def match_classification (self):
- nbar_benchmark = self.get_benchmark_param("nbar_classification")
- test_classification = self.router.get_nbar_stats()
- print "TEST CLASSIFICATION:"
- print test_classification
- missmatchFlag = False
- missmatchMsg = "NBAR classification contians a missmatch on the following protocols:"
- fmt = '\n\t{0:15} | Expected: {1:>3.2f}%, Got: {2:>3.2f}%'
- noise_level = 0.045 # percents
-
- for cl_intf in self.router.get_if_manager().get_if_list(if_type = IFType.Client):
- client_intf = cl_intf.get_name()
-
- # removing noise classifications
- for key, value in test_classification[client_intf]['percentage'].items():
- if value <= noise_level:
- print 'Removing noise classification: %s' % key
- del test_classification[client_intf]['percentage'][key]
-
- if len(test_classification[client_intf]['percentage']) != (len(nbar_benchmark) + 1): # adding 'total' key to nbar_benchmark
- raise ClassificationMissmatchError ('The total size of classification result does not match the provided benchmark.')
-
- for protocol, bench in nbar_benchmark.iteritems():
- if protocol != 'total':
- try:
- bench = float(bench)
- protocol = protocol.replace('_','-')
- protocol_test_res = test_classification[client_intf]['percentage'][protocol]
- deviation = 100 * abs(bench/protocol_test_res - 1) # percents
- difference = abs(bench - protocol_test_res)
- if (deviation > 10 and difference > noise_level): # allowing 10% deviation and 'noise_level'% difference
- missmatchFlag = True
- missmatchMsg += fmt.format(protocol, bench, protocol_test_res)
- except KeyError as e:
- missmatchFlag = True
- print e
- print "Changes missmatchFlag to True. ", "\n\tProtocol {0} isn't part of classification results on interface {intf}".format( protocol, intf = client_intf )
- missmatchMsg += "\n\tProtocol {0} isn't part of classification results on interface {intf}".format( protocol, intf = client_intf )
- except ZeroDivisionError as e:
- print "ZeroDivisionError: %s" % protocol
- pass
- if missmatchFlag:
- self.fail(missmatchMsg)
-
-
- def test_nbar_simple(self):
- # test initializtion
- deviation_compare_value = 0.03 # default value of deviation - 3%
- self.router.configure_basic_interfaces()
-
- self.router.config_pbr(mode = "config")
- self.router.config_nbar_pd()
-
- mult = self.get_benchmark_param('multiplier')
- core = self.get_benchmark_param('cores')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- d = 100,
- f = 'avl/sfr_delay_10_1g.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- # trex_res is a CTRexResult instance- and contains the summary of the test results
- # you may see all the results keys by simply calling here for 'print trex_res.result'
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
- print ("\nLATEST DUMP:")
- print trex_res.get_latest_dump()
-
-
- self.check_general_scenario_results(trex_res, check_latency = False) # NBAR can cause latency
- # test_norm_cpu = 2*(trex_res.result['total-tx']/(core*trex_res.result['cpu_utilization']))
- trex_tx_pckt = trex_res.get_last_value("trex-global.data.m_total_tx_pkts")
- cpu_util = trex_res.get_last_value("trex-global.data.m_cpu_util")
- cpu_util_hist = trex_res.get_value_list("trex-global.data.m_cpu_util")
- print "cpu util is:", cpu_util
- print cpu_util_hist
- test_norm_cpu = 2 * trex_tx_pckt / (core * cpu_util)
- print "test_norm_cpu is:", test_norm_cpu
-
-
- if self.get_benchmark_param('cpu2core_custom_dev'):
- # check this test by custom deviation
- deviation_compare_value = self.get_benchmark_param('cpu2core_dev')
- print "Comparing test with custom deviation value- {dev_val}%".format( dev_val = int(deviation_compare_value*100) )
-
- # need to be fixed !
- #if ( abs((test_norm_cpu/self.get_benchmark_param('cpu_to_core_ratio')) - 1) > deviation_compare_value):
- # raise AbnormalResultError('Normalized bandwidth to CPU utilization ratio exceeds benchmark boundaries')
-
- self.match_classification()
-
- assert True
-
- @nottest
- def test_rx_check (self):
- # test initializtion
- self.router.configure_basic_interfaces()
-
- self.router.config_pbr(mode = "config")
- self.router.config_nbar_pd()
-
- mult = self.get_benchmark_param('multiplier')
- core = self.get_benchmark_param('cores')
- sample_rate = self.get_benchmark_param('rx_sample_rate')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- rx_check = sample_rate,
- d = 100,
- f = 'cap2/sfr.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- # trex_res is a CTRexResult instance- and contains the summary of the test results
- # you may see all the results keys by simply calling here for 'print trex_res.result'
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
- print ("\nLATEST DUMP:")
- print trex_res.get_latest_dump()
-
- self.check_general_scenario_results(trex_res)
-
- self.check_CPU_benchmark(trex_res, 10)
-
-# if trex_res.result['rx_check_tx']==trex_res.result['rx_check_rx']: # rx_check verification shoud pass
-# assert trex_res.result['rx_check_verification'] == "OK"
-# else:
-# assert trex_res.result['rx_check_verification'] == "FAIL"
-
- # the name intentionally not matches nose default pattern, including the test should be specified explicitly
- def NBarLong(self):
- self.router.configure_basic_interfaces()
- self.router.config_pbr(mode = "config")
- self.router.config_nbar_pd()
-
- mult = self.get_benchmark_param('multiplier')
- core = self.get_benchmark_param('cores')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- d = 18000, # 5 hours
- f = 'avl/sfr_delay_10_1g.yaml',
- l = 1000)
-
- trex_res = self.trex.sample_to_run_finish()
-
- # trex_res is a CTRexResult instance- and contains the summary of the test results
- # you may see all the results keys by simply calling here for 'print trex_res.result'
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
-
- self.check_general_scenario_results(trex_res, check_latency = False)
-
-
- def tearDown(self):
- CTRexGeneral_Test.tearDown(self)
- pass
-
-if __name__ == "__main__":
- pass
diff --git a/scripts/automation/regression/unit_tests/trex_rx_test.py b/scripts/automation/regression/unit_tests/trex_rx_test.py
deleted file mode 100755
index 37b1c722..00000000
--- a/scripts/automation/regression/unit_tests/trex_rx_test.py
+++ /dev/null
@@ -1,275 +0,0 @@
-#!/router/bin/python
-from trex_general_test import CTRexGeneral_Test
-from CPlatform import CStaticRouteConfig, CNatConfig
-from tests_exceptions import *
-#import sys
-import time
-import copy
-from nose.tools import nottest
-import traceback
-
-class CTRexRx_Test(CTRexGeneral_Test):
- """This class defines the rx testcase of the T-Rex traffic generator"""
- def __init__(self, *args, **kwargs):
- CTRexGeneral_Test.__init__(self, *args, **kwargs)
- self.unsupported_modes = ['virt_nics'] # TODO: fix
- pass
-
- def setUp(self):
- CTRexGeneral_Test.setUp(self)
- pass
-
-
- def check_rx_errors(self, trex_res, allow_error_tolerance = True):
- try:
- # counters to check
-
- latency_counters_display = {'m_unsup_prot': 0, 'm_no_magic': 0, 'm_no_id': 0, 'm_seq_error': 0, 'm_length_error': 0, 'm_no_ipv4_option': 0, 'm_tx_pkt_err': 0}
- rx_counters = {'m_err_drop': 0, 'm_err_aged': 0, 'm_err_no_magic': 0, 'm_err_wrong_pkt_id': 0, 'm_err_fif_seen_twice': 0, 'm_err_open_with_no_fif_pkt': 0, 'm_err_oo_dup': 0, 'm_err_oo_early': 0, 'm_err_oo_late': 0, 'm_err_flow_length_changed': 0}
-
- # get relevant TRex results
-
- try:
- ports_names = trex_res.get_last_value('trex-latecny-v2.data', 'port\-\d+')
- if not ports_names:
- raise AbnormalResultError('Could not find ports info in TRex results, path: trex-latecny-v2.data.port-*')
- for port_name in ports_names:
- path = 'trex-latecny-v2.data.%s.stats' % port_name
- port_result = trex_res.get_last_value(path)
- if not port_result:
- raise AbnormalResultError('Could not find port stats in TRex results, path: %s' % path)
- for key in latency_counters_display:
- latency_counters_display[key] += port_result[key]
-
- # using -k flag in TRex produces 1 error per port in latency counter m_seq_error, allow it until issue resolved. For comparing use dict with reduces m_seq_error number.
- latency_counters_compare = copy.deepcopy(latency_counters_display)
- latency_counters_compare['m_seq_error'] = max(0, latency_counters_compare['m_seq_error'] - len(ports_names))
-
- path = 'rx-check.data.stats'
- rx_check_results = trex_res.get_last_value(path)
- if not rx_check_results:
- raise AbnormalResultError('No TRex results by path: %s' % path)
- for key in rx_counters:
- rx_counters[key] = rx_check_results[key]
-
- path = 'rx-check.data.stats.m_total_rx'
- total_rx = trex_res.get_last_value(path)
- if not total_rx:
- raise AbnormalResultError('No TRex results by path: %s' % path)
-
-
- print 'Total packets checked: %s' % total_rx
- print 'Latency counters: %s' % latency_counters_display
- print 'rx_check counters: %s' % rx_counters
-
- except KeyError as e:
- self.fail('Expected key in TRex result was not found.\n%s' % traceback.print_exc())
-
- # the check. in loopback expect 0 problems, at others allow errors <error_tolerance>% of total_rx
-
- total_errors = sum(rx_counters.values()) + sum(latency_counters_compare.values())
- error_tolerance = self.get_benchmark_param('error_tolerance')
- if not error_tolerance or not allow_error_tolerance:
- error_tolerance = 0
- error_percentage = float(total_errors) * 100 / total_rx
-
- if total_errors > 0:
- if self.is_loopback or error_percentage > error_tolerance:
- self.fail('Too much errors in rx_check. (~%s%% of traffic)' % error_percentage)
- else:
- print 'There are errors in rx_check (%f%%), not exceeding allowed limit (%s%%)' % (error_percentage, error_tolerance)
- else:
- print 'No errors in rx_check.'
- except Exception as e:
- print traceback.print_exc()
- self.fail('Errors in rx_check: %s' % e)
-
- def test_rx_check_sfr(self):
- if not self.is_loopback:
- self.router.configure_basic_interfaces()
- self.router.config_pbr(mode = 'config')
-
- core = self.get_benchmark_param('cores')
- mult = self.get_benchmark_param('multiplier')
- sample_rate = self.get_benchmark_param('rx_sample_rate')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- rx_check = sample_rate,
- d = 100,
- f = 'avl/sfr_delay_10_1g_no_bundeling.yaml',
- l = 1000,
- k = 10,
- learn_verify = True,
- l_pkt_mode = 2)
-
- trex_res = self.trex.sample_to_run_finish()
-
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
- #print ("\nLATEST DUMP:")
- #print trex_res.get_latest_dump()
-
- self.check_general_scenario_results(trex_res)
- self.check_CPU_benchmark(trex_res)
- self.check_rx_errors(trex_res)
-
-
- def test_rx_check_http(self):
- if not self.is_loopback:
- # TODO: skip as test_rx_check_http_negative will cover it
- #self.skip('This test is covered by test_rx_check_http_negative')
- self.router.configure_basic_interfaces()
- self.router.config_pbr(mode = "config")
-
- core = self.get_benchmark_param('cores')
- mult = self.get_benchmark_param('multiplier')
- sample_rate = self.get_benchmark_param('rx_sample_rate')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- rx_check = sample_rate,
- d = 100,
- f = 'cap2/http_simple.yaml',
- l = 1000,
- k = 10,
- learn_verify = True,
- l_pkt_mode = 2)
-
- trex_res = self.trex.sample_to_run_finish()
-
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
-
- self.check_general_scenario_results(trex_res)
- self.check_CPU_benchmark(trex_res)
- self.check_rx_errors(trex_res)
-
-
- def test_rx_check_sfr_ipv6(self):
- if not self.is_loopback:
- self.router.configure_basic_interfaces()
- self.router.config_pbr(mode = 'config')
- self.router.config_ipv6_pbr(mode = "config")
-
- core = self.get_benchmark_param('cores')
- mult = self.get_benchmark_param('multiplier')
- sample_rate = self.get_benchmark_param('rx_sample_rate')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- rx_check = sample_rate,
- d = 100,
- f = 'avl/sfr_delay_10_1g_no_bundeling.yaml',
- l = 1000,
- k = 10,
- ipv6 = True)
-
- trex_res = self.trex.sample_to_run_finish()
-
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
- #print ("\nLATEST DUMP:")
- #print trex_res.get_latest_dump()
-
- self.check_general_scenario_results(trex_res)
- self.check_CPU_benchmark(trex_res)
- self.check_rx_errors(trex_res)
-
-
- def test_rx_check_http_ipv6(self):
- if not self.is_loopback:
- self.router.configure_basic_interfaces()
- self.router.config_pbr(mode = "config")
- self.router.config_ipv6_pbr(mode = "config")
-
- core = self.get_benchmark_param('cores')
- mult = self.get_benchmark_param('multiplier')
- sample_rate = self.get_benchmark_param('rx_sample_rate')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- nc = True,
- rx_check = sample_rate,
- d = 100,
- f = 'cap2/http_simple.yaml',
- l = 1000,
- k = 10,
- ipv6 = True)
-
- trex_res = self.trex.sample_to_run_finish()
-
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
-
- self.check_general_scenario_results(trex_res)
- self.check_CPU_benchmark(trex_res)
- self.check_rx_errors(trex_res)
-
- #@nottest
- def test_rx_check_http_negative(self):
- if self.is_loopback:
- self.skip('This test uses NAT, not relevant for loopback')
-
- self.router.configure_basic_interfaces()
- self.router.config_pbr(mode = "config")
-
- core = self.get_benchmark_param('cores')
- mult = self.get_benchmark_param('multiplier')
- sample_rate = self.get_benchmark_param('rx_sample_rate')
-
- ret = self.trex.start_trex(
- c = core,
- m = mult,
- p = True,
- rx_check = sample_rate,
- d = 60,
- f = 'cap2/http_simple.yaml',
- l = 1000,
- k = 10,
- learn_verify = True,
- l_pkt_mode = 2)
-
- print 'Run for 40 seconds, expect no errors'
- trex_res = self.trex.sample_x_seconds(40)
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
- self.check_general_scenario_results(trex_res)
- self.check_CPU_benchmark(trex_res)
- self.check_rx_errors(trex_res)
-
- print 'Run until finish, expect errors'
- old_errors = copy.deepcopy(self.fail_reasons)
- nat_dict = self.get_benchmark_param('nat_dict', test_name = 'test_nat_simple')
- nat_obj = CNatConfig(nat_dict)
- self.router.config_nat(nat_obj)
- self.router.config_zbf()
- trex_res = self.trex.sample_to_run_finish()
- self.router.config_no_zbf()
- self.router.clear_nat_translations()
- print ("\nLATEST RESULT OBJECT:")
- print trex_res
- self.check_rx_errors(trex_res, allow_error_tolerance = False)
- if self.fail_reasons == old_errors:
- self.fail('Expected errors here, got none.')
- else:
- print 'Got errors as expected.'
- self.fail_reasons = old_errors
-
- def tearDown(self):
- CTRexGeneral_Test.tearDown(self)
- pass
-
-if __name__ == "__main__":
- pass