summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore9
-rw-r--r--scripts/automation/regression/cfg/client_cfg_vlan_mac.yaml26
-rw-r--r--scripts/automation/regression/functional_tests/cpp_gtests_test.py13
-rw-r--r--scripts/automation/regression/functional_tests/golden/bp_sim_dns_vlans.pcapbin0 -> 1842 bytes
-rw-r--r--scripts/automation/regression/functional_tests/stl_basic_tests.py134
-rw-r--r--scripts/generated/.placeholder0
-rw-r--r--src/gtest/client_cfg_test.cpp2
7 files changed, 109 insertions, 75 deletions
diff --git a/.gitignore b/.gitignore
index 097e76a4..90d50eb2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -90,14 +90,6 @@ scripts/exp/limit_multi_pkt-0.erf
scripts/exp/limit_single_pkt-0.erf
scripts/exp/imix_64_fast-0.erf
scripts/exp/pcap_mode2-0.erf
-scripts/1.cap
-scripts/2.cap
-scripts/3.cap
-scripts/4.cap
-scripts/5.cap
-scripts/6.cap
-scripts/7.cap
-scripts/8.cap
scripts/exp/rtsp_short1-0.erf
scripts/exp/rtsp_short1_ipv6_rxcheck.erf
scripts/exp/rtsp_short1_rxcheck.erf
@@ -138,6 +130,7 @@ src/GTAGS
*.pyc
__pycache__
*_GENERATED.*
+scripts/generated/*
# Packages #
############
diff --git a/scripts/automation/regression/cfg/client_cfg_vlan_mac.yaml b/scripts/automation/regression/cfg/client_cfg_vlan_mac.yaml
new file mode 100644
index 00000000..d6d24dbb
--- /dev/null
+++ b/scripts/automation/regression/cfg/client_cfg_vlan_mac.yaml
@@ -0,0 +1,26 @@
+vlan: true
+
+groups:
+
+- ip_start : 16.0.0.1
+ ip_end : 16.0.0.4
+ initiator :
+ dst_mac : "00:00:00:01:00:00"
+ vlan : 100
+ responder :
+ dst_mac : "00:00:00:02:00:00"
+ vlan : 200
+
+ count : 1
+
+- ip_start : 16.0.0.5
+ ip_end : 16.0.1.255
+ initiator :
+ dst_mac : "00:00:00:03:00:00"
+ vlan : 300
+ responder :
+ dst_mac : "00:00:00:04:00:00"
+ vlan : 400
+
+ count : 1
+
diff --git a/scripts/automation/regression/functional_tests/cpp_gtests_test.py b/scripts/automation/regression/functional_tests/cpp_gtests_test.py
index 6535da84..a60b715a 100644
--- a/scripts/automation/regression/functional_tests/cpp_gtests_test.py
+++ b/scripts/automation/regression/functional_tests/cpp_gtests_test.py
@@ -4,6 +4,7 @@ import functional_general_test
from trex import CTRexScenario
import os, sys
from subprocess import Popen, STDOUT
+from stl_basic_tests import compare_caps
import shlex
import time
import errno
@@ -44,3 +45,15 @@ class CPP_Test(functional_general_test.CGeneralFunctional_Test):
print('Output:\n%s' % out)
if ret:
raise Exception('Non zero return status of Valgrind gtests (%s)' % ret)
+
+ def test_bp_sim_client_cfg(self):
+ print('')
+ cmd = './bp-sim-64 --pcap -f cap2/dns.yaml --client_cfg automation/regression/cfg/client_cfg_vlan_mac.yaml -o generated/bp_sim_dns_vlans_gen.pcap'
+ ret, out = run_command(os.path.join(CTRexScenario.scripts_path, cmd), cwd = CTRexScenario.scripts_path)
+ print('Output:\n%s' % out)
+ if ret:
+ raise Exception('Non zero return status of Valgrind gtests (%s)' % ret)
+
+ compare_caps(output = os.path.join(CTRexScenario.scripts_path, 'generated/bp_sim_dns_vlans_gen.pcap'),
+ golden = 'functional_tests/golden/bp_sim_dns_vlans.pcap')
+
diff --git a/scripts/automation/regression/functional_tests/golden/bp_sim_dns_vlans.pcap b/scripts/automation/regression/functional_tests/golden/bp_sim_dns_vlans.pcap
new file mode 100644
index 00000000..3dd4890c
--- /dev/null
+++ b/scripts/automation/regression/functional_tests/golden/bp_sim_dns_vlans.pcap
Binary files differ
diff --git a/scripts/automation/regression/functional_tests/stl_basic_tests.py b/scripts/automation/regression/functional_tests/stl_basic_tests.py
index bc5bc4d5..aecbf6d1 100644
--- a/scripts/automation/regression/functional_tests/stl_basic_tests.py
+++ b/scripts/automation/regression/functional_tests/stl_basic_tests.py
@@ -25,6 +25,71 @@ import shlex
from threading import Thread
from collections import defaultdict
+
+def scapy_pkt_show_to_str (scapy_pkt):
+ capture = StringIO()
+ save_stdout = sys.stdout
+ sys.stdout = capture
+ scapy_pkt.show()
+ sys.stdout = save_stdout
+ return capture.getvalue()
+
+
+def compare_caps (output, golden, max_diff_sec = 0.000005):
+ pkts1 = []
+ pkts2 = []
+ pkts_ts_buckets = defaultdict(list)
+
+ for pkt in RawPcapReader(output):
+ ts = pkt[1][0] * 1e6 + pkt[1][1]
+ pkts_ts_buckets[ts].append(pkt)
+ # don't take last ts bucket, it can be cut in middle and packets inside bucket might be different
+ #for ts in sorted(pkts_ts_buckets.keys())[:-1]:
+ for ts in sorted(pkts_ts_buckets.keys()):
+ pkts1.extend(sorted(pkts_ts_buckets[ts]))
+ pkts_ts_buckets.clear()
+
+ for pkt in RawPcapReader(golden):
+ ts = pkt[1][0] * 1e6 + pkt[1][1]
+ pkts_ts_buckets[ts].append(pkt)
+ # don't take last ts bucket, it can be cut in middle and packets inside bucket might be different
+ #for ts in sorted(pkts_ts_buckets.keys())[:-1]:
+ for ts in sorted(pkts_ts_buckets.keys()):
+ pkts2.extend(sorted(pkts_ts_buckets[ts]))
+
+ assert_equal(len(pkts1), len(pkts2), 'Lengths of generated pcap (%s) and golden (%s) are different' % (output, golden))
+
+ for pkt1, pkt2, i in zip(pkts1, pkts2, range(1, len(pkts1))):
+ ts1 = float(pkt1[1][0]) + (float(pkt1[1][1]) / 1e6)
+ ts2 = float(pkt2[1][0]) + (float(pkt2[1][1]) / 1e6)
+
+ if abs(ts1-ts2) > max_diff_sec: # 5 nsec
+ raise AssertionError("TS error: cap files '{0}', '{1}' differ in cap #{2} - '{3}' vs. '{4}'".format(output, golden, i, ts1, ts2))
+
+ if pkt1[0] != pkt2[0]:
+ errmsg = "RAW error: output file '{0}', differs from golden '{1}' in cap #{2}".format(output, golden, i)
+ print(errmsg)
+
+ print(format_text("\ndifferent fields for packet #{0}:".format(i), 'underline'))
+
+ scapy_pkt1_info = scapy_pkt_show_to_str(Ether(pkt1[0])).split('\n')
+ scapy_pkt2_info = scapy_pkt_show_to_str(Ether(pkt2[0])).split('\n')
+
+ print(format_text("\nGot:\n", 'bold', 'underline'))
+ for line, ref in zip(scapy_pkt1_info, scapy_pkt2_info):
+ if line != ref:
+ print(format_text(line, 'bold'))
+
+ print(format_text("\nExpected:\n", 'bold', 'underline'))
+ for line, ref in zip(scapy_pkt2_info, scapy_pkt1_info):
+ if line != ref:
+ print(format_text(line, 'bold'))
+
+ print("\n")
+ raise AssertionError(errmsg)
+
+
+
@attr('run_on_trex')
class CStlBasic_Test(functional_general_test.CGeneralFunctional_Test):
def setUp (self):
@@ -73,69 +138,6 @@ class CStlBasic_Test(functional_general_test.CGeneralFunctional_Test):
raise Exception("cannot find '{0}'".format(name))
- def scapy_pkt_show_to_str (self, scapy_pkt):
- capture = StringIO()
- save_stdout = sys.stdout
- sys.stdout = capture
- scapy_pkt.show()
- sys.stdout = save_stdout
- return capture.getvalue()
-
-
- def compare_caps (self, output, golden, max_diff_sec = 0.01):
- pkts1 = []
- pkts2 = []
- pkts_ts_buckets = defaultdict(list)
-
- for pkt in RawPcapReader(output):
- ts = pkt[1][0] * 1e6 + pkt[1][1]
- pkts_ts_buckets[ts].append(pkt)
- # don't take last ts bucket, it can be cut in middle and packets inside bucket might be different
- #for ts in sorted(pkts_ts_buckets.keys())[:-1]:
- for ts in sorted(pkts_ts_buckets.keys()):
- pkts1.extend(sorted(pkts_ts_buckets[ts]))
- pkts_ts_buckets.clear()
-
- for pkt in RawPcapReader(golden):
- ts = pkt[1][0] * 1e6 + pkt[1][1]
- pkts_ts_buckets[ts].append(pkt)
- # don't take last ts bucket, it can be cut in middle and packets inside bucket might be different
- #for ts in sorted(pkts_ts_buckets.keys())[:-1]:
- for ts in sorted(pkts_ts_buckets.keys()):
- pkts2.extend(sorted(pkts_ts_buckets[ts]))
-
- assert_equal(len(pkts1), len(pkts2), 'Lengths of generated pcap (%s) and golden (%s) are different' % (output, golden))
-
- for pkt1, pkt2, i in zip(pkts1, pkts2, range(1, len(pkts1))):
- ts1 = float(pkt1[1][0]) + (float(pkt1[1][1]) / 1e6)
- ts2 = float(pkt2[1][0]) + (float(pkt2[1][1]) / 1e6)
-
- if abs(ts1-ts2) > 0.000005: # 5 nsec
- raise AssertionError("TS error: cap files '{0}', '{1}' differ in cap #{2} - '{3}' vs. '{4}'".format(output, golden, i, ts1, ts2))
-
- if pkt1[0] != pkt2[0]:
- errmsg = "RAW error: output file '{0}', differs from golden '{1}' in cap #{2}".format(output, golden, i)
- print(errmsg)
-
- print(format_text("\ndifferent fields for packet #{0}:".format(i), 'underline'))
-
- scapy_pkt1_info = self.scapy_pkt_show_to_str(Ether(pkt1[0])).split('\n')
- scapy_pkt2_info = self.scapy_pkt_show_to_str(Ether(pkt2[0])).split('\n')
-
- print(format_text("\nGot:\n", 'bold', 'underline'))
- for line, ref in zip(scapy_pkt1_info, scapy_pkt2_info):
- if line != ref:
- print(format_text(line, 'bold'))
-
- print(format_text("\nExpected:\n", 'bold', 'underline'))
- for line, ref in zip(scapy_pkt2_info, scapy_pkt1_info):
- if line != ref:
- print(format_text(line, 'bold'))
-
- print("\n")
- raise AssertionError(errmsg)
-
-
def run_sim (self, yaml, output, options = "", silent = False, obj = None, tunables = None):
if output:
user_cmd = "-f {0} -o {1} {2} -p {3}".format(yaml, output, options, self.scripts_path)
@@ -169,7 +171,7 @@ class CStlBasic_Test(functional_general_test.CGeneralFunctional_Test):
tunables = None):
print('Testing profile: %s' % profile)
- output_cap = "a.pcap"
+ output_cap = "generated/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):
@@ -186,7 +188,7 @@ class CStlBasic_Test(functional_general_test.CGeneralFunctional_Test):
#os.system(s)
if compare:
- self.compare_caps(output_cap, golden_file)
+ compare_caps(output_cap, golden_file)
finally:
if not do_no_remove:
os.unlink(output_cap)
@@ -208,7 +210,7 @@ class CStlBasic_Test(functional_general_test.CGeneralFunctional_Test):
assert_equal(rc, True, 'Simulation on profile %s (generated) failed.' % profile)
if compare:
- self.compare_caps(output_cap, golden_file)
+ compare_caps(output_cap, golden_file)
finally:
diff --git a/scripts/generated/.placeholder b/scripts/generated/.placeholder
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/scripts/generated/.placeholder
diff --git a/src/gtest/client_cfg_test.cpp b/src/gtest/client_cfg_test.cpp
index 987fc252..851da2d1 100644
--- a/src/gtest/client_cfg_test.cpp
+++ b/src/gtest/client_cfg_test.cpp
@@ -71,7 +71,7 @@ TEST_F(basic_client_cfg, test1) {
CGlobalInfo::m_options.m_expected_portd = 4;
printf("Expected ports %d\n", CGlobalInfo::m_options.m_expected_portd);
- std::string tmp_file_name = "client_cfg_gtest_GENERATED.yaml";
+ std::string tmp_file_name = "generated/client_cfg_gtest_GENERATED.yaml";
FILE *fd = fopen(tmp_file_name.c_str(), "w");
if (fd == NULL) {