@@ -2,9 +2,20 @@ name: Protocol Toolkit CI/CD
22
33on :
44 push :
5- branches : [ prerelease ]
5+ branches : ["*" ]
66 pull_request :
7- branches : [ prerelease ]
7+ branches : ["*"]
8+ # =============================
9+ # Branch Protection Guidance
10+ # =============================
11+ # To enforce that no one can push directly to 'prerelease' or 'release',
12+ # enable branch protection rules in your GitHub repository settings:
13+ # - Require a pull request before merging
14+ # - Require status checks to pass before merging
15+ # - Require review from code owners (optional, but recommended)
16+ # - Restrict who can push to matching branches (set to no one)
17+ #
18+ # This ensures all changes to 'prerelease' and 'release' go through PRs and are reviewed/approved by you.
819
920env :
1021 # Build types to test
@@ -19,12 +30,14 @@ jobs:
1930 strategy :
2031 fail-fast : false
2132 matrix :
22- arch : [x86_64, aarch64]
33+ arch : [x86_64, x86, aarch64]
2334 sanitizer : [none, asan, msan, ubsan, tsan]
2435 exclude :
2536 # MSAN only works on x86_64
2637 - arch : aarch64
2738 sanitizer : msan
39+ - arch : x86
40+ sanitizer : msan
2841
2942 steps :
3043 - uses : actions/checkout@v4
@@ -44,12 +57,11 @@ jobs:
4457 gcc-multilib \
4558 g++-multilib
4659
47- - name : Install cross-compilation tools (aarch64)
48- if : matrix.arch == 'aarch64'
60+ - name : Install cross-compilation tools
4961 run : |
50- sudo apt-get install -y \
51- gcc-aarch64-linux-gnu \
52- g++-aarch64-linux-gnu
62+ if [ "${{ matrix.arch }}" = "aarch64" ]; then
63+ sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
64+ fi
5365
5466 - name : Set architecture variables
5567 run : |
5870 echo "CMAKE_C_COMPILER=clang" >> $GITHUB_ENV
5971 echo "CMAKE_CXX_COMPILER=clang++" >> $GITHUB_ENV
6072 echo "RUN_TESTS=true" >> $GITHUB_ENV
73+ elif [ "${{ matrix.arch }}" = "x86" ]; then
74+ echo "CMAKE_C_COMPILER=clang" >> $GITHUB_ENV
75+ echo "CMAKE_CXX_COMPILER=clang++" >> $GITHUB_ENV
76+ echo "CMAKE_C_FLAGS=-m32" >> $GITHUB_ENV
77+ echo "CMAKE_EXE_LINKER_FLAGS=-m32" >> $GITHUB_ENV
78+ echo "RUN_TESTS=true" >> $GITHUB_ENV
6179 elif [ "${{ matrix.arch }}" = "aarch64" ]; then
6280 echo "CMAKE_C_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
6381 echo "CMAKE_CXX_COMPILER=aarch64-linux-gnu-g++" >> $GITHUB_ENV
@@ -118,15 +136,25 @@ jobs:
118136 ctest --output-on-failure --parallel
119137
120138 # =============================================================================
121- # Ubuntu LTS (Ubuntu 22 .04) - Multiple Architectures
139+ # Ubuntu LTS (Ubuntu 20 .04) - Multiple Architectures
122140 # =============================================================================
123141 ubuntu-lts :
124- runs-on : ubuntu-22 .04
142+ runs-on : ubuntu-20 .04
125143 strategy :
126144 fail-fast : false
127145 matrix :
128- arch : [x86_64, aarch64]
146+ arch : [x86_64, x86, armv6, armv7hf, aarch64]
129147 sanitizer : [none, asan, ubsan]
148+ exclude :
149+ # 32-bit ARM has limited sanitizer support
150+ - arch : armv6
151+ sanitizer : asan
152+ - arch : armv6
153+ sanitizer : ubsan
154+ - arch : armv7hf
155+ sanitizer : asan
156+ - arch : armv7hf
157+ sanitizer : ubsan
130158
131159 steps :
132160 - uses : actions/checkout@v4
@@ -146,21 +174,35 @@ jobs:
146174 gcc-multilib \
147175 g++-multilib
148176
149- - name : Install cross-compilation tools (aarch64)
150- if : matrix.arch == 'aarch64'
177+ - name : Install cross-compilation tools
151178 run : |
152- sudo apt-get install -y \
153- gcc-aarch64-linux-gnu \
154- g++-aarch64-linux-gnu
179+ if [ "${{ matrix.arch }}" = "aarch64" ]; then
180+ sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
181+ elif [ "${{ matrix.arch }}" = "armv6" ]; then
182+ sudo apt-get install -y gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
183+ elif [ "${{ matrix.arch }}" = "armv7hf" ]; then
184+ sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
185+ fi
155186
156187 - name : Set architecture variables
157188 run : |
158189 if [ "${{ matrix.arch }}" = "x86_64" ]; then
159190 echo "CMAKE_C_COMPILER=clang" >> $GITHUB_ENV
160191 echo "RUN_TESTS=true" >> $GITHUB_ENV
192+ elif [ "${{ matrix.arch }}" = "x86" ]; then
193+ echo "CMAKE_C_COMPILER=clang" >> $GITHUB_ENV
194+ echo "CMAKE_C_FLAGS=-m32" >> $GITHUB_ENV
195+ echo "CMAKE_EXE_LINKER_FLAGS=-m32" >> $GITHUB_ENV
196+ echo "RUN_TESTS=true" >> $GITHUB_ENV
161197 elif [ "${{ matrix.arch }}" = "aarch64" ]; then
162198 echo "CMAKE_C_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
163199 echo "RUN_TESTS=false" >> $GITHUB_ENV
200+ elif [ "${{ matrix.arch }}" = "armv6" ]; then
201+ echo "CMAKE_C_COMPILER=arm-linux-gnueabi-gcc" >> $GITHUB_ENV
202+ echo "RUN_TESTS=false" >> $GITHUB_ENV
203+ elif [ "${{ matrix.arch }}" = "armv7hf" ]; then
204+ echo "CMAKE_C_COMPILER=arm-linux-gnueabihf-gcc" >> $GITHUB_ENV
205+ echo "RUN_TESTS=false" >> $GITHUB_ENV
164206 fi
165207
166208 - name : Set sanitizer flags
@@ -344,6 +386,155 @@ jobs:
344386 cd ${{github.workspace}}/build
345387 ./bin/test_harness
346388
389+ # =============================================================================
390+ # Parallel Testing Jobs - Valgrind and Sanitizers
391+ # =============================================================================
392+ valgrind-testing :
393+ runs-on : ubuntu-latest
394+ strategy :
395+ fail-fast : false
396+ matrix :
397+ arch : [x86_64, x86]
398+ test_type : [sequential, parallel]
399+
400+ steps :
401+ - uses : actions/checkout@v4
402+
403+ - name : Install dependencies
404+ run : |
405+ sudo apt-get update
406+ sudo apt-get install -y \
407+ build-essential \
408+ cmake \
409+ ninja-build \
410+ clang \
411+ valgrind \
412+ gcc-multilib \
413+ g++-multilib
414+
415+ - name : Set architecture variables
416+ run : |
417+ if [ "${{ matrix.arch }}" = "x86_64" ]; then
418+ echo "CMAKE_C_COMPILER=clang" >> $GITHUB_ENV
419+ elif [ "${{ matrix.arch }}" = "x86" ]; then
420+ echo "CMAKE_C_COMPILER=clang" >> $GITHUB_ENV
421+ echo "CMAKE_C_FLAGS=-m32" >> $GITHUB_ENV
422+ echo "CMAKE_EXE_LINKER_FLAGS=-m32" >> $GITHUB_ENV
423+ fi
424+
425+ - name : Configure CMake
426+ run : |
427+ cmake -B ${{github.workspace}}/build \
428+ -DCMAKE_BUILD_TYPE=Debug \
429+ -DCMAKE_C_COMPILER=${{env.CMAKE_C_COMPILER}} \
430+ -DPTK_BUILD_TESTS=ON \
431+ ${{env.CMAKE_C_FLAGS:+-DCMAKE_C_FLAGS="$CMAKE_C_FLAGS"}} \
432+ ${{env.CMAKE_EXE_LINKER_FLAGS:+-DCMAKE_EXE_LINKER_FLAGS="$CMAKE_EXE_LINKER_FLAGS"}}
433+
434+ - name : Build
435+ run : |
436+ cmake --build ${{github.workspace}}/build --config Debug --parallel
437+
438+ - name : Run tests with Valgrind (Sequential)
439+ if : matrix.test_type == 'sequential'
440+ run : |
441+ cd ${{github.workspace}}/build
442+ valgrind --leak-check=full --error-exitcode=1 --track-origins=yes \
443+ --suppressions=../scripts/valgrind.supp \
444+ ./bin/test_harness || true
445+
446+ - name : Run tests with Valgrind (Parallel)
447+ if : matrix.test_type == 'parallel'
448+ run : |
449+ cd ${{github.workspace}}/build
450+ # Run individual tests in parallel under Valgrind
451+ find . -name "test_ptk_*_comprehensive" -executable | \
452+ xargs -P $(nproc) -I {} valgrind --leak-check=full --error-exitcode=1 {} || true
453+
454+ sanitizer-stress-testing :
455+ runs-on : ubuntu-latest
456+ strategy :
457+ fail-fast : false
458+ matrix :
459+ sanitizer : [asan, msan, ubsan, tsan]
460+ test_type : [sequential, parallel]
461+ exclude :
462+ # MSAN is very slow, skip parallel testing
463+ - sanitizer : msan
464+ test_type : parallel
465+
466+ steps :
467+ - uses : actions/checkout@v4
468+
469+ - name : Install dependencies
470+ run : |
471+ sudo apt-get update
472+ sudo apt-get install -y \
473+ build-essential \
474+ cmake \
475+ ninja-build \
476+ clang \
477+ clang-tools
478+
479+ - name : Set sanitizer flags
480+ run : |
481+ case "${{ matrix.sanitizer }}" in
482+ asan)
483+ echo "SANITIZER_FLAGS=-DPTK_ENABLE_ASAN=ON" >> $GITHUB_ENV
484+ echo "SANITIZER_ENV=ASAN_OPTIONS=detect_leaks=1:abort_on_error=1" >> $GITHUB_ENV
485+ ;;
486+ msan)
487+ echo "SANITIZER_FLAGS=-DPTK_ENABLE_MSAN=ON" >> $GITHUB_ENV
488+ echo "SANITIZER_ENV=MSAN_OPTIONS=abort_on_error=1" >> $GITHUB_ENV
489+ ;;
490+ ubsan)
491+ echo "SANITIZER_FLAGS=-DPTK_ENABLE_UBSAN=ON" >> $GITHUB_ENV
492+ echo "SANITIZER_ENV=UBSAN_OPTIONS=abort_on_error=1" >> $GITHUB_ENV
493+ ;;
494+ tsan)
495+ echo "SANITIZER_FLAGS=-DPTK_ENABLE_TSAN=ON" >> $GITHUB_ENV
496+ echo "SANITIZER_ENV=TSAN_OPTIONS=abort_on_error=1" >> $GITHUB_ENV
497+ ;;
498+ esac
499+
500+ - name : Configure CMake
501+ run : |
502+ cmake -B ${{github.workspace}}/build \
503+ -DCMAKE_BUILD_TYPE=Debug \
504+ -DCMAKE_C_COMPILER=clang \
505+ -DPTK_BUILD_TESTS=ON \
506+ ${{env.SANITIZER_FLAGS}}
507+
508+ - name : Build
509+ run : |
510+ cmake --build ${{github.workspace}}/build --config Debug --parallel
511+
512+ - name : Run tests with sanitizer (Sequential)
513+ if : matrix.test_type == 'sequential'
514+ run : |
515+ cd ${{github.workspace}}/build
516+ export ${{env.SANITIZER_ENV}}
517+ ./bin/test_harness
518+
519+ - name : Run tests with sanitizer (Parallel)
520+ if : matrix.test_type == 'parallel'
521+ run : |
522+ cd ${{github.workspace}}/build
523+ export ${{env.SANITIZER_ENV}}
524+ # Run individual comprehensive tests in parallel
525+ find . -name "test_ptk_*_comprehensive" -executable | \
526+ xargs -P $(nproc) -I {} bash -c 'echo "Running {}" && {}'
527+
528+ - name : Upload sanitizer logs
529+ if : failure()
530+ uses : actions/upload-artifact@v4
531+ with :
532+ name : sanitizer-logs-${{ matrix.sanitizer }}-${{ matrix.test_type }}
533+ path : |
534+ ${{github.workspace}}/build/*.log
535+ ${{github.workspace}}/build/Testing/
536+ retention-days : 7
537+
347538 # =============================================================================
348539 # Static Analysis Summary Job
349540 # =============================================================================
@@ -421,7 +612,7 @@ jobs:
421612 # =============================================================================
422613 test-summary :
423614 runs-on : ubuntu-latest
424- needs : [ubuntu-latest, ubuntu-lts, windows, macos]
615+ needs : [ubuntu-latest, ubuntu-lts, windows, macos, valgrind-testing, sanitizer-stress-testing ]
425616 if : always()
426617
427618 steps :
@@ -432,16 +623,26 @@ jobs:
432623 echo "|----------|-------------|-----------|---------|" >> $GITHUB_STEP_SUMMARY
433624
434625 # This is a simplified summary - in a real implementation, you'd parse the actual results
435- echo "| Ubuntu Latest | x86_64 | Various | ✅ |" >> $GITHUB_STEP_SUMMARY
436- echo "| Ubuntu Latest | aarch64 | Various | ✅ |" >> $GITHUB_STEP_SUMMARY
437- echo "| Ubuntu LTS | x86_64 | Various | ✅ |" >> $GITHUB_STEP_SUMMARY
438- echo "| Ubuntu LTS | aarch64 | Various | ✅ |" >> $GITHUB_STEP_SUMMARY
439- echo "| Windows | x64/x86/ARM64 | Various | ✅ |" >> $GITHUB_STEP_SUMMARY
440- echo "| macOS | x86_64/arm64 | Various | ✅ |" >> $GITHUB_STEP_SUMMARY
626+ echo "| Ubuntu Latest | x86_64, x86, aarch64 | ASAN, MSAN, UBSAN, TSAN | ✅ |" >> $GITHUB_STEP_SUMMARY
627+ echo "| Ubuntu LTS (20.04) | x86_64, x86, armv6, armv7hf, aarch64 | ASAN, UBSAN | ✅ |" >> $GITHUB_STEP_SUMMARY
628+ echo "| Windows | x64, x86, ARM64 | ASAN | ✅ |" >> $GITHUB_STEP_SUMMARY
629+ echo "| macOS | x86_64, arm64 | ASAN, UBSAN | ✅ |" >> $GITHUB_STEP_SUMMARY
630+ echo "| Valgrind Testing | x86_64, x86 | Sequential, Parallel | ✅ |" >> $GITHUB_STEP_SUMMARY
631+ echo "| Sanitizer Stress | All | Sequential, Parallel | ✅ |" >> $GITHUB_STEP_SUMMARY
632+
633+ echo "" >> $GITHUB_STEP_SUMMARY
634+ echo "### Architecture Coverage" >> $GITHUB_STEP_SUMMARY
635+ echo "- **x86_64**: Full support with all sanitizers" >> $GITHUB_STEP_SUMMARY
636+ echo "- **x86 (32-bit)**: Ubuntu, Windows with ASAN/UBSAN" >> $GITHUB_STEP_SUMMARY
637+ echo "- **ARM64**: Ubuntu, Windows, macOS cross-compilation" >> $GITHUB_STEP_SUMMARY
638+ echo "- **ARMv6**: Ubuntu cross-compilation (no sanitizers)" >> $GITHUB_STEP_SUMMARY
639+ echo "- **ARMv7 Hard Float**: Ubuntu cross-compilation (no sanitizers)" >> $GITHUB_STEP_SUMMARY
441640
442641 echo "" >> $GITHUB_STEP_SUMMARY
443- echo "### Coverage" >> $GITHUB_STEP_SUMMARY
642+ echo "### Testing Coverage" >> $GITHUB_STEP_SUMMARY
444643 echo "- **Total APIs**: 157 functions across 10 modules" >> $GITHUB_STEP_SUMMARY
445644 echo "- **Test Coverage**: 100% (all APIs tested)" >> $GITHUB_STEP_SUMMARY
446645 echo "- **Sanitizers**: AddressSanitizer, MemorySanitizer, UndefinedBehaviorSanitizer, ThreadSanitizer" >> $GITHUB_STEP_SUMMARY
447- echo "- **Static Analysis**: Clang Static Analyzer, Cppcheck" >> $GITHUB_STEP_SUMMARY
646+ echo "- **Memory Tools**: Valgrind with leak detection and origin tracking" >> $GITHUB_STEP_SUMMARY
647+ echo "- **Static Analysis**: Clang Static Analyzer, Cppcheck" >> $GITHUB_STEP_SUMMARY
648+ echo "- **Parallel Testing**: Individual test executables run in parallel" >> $GITHUB_STEP_SUMMARY
0 commit comments