Skip to content

Commit 77f368c

Browse files
committed
Getting closer to having a fully structured release process. Much testing is needed.
1 parent 0593fb0 commit 77f368c

File tree

9 files changed

+1762
-25
lines changed

9 files changed

+1762
-25
lines changed

.github/workflows/ci.yml

Lines changed: 226 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,20 @@ name: Protocol Toolkit CI/CD
22

33
on:
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

920
env:
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: |
@@ -58,6 +70,12 @@ jobs:
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

Comments
 (0)