From 5416d161aacfb07ecdbe57d62d6f3f353e24d0f3 Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 16 Aug 2025 16:57:58 +0300 Subject: [PATCH 1/8] Update Packet++ tests to work with out of source builds. --- Tests/Packet++Test/CMakeLists.txt | 27 ++++++++++++++++++--- Tests/Packet++Test/Tests/EthAndArpTests.cpp | 3 +-- Tests/Packet++Test/main.cpp | 2 +- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Tests/Packet++Test/CMakeLists.txt b/Tests/Packet++Test/CMakeLists.txt index 4ed73b7adb..3477249181 100644 --- a/Tests/Packet++Test/CMakeLists.txt +++ b/Tests/Packet++Test/CMakeLists.txt @@ -53,12 +53,31 @@ add_executable( target_link_libraries(Packet++Test PUBLIC memplumber Packet++ PcppTestFramework EndianPortable) +target_include_directories(Packet++Test PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") + if(MSVC) # This executable requires getopt.h not available on VStudio target_link_libraries(Packet++Test PRIVATE Getopt-for-Visual-Studio) endif() -set_property(TARGET Packet++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Bin") -set_property(TARGET Packet++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/Bin") -set_property(TARGET Packet++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/Bin") -add_test(NAME Packet++Test COMMAND $ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/) +add_custom_command( + TARGET Packet++Test + POST_BUILD + COMMAND + ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/PacketExamples + $/PacketExamples +) + +add_custom_command( + TARGET Packet++Test + POST_BUILD + COMMAND + ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/../../3rdParty/OUIDataset/PCPP_OUIDataset.json" + "$/PCPP_OUIDataset.json" +) + +# set_property(TARGET Packet++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Bin") +# set_property(TARGET Packet++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/Bin") +# set_property(TARGET Packet++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/Bin") +# add_test(NAME Packet++Test COMMAND $ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/) +add_test(NAME Packet++Test COMMAND $ WORKING_DIRECTORY $) diff --git a/Tests/Packet++Test/Tests/EthAndArpTests.cpp b/Tests/Packet++Test/Tests/EthAndArpTests.cpp index 5628c63692..f5b80fbad2 100644 --- a/Tests/Packet++Test/Tests/EthAndArpTests.cpp +++ b/Tests/Packet++Test/Tests/EthAndArpTests.cpp @@ -13,8 +13,7 @@ PTF_TEST_CASE(OUILookup) { pcpp::OUILookup lookupEngineJson; - PTF_ASSERT_GREATER_THAN(lookupEngineJson.initOUIDatabaseFromJson("../../3rdParty/OUIDataset/PCPP_OUIDataset.json"), - 0); + PTF_ASSERT_GREATER_THAN(lookupEngineJson.initOUIDatabaseFromJson("PCPP_OUIDataset.json"), 0); PTF_ASSERT_EQUAL(lookupEngineJson.getVendorName("aa:aa:aa:aa:aa:aa"), "Unknown"); // CIDR 36 diff --git a/Tests/Packet++Test/main.cpp b/Tests/Packet++Test/main.cpp index d4eb73cfcb..b0e247cf08 100644 --- a/Tests/Packet++Test/main.cpp +++ b/Tests/Packet++Test/main.cpp @@ -3,7 +3,7 @@ #include "PcppTestFrameworkRun.h" #include "TestDefinition.h" #include "Logger.h" -#include "../../Tests/Packet++Test/Utils/TestUtils.h" +#include "Utils/TestUtils.h" static struct option PacketTestOptions[] = { { "include-tags", required_argument, nullptr, 't' }, From c453f092a88e6f99048dad2cce89143751d6ee02 Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 16 Aug 2025 17:03:15 +0300 Subject: [PATCH 2/8] Updated Pcap++ to work with out of source builds. --- Tests/Pcap++Test/CMakeLists.txt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Tests/Pcap++Test/CMakeLists.txt b/Tests/Pcap++Test/CMakeLists.txt index 1727a4d15b..5dc191ba50 100644 --- a/Tests/Pcap++Test/CMakeLists.txt +++ b/Tests/Pcap++Test/CMakeLists.txt @@ -26,8 +26,15 @@ if(MSVC) target_link_libraries(Pcap++Test PRIVATE Getopt-for-Visual-Studio) endif() -set_property(TARGET Pcap++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Bin") -set_property(TARGET Pcap++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/Bin") -set_property(TARGET Pcap++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/Bin") +add_custom_command(TARGET Pcap++Test + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${CMAKE_CURRENT_SOURCE_DIR}/PcapExamples" + "$/PcapExamples" +) -add_test(NAME Pcap++Test COMMAND $ -n WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/) +# set_property(TARGET Pcap++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Bin") +# set_property(TARGET Pcap++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/Bin") +# set_property(TARGET Pcap++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/Bin") +# add_test(NAME Pcap++Test COMMAND $ -n WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/) +add_test(NAME Pcap++Test COMMAND $ -n WORKING_DIRECTORY $) From 79e71fcbfa1d5057786687f898bb5126712baedb Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 16 Aug 2025 17:05:02 +0300 Subject: [PATCH 3/8] Lint --- Tests/Pcap++Test/CMakeLists.txt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Tests/Pcap++Test/CMakeLists.txt b/Tests/Pcap++Test/CMakeLists.txt index 5dc191ba50..c7b46191da 100644 --- a/Tests/Pcap++Test/CMakeLists.txt +++ b/Tests/Pcap++Test/CMakeLists.txt @@ -26,15 +26,16 @@ if(MSVC) target_link_libraries(Pcap++Test PRIVATE Getopt-for-Visual-Studio) endif() -add_custom_command(TARGET Pcap++Test - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory - "${CMAKE_CURRENT_SOURCE_DIR}/PcapExamples" - "$/PcapExamples" +add_custom_command( + TARGET Pcap++Test + POST_BUILD + COMMAND + ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/PcapExamples" + "$/PcapExamples" ) # set_property(TARGET Pcap++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Bin") # set_property(TARGET Pcap++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/Bin") # set_property(TARGET Pcap++Test PROPERTY RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/Bin") # add_test(NAME Pcap++Test COMMAND $ -n WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/) -add_test(NAME Pcap++Test COMMAND $ -n WORKING_DIRECTORY $) +add_test(NAME Pcap++Test COMMAND $ -n WORKING_DIRECTORY $) From 07b1d6443d980996c3b1efa21048cd112bb6133d Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 16 Aug 2025 17:43:09 +0300 Subject: [PATCH 4/8] Fix unix run_tests. --- .github/workflows/build_and_test.yml | 10 ++--- ci/run_tests/run_tests.py | 64 +++++++++++++++++++--------- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 148d5d150f..b8dc99d727 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -130,7 +130,7 @@ jobs: - name: Test PcapPlusPlus run: | . .venv/bin/activate - python3 ci/run_tests/run_tests.py --interface eth0 ${{ matrix.additional-test-flags }} + python3 ci/run_tests/run_tests.py --interface eth0 ${{ matrix.additional-test-flags }} "$BUILD_DIR" - name: Test Examples run: | @@ -215,7 +215,7 @@ jobs: - name: Test PcapPlusPlus run: | . .venv/bin/activate - python3 ci/run_tests/run_tests.py --interface eth0 --test-suites "packet" + python3 ci/run_tests/run_tests.py --interface eth0 --test-suites "packet" "$BUILD_DIR" - name: Check installation run: | @@ -444,7 +444,7 @@ jobs: if: ${{ matrix.host-arch == matrix.arch }} run: | . .venv/bin/activate - python ci/run_tests/run_tests.py --interface en0 + python ci/run_tests/run_tests.py --interface en0 "$BUILD_DIR" - name: Test Examples if: ${{ matrix.host-arch == matrix.arch }} @@ -700,7 +700,7 @@ jobs: echo "Testing PcapPlusPlus" python3 -m ensurepip python3 -m pip install -r ci/run_tests/requirements.txt - python3 ci/run_tests/run_tests.py --interface "$interface_name" + python3 ci/run_tests/run_tests.py --interface "$interface_name" "$BUILD_DIR" echo "Testing PcapPlusPlus examples" cd Tests/ExamplesTest @@ -833,7 +833,7 @@ jobs: - name: Test PcapPlusPlus run: | . .venv/bin/activate - python ci/run_tests/run_tests.py --interface eth0 --use-sudo --pcap-test-args="-t xdp" + python ci/run_tests/run_tests.py --interface eth0 --use-sudo --pcap-test-args="-t xdp" "$BUILD_DIR" - name: Create Cobertura Report run: | diff --git a/ci/run_tests/run_tests.py b/ci/run_tests/run_tests.py index df4f3fe373..ecd2e16a5e 100644 --- a/ci/run_tests/run_tests.py +++ b/ci/run_tests/run_tests.py @@ -3,6 +3,8 @@ import os import subprocess import argparse +from pathlib import Path +from dataclasses import dataclass from contextlib import contextmanager from scapy.all import get_if_addr @@ -21,29 +23,42 @@ def tcp_replay_worker(interface: str, tcpreplay_dir: str): tcpreplay_proc.kill() -def run_packet_tests(args: list[str], use_sudo: bool): - cmd_line = ["sudo"] if use_sudo else [] - cmd_line += [os.path.join("Bin", "Packet++Test"), *args] +@dataclass +class Runner: + build_dir: Path + use_sudo: bool = False + packet_test_path = Path("Tests", "Packet++Test", "Packet++Test") + pcap_test_path = Path("Tests", "Pcap++Test", "Pcap++Test") - completed_process = subprocess.run(cmd_line, cwd="Tests/Packet++Test") + def run_packet_tests(self, args: list[str]): + exe_path = self.build_dir / self.packet_test_path + work_dir = exe_path.parent - if completed_process.returncode != 0: - raise RuntimeError(f"Error while executing Packet++ tests: {completed_process}") + cmd_line = ["sudo"] if self.use_sudo else [] + cmd_line += [str(exe_path), *args] + completed_process = subprocess.run(cmd_line, cwd=str(work_dir)) -def run_pcap_tests(interface: str, tcpreplay_dir: str, args: list[str], use_sudo: bool): - ip_address = get_if_addr(interface) - print(f"IP address is: {ip_address}") + if completed_process.returncode != 0: + raise RuntimeError(f"Error while executing Packet++ tests: {completed_process}") - with tcp_replay_worker(interface, tcpreplay_dir): - cmd_line = ["sudo"] if use_sudo else [] - cmd_line += [os.path.join("Bin", "Pcap++Test"), "-i", ip_address, *args] - completed_process = subprocess.run(cmd_line, cwd="Tests/Pcap++Test") - if completed_process.returncode != 0: - raise RuntimeError( - f"Error while executing Pcap++ tests: {completed_process}" - ) + def run_pcap_tests(self, interface: str, tcpreplay_dir: str, args: list[str]): + ip_address = get_if_addr(interface) + print(f"IP address is: {ip_address}") + + exe_path = self.build_dir / self.pcap_test_path + work_dir = exe_path.parent + + cmd_line = ["sudo"] if self.use_sudo else [] + cmd_line += [str(exe_path), "-i", ip_address, *args] + + with tcp_replay_worker(interface, tcpreplay_dir): + completed_process = subprocess.run(cmd_line, cwd=str(work_dir)) + if completed_process.returncode != 0: + raise RuntimeError( + f"Error while executing Pcap++ tests: {completed_process}" + ) def main(): @@ -78,17 +93,24 @@ def main(): default=None, help="tcpreplay directory", ) + parser.add_argument( + "build-dir", + type=str, + default=os.getcwd(), + help="path to the build directory" + ) args = parser.parse_args() + runner = Runner(build_dir=args.build_dir, use_sudo=args.use_sudo) + if "packet" in args.test_suites: - run_packet_tests(args.packet_test_args.split(), args.use_sudo) + runner.run_packet_tests(args.packet_test_args.split()) if "pcap" in args.test_suites: - run_pcap_tests( + runner.run_pcap_tests( args.interface, args.tcpreplay_dir, - args.pcap_test_args.split(), - args.use_sudo, + args.pcap_test_args.split() ) From df90787b5a79c7569160108a58223f7a4faa410b Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 16 Aug 2025 17:47:16 +0300 Subject: [PATCH 5/8] args fixes. --- ci/run_tests/run_tests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ci/run_tests/run_tests.py b/ci/run_tests/run_tests.py index ecd2e16a5e..8af47fcbaa 100644 --- a/ci/run_tests/run_tests.py +++ b/ci/run_tests/run_tests.py @@ -97,11 +97,12 @@ def main(): "build-dir", type=str, default=os.getcwd(), + dst="build_dir", help="path to the build directory" ) args = parser.parse_args() - runner = Runner(build_dir=args.build_dir, use_sudo=args.use_sudo) + runner = Runner(build_dir=Path(args.build_dir), use_sudo=args.use_sudo) if "packet" in args.test_suites: runner.run_packet_tests(args.packet_test_args.split()) From 591d0a2d02193582bccf1efedba579c6d5796296 Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 16 Aug 2025 17:50:07 +0300 Subject: [PATCH 6/8] fix typo --- ci/run_tests/run_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/run_tests/run_tests.py b/ci/run_tests/run_tests.py index 8af47fcbaa..ed447b915d 100644 --- a/ci/run_tests/run_tests.py +++ b/ci/run_tests/run_tests.py @@ -97,7 +97,7 @@ def main(): "build-dir", type=str, default=os.getcwd(), - dst="build_dir", + dest="build_dir", help="path to the build directory" ) args = parser.parse_args() From 6ee9dac61eb03e7020dca09d82efed10339845e8 Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sun, 17 Aug 2025 10:37:09 +0300 Subject: [PATCH 7/8] updated build dir name. --- ci/run_tests/run_tests.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ci/run_tests/run_tests.py b/ci/run_tests/run_tests.py index ed447b915d..63e827a926 100644 --- a/ci/run_tests/run_tests.py +++ b/ci/run_tests/run_tests.py @@ -94,10 +94,9 @@ def main(): help="tcpreplay directory", ) parser.add_argument( - "build-dir", + "build_dir", type=str, default=os.getcwd(), - dest="build_dir", help="path to the build directory" ) args = parser.parse_args() From 25eca023051a1365b185404b6fc0bc7b1f8f7639 Mon Sep 17 00:00:00 2001 From: Dimitar Krastev Date: Sat, 11 Oct 2025 22:21:54 +0300 Subject: [PATCH 8/8] changed build dir to a flag. --- .github/workflows/build_and_test.yml | 10 +++++----- ci/run_tests/run_tests.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index de745621fd..14d65facb1 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -130,7 +130,7 @@ jobs: - name: Test PcapPlusPlus run: | . .venv/bin/activate - python3 ci/run_tests/run_tests.py --interface eth0 ${{ matrix.additional-test-flags }} "$BUILD_DIR" + python3 ci/run_tests/run_tests.py --interface eth0 ${{ matrix.additional-test-flags }} --build-dir "$BUILD_DIR" - name: Test Examples run: | @@ -215,7 +215,7 @@ jobs: - name: Test PcapPlusPlus run: | . .venv/bin/activate - python3 ci/run_tests/run_tests.py --interface eth0 --test-suites "packet" "$BUILD_DIR" + python3 ci/run_tests/run_tests.py --interface eth0 --test-suites "packet" --build-dir "$BUILD_DIR" - name: Check installation run: | @@ -449,7 +449,7 @@ jobs: if: ${{ matrix.host-arch == matrix.arch }} run: | . .venv/bin/activate - python ci/run_tests/run_tests.py --interface en0 "$BUILD_DIR" + python ci/run_tests/run_tests.py --interface en0 --build-dir "$BUILD_DIR" - name: Test Examples if: ${{ matrix.host-arch == matrix.arch }} @@ -735,7 +735,7 @@ jobs: echo "Testing PcapPlusPlus" python -m ensurepip python -m pip install -r ci/run_tests/requirements.txt - python ci/run_tests/run_tests.py --interface "$interface_name" "$BUILD_DIR" + python ci/run_tests/run_tests.py --interface "$interface_name" --build-dir "$BUILD_DIR" echo "Testing PcapPlusPlus examples" cd Tests/ExamplesTest @@ -868,7 +868,7 @@ jobs: - name: Test PcapPlusPlus run: | . .venv/bin/activate - python ci/run_tests/run_tests.py --interface eth0 --use-sudo --pcap-test-args="-t xdp" "$BUILD_DIR" + python ci/run_tests/run_tests.py --interface eth0 --use-sudo --pcap-test-args="-t xdp" --build-dir "$BUILD_DIR" - name: Create Cobertura Report run: | diff --git a/ci/run_tests/run_tests.py b/ci/run_tests/run_tests.py index 63e827a926..ada5c6cdd1 100644 --- a/ci/run_tests/run_tests.py +++ b/ci/run_tests/run_tests.py @@ -94,7 +94,7 @@ def main(): help="tcpreplay directory", ) parser.add_argument( - "build_dir", + "--build-dir", type=str, default=os.getcwd(), help="path to the build directory"