From 98aae80e70dcb8f9050ff05e1e082bb92c909a0d Mon Sep 17 00:00:00 2001 From: Yaroslav Brustinov Date: Fri, 20 Jan 2017 14:09:13 +0200 Subject: add bp-sim-64 test with client config; move generated files to generated directory Change-Id: I036e5666d1a2b1ec8045f82df64cce08503cdc80 Signed-off-by: Yaroslav Brustinov --- .gitignore | 9 +- .../regression/cfg/client_cfg_vlan_mac.yaml | 26 ++++ .../regression/functional_tests/cpp_gtests_test.py | 13 ++ .../functional_tests/golden/bp_sim_dns_vlans.pcap | Bin 0 -> 1842 bytes .../regression/functional_tests/stl_basic_tests.py | 134 +++++++++++---------- scripts/generated/.placeholder | 0 src/gtest/client_cfg_test.cpp | 2 +- 7 files changed, 109 insertions(+), 75 deletions(-) create mode 100644 scripts/automation/regression/cfg/client_cfg_vlan_mac.yaml create mode 100644 scripts/automation/regression/functional_tests/golden/bp_sim_dns_vlans.pcap create mode 100644 scripts/generated/.placeholder 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 Binary files /dev/null and b/scripts/automation/regression/functional_tests/golden/bp_sim_dns_vlans.pcap 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 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) { -- cgit 1.2.3-korg