Skip to content

fix(websocket): align tests and correct protocol edge cases #66

fix(websocket): align tests and correct protocol edge cases

fix(websocket): align tests and correct protocol edge cases #66

name: WebSocket Strict CI
on:
push:
branches:
- main
- master
- dev
- release/**
paths:
- ".github/workflows/websocket-strict-ci.yml"
- "CMakeLists.txt"
- "include/**"
- "src/**"
- "examples/**"
- "config/**"
- "docs/**"
- "scripts/**"
- "README.md"
- "CHANGELOG.md"
- "vix.json"
pull_request:
branches:
- main
- master
- dev
- release/**
paths:
- ".github/workflows/websocket-strict-ci.yml"
- "CMakeLists.txt"
- "include/**"
- "src/**"
- "examples/**"
- "config/**"
- "docs/**"
- "scripts/**"
- "README.md"
- "CHANGELOG.md"
- "vix.json"
workflow_dispatch:
permissions:
contents: read
env:
BUILD_JOBS: 2
VIX_GIT_BRANCH: dev
jobs:
build:
name: Build WebSocket (${{ matrix.compiler }}, json=${{ matrix.json_mode }}, examples=${{ matrix.examples }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
compiler:
- gcc
- clang
json_mode:
- AUTO
- OFF
examples:
- ON
- OFF
steps:
- name: Checkout websocket repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential \
cmake \
ninja-build \
clang \
g++ \
pkg-config \
git \
curl \
ca-certificates \
sqlite3 \
libsqlite3-dev \
libasio-dev \
nlohmann-json3-dev \
libspdlog-dev \
libfmt-dev \
libssl-dev
- name: Select compiler
run: |
if [ "${{ matrix.compiler }}" = "clang" ]; then
echo "CC=clang" >> "$GITHUB_ENV"
echo "CXX=clang++" >> "$GITHUB_ENV"
else
echo "CC=gcc" >> "$GITHUB_ENV"
echo "CXX=g++" >> "$GITHUB_ENV"
fi
- name: Fetch sibling dependencies
run: |
set -euxo pipefail
rm -rf \
../error \
../path \
../env \
../utils \
../async \
../io \
../json \
../template \
../core
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/error.git ../error
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/path.git ../path
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/env.git ../env
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/utils.git ../utils
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" --recurse-submodules https://github.com/vixcpp/async.git ../async
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/io.git ../io
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/json.git ../json
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/template.git ../template || true
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/core.git ../core
git -C ../async submodule update --init --recursive --depth 1 || true
- name: Prepare Asio for async
run: |
set -euxo pipefail
mkdir -p ../async/third_party/asio
rm -rf ../async/third_party/asio/include
mkdir -p ../async/third_party/asio/include
cp -r /usr/include/asio* ../async/third_party/asio/include/ || true
test -f ../async/third_party/asio/include/asio.hpp
- name: Verify required sibling dependencies
run: |
set -euxo pipefail
test -f ../error/CMakeLists.txt
test -f ../path/CMakeLists.txt
test -f ../env/CMakeLists.txt
test -f ../utils/CMakeLists.txt
test -f ../async/CMakeLists.txt
test -f ../io/CMakeLists.txt
test -f ../json/CMakeLists.txt
test -f ../core/CMakeLists.txt
test -f ../json/include/vix/json/Simple.hpp
test -f ../async/third_party/asio/include/asio.hpp
- name: Export dependency include paths
run: |
EXTRA_PATHS="$GITHUB_WORKSPACE/../error/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../path/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../env/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../utils/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../async/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../io/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../json/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../core/include"
if [ -d "$GITHUB_WORKSPACE/../template/include" ]; then
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../template/include"
fi
echo "CPATH=$EXTRA_PATHS${CPATH:+:$CPATH}" >> "$GITHUB_ENV"
echo "CPLUS_INCLUDE_PATH=$EXTRA_PATHS${CPLUS_INCLUDE_PATH:+:$CPLUS_INCLUDE_PATH}" >> "$GITHUB_ENV"
- name: Configure
run: |
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DVIX_ENABLE_SANITIZERS=OFF \
-DVIX_WEBSOCKET_WITH_JSON=${{ matrix.json_mode }} \
-DVIX_WEBSOCKET_BUILD_EXAMPLES=${{ matrix.examples }} \
-DVIX_WEBSOCKET_FETCH_CORE=OFF \
-DVIX_WEBSOCKET_FETCH_UTILS=OFF \
-DVIX_CORE_WITH_OPENSSL=OFF \
-DVIX_CORE_WITH_TEMPLATE=AUTO \
-DVIX_CORE_WITH_MYSQL=OFF
- name: Build
run: |
cmake --build build -j"${BUILD_JOBS}"
- name: Print executables
run: |
find build -type f -executable | sort || true
sqlite-check:
name: SQLite Storage Check
runs-on: ubuntu-latest
steps:
- name: Checkout websocket repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential \
cmake \
ninja-build \
g++ \
pkg-config \
git \
curl \
ca-certificates \
sqlite3 \
libsqlite3-dev \
libasio-dev \
nlohmann-json3-dev \
libspdlog-dev \
libfmt-dev \
libssl-dev
- name: Fetch sibling dependencies
run: |
set -euxo pipefail
rm -rf \
../error \
../path \
../env \
../utils \
../async \
../io \
../json \
../template \
../core
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/error.git ../error
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/path.git ../path
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/env.git ../env
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/utils.git ../utils
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" --recurse-submodules https://github.com/vixcpp/async.git ../async
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/io.git ../io
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/json.git ../json
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/template.git ../template || true
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/core.git ../core
git -C ../async submodule update --init --recursive --depth 1 || true
- name: Prepare Asio for async
run: |
set -euxo pipefail
mkdir -p ../async/third_party/asio
rm -rf ../async/third_party/asio/include
mkdir -p ../async/third_party/asio/include
cp -r /usr/include/asio* ../async/third_party/asio/include/ || true
test -f ../async/third_party/asio/include/asio.hpp
- name: Verify required sibling dependencies
run: |
set -euxo pipefail
test -f ../error/CMakeLists.txt
test -f ../path/CMakeLists.txt
test -f ../env/CMakeLists.txt
test -f ../utils/CMakeLists.txt
test -f ../async/CMakeLists.txt
test -f ../io/CMakeLists.txt
test -f ../json/CMakeLists.txt
test -f ../core/CMakeLists.txt
test -f ../json/include/vix/json/Simple.hpp
test -f ../async/third_party/asio/include/asio.hpp
- name: Export dependency include paths
run: |
EXTRA_PATHS="$GITHUB_WORKSPACE/../error/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../path/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../env/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../utils/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../async/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../io/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../json/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../core/include"
if [ -d "$GITHUB_WORKSPACE/../template/include" ]; then
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../template/include"
fi
echo "CPATH=$EXTRA_PATHS${CPATH:+:$CPATH}" >> "$GITHUB_ENV"
echo "CPLUS_INCLUDE_PATH=$EXTRA_PATHS${CPLUS_INCLUDE_PATH:+:$CPLUS_INCLUDE_PATH}" >> "$GITHUB_ENV"
- name: Configure SQLite build
run: |
cmake -S . -B build-sqlite -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DVIX_ENABLE_SANITIZERS=OFF \
-DVIX_WEBSOCKET_WITH_JSON=OFF \
-DVIX_WEBSOCKET_BUILD_EXAMPLES=ON \
-DVIX_WEBSOCKET_FETCH_CORE=OFF \
-DVIX_WEBSOCKET_FETCH_UTILS=OFF \
-DVIX_CORE_WITH_OPENSSL=OFF \
-DVIX_CORE_WITH_TEMPLATE=AUTO \
-DVIX_CORE_WITH_MYSQL=OFF
- name: Build SQLite build
run: |
cmake --build build-sqlite -j"${BUILD_JOBS}"
- name: Run SQLite-related smoke checks
shell: bash
run: |
set +e
rm -rf .ci-tmp
mkdir -p .ci-tmp
mapfile -t CANDIDATES < <(
find build-sqlite -type f -executable | while read -r exe; do
base="$(basename "$exe")"
if [[ ! "$exe" =~ /CMakeFiles/ ]] && [[ "$base" =~ (chat|server|ws|websocket|poll|client) ]]; then
echo "$exe"
fi
done | sort -u
)
if [ ${#CANDIDATES[@]} -eq 0 ]; then
echo "No SQLite-related executable candidates found."
exit 0
fi
for exe in "${CANDIDATES[@]}"; do
echo "==> SQLite smoke: $exe"
(
cd .ci-tmp
timeout 5s "$GITHUB_WORKSPACE/$exe" >/tmp/websocket_sqlite.log 2>&1
)
STATUS=$?
cat /tmp/websocket_sqlite.log || true
if [ $STATUS -ne 0 ] && [ $STATUS -ne 124 ]; then
echo "::warning::SQLite smoke reported issues for $exe"
fi
done
find .ci-tmp -maxdepth 2 -type f | sort || true
exit 0
static-analysis:
name: Static Analysis
runs-on: ubuntu-latest
steps:
- name: Checkout websocket repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential \
cmake \
ninja-build \
clang \
g++ \
cppcheck \
clang-tidy \
pkg-config \
git \
curl \
ca-certificates \
sqlite3 \
libsqlite3-dev \
libasio-dev \
nlohmann-json3-dev \
libspdlog-dev \
libfmt-dev \
libssl-dev
- name: Fetch sibling dependencies
run: |
set -euxo pipefail
rm -rf \
../error \
../path \
../env \
../utils \
../async \
../io \
../json \
../template \
../core
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/error.git ../error
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/path.git ../path
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/env.git ../env
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/utils.git ../utils
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" --recurse-submodules https://github.com/vixcpp/async.git ../async
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/io.git ../io
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/json.git ../json
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/template.git ../template || true
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/core.git ../core
git -C ../async submodule update --init --recursive --depth 1 || true
- name: Prepare Asio for async
run: |
set -euxo pipefail
mkdir -p ../async/third_party/asio
rm -rf ../async/third_party/asio/include
mkdir -p ../async/third_party/asio/include
cp -r /usr/include/asio* ../async/third_party/asio/include/ || true
test -f ../async/third_party/asio/include/asio.hpp
- name: Verify required sibling dependencies
run: |
set -euxo pipefail
test -f ../error/CMakeLists.txt
test -f ../path/CMakeLists.txt
test -f ../env/CMakeLists.txt
test -f ../utils/CMakeLists.txt
test -f ../async/CMakeLists.txt
test -f ../io/CMakeLists.txt
test -f ../json/CMakeLists.txt
test -f ../core/CMakeLists.txt
test -f ../json/include/vix/json/Simple.hpp
test -f ../async/third_party/asio/include/asio.hpp
- name: Export dependency include paths
run: |
EXTRA_PATHS="$GITHUB_WORKSPACE/../error/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../path/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../env/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../utils/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../async/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../io/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../json/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../core/include"
if [ -d "$GITHUB_WORKSPACE/../template/include" ]; then
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../template/include"
fi
echo "CPATH=$EXTRA_PATHS${CPATH:+:$CPATH}" >> "$GITHUB_ENV"
echo "CPLUS_INCLUDE_PATH=$EXTRA_PATHS${CPLUS_INCLUDE_PATH:+:$CPLUS_INCLUDE_PATH}" >> "$GITHUB_ENV"
- name: Configure for analysis
run: |
cmake -S . -B build-analyze -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DVIX_ENABLE_SANITIZERS=OFF \
-DVIX_WEBSOCKET_WITH_JSON=AUTO \
-DVIX_WEBSOCKET_BUILD_EXAMPLES=ON \
-DVIX_WEBSOCKET_FETCH_CORE=OFF \
-DVIX_WEBSOCKET_FETCH_UTILS=OFF \
-DVIX_CORE_WITH_OPENSSL=OFF \
-DVIX_CORE_WITH_TEMPLATE=AUTO \
-DVIX_CORE_WITH_MYSQL=OFF
- name: Run clang-tidy
run: |
set +e
find src examples -name '*.cpp' -print0 | xargs -0 -r -n1 -P2 clang-tidy -p build-analyze
exit 0
- name: Run cppcheck
run: |
set +e
cppcheck \
--enable=all \
--std=c++20 \
--inconclusive \
--quiet \
--suppress=missingIncludeSystem \
include/ src/ examples/
exit 0
config-coverage:
name: Configuration Coverage
runs-on: ubuntu-latest
steps:
- name: Checkout websocket repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential \
cmake \
ninja-build \
g++ \
pkg-config \
git \
curl \
ca-certificates \
sqlite3 \
libsqlite3-dev \
libasio-dev \
nlohmann-json3-dev \
libspdlog-dev \
libfmt-dev \
libssl-dev
- name: Fetch sibling dependencies
run: |
set -euxo pipefail
rm -rf \
../error \
../path \
../env \
../utils \
../async \
../io \
../json \
../template \
../core
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/error.git ../error
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/path.git ../path
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/env.git ../env
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/utils.git ../utils
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" --recurse-submodules https://github.com/vixcpp/async.git ../async
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/io.git ../io
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/json.git ../json
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/template.git ../template || true
git clone --depth 1 --branch "${VIX_GIT_BRANCH}" https://github.com/vixcpp/core.git ../core
git -C ../async submodule update --init --recursive --depth 1 || true
- name: Prepare Asio for async
run: |
set -euxo pipefail
mkdir -p ../async/third_party/asio
rm -rf ../async/third_party/asio/include
mkdir -p ../async/third_party/asio/include
cp -r /usr/include/asio* ../async/third_party/asio/include/ || true
test -f ../async/third_party/asio/include/asio.hpp
- name: Verify required sibling dependencies
run: |
set -euxo pipefail
test -f ../error/CMakeLists.txt
test -f ../path/CMakeLists.txt
test -f ../env/CMakeLists.txt
test -f ../utils/CMakeLists.txt
test -f ../async/CMakeLists.txt
test -f ../io/CMakeLists.txt
test -f ../json/CMakeLists.txt
test -f ../core/CMakeLists.txt
test -f ../json/include/vix/json/Simple.hpp
test -f ../async/third_party/asio/include/asio.hpp
- name: Export dependency include paths
run: |
EXTRA_PATHS="$GITHUB_WORKSPACE/../error/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../path/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../env/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../utils/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../async/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../io/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../json/include"
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../core/include"
if [ -d "$GITHUB_WORKSPACE/../template/include" ]; then
EXTRA_PATHS="$EXTRA_PATHS:$GITHUB_WORKSPACE/../template/include"
fi
echo "CPATH=$EXTRA_PATHS${CPATH:+:$CPATH}" >> "$GITHUB_ENV"
echo "CPLUS_INCLUDE_PATH=$EXTRA_PATHS${CPLUS_INCLUDE_PATH:+:$CPLUS_INCLUDE_PATH}" >> "$GITHUB_ENV"
- name: Configure release mode with JSON AUTO
run: |
cmake -S . -B build-release-auto -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DVIX_ENABLE_SANITIZERS=OFF \
-DVIX_WEBSOCKET_WITH_JSON=AUTO \
-DVIX_WEBSOCKET_BUILD_EXAMPLES=ON \
-DVIX_WEBSOCKET_FETCH_CORE=OFF \
-DVIX_WEBSOCKET_FETCH_UTILS=OFF \
-DVIX_CORE_WITH_OPENSSL=OFF \
-DVIX_CORE_WITH_TEMPLATE=AUTO \
-DVIX_CORE_WITH_MYSQL=OFF
- name: Build release mode with JSON AUTO
run: |
cmake --build build-release-auto -j"${BUILD_JOBS}"
- name: Configure release mode with JSON OFF
run: |
cmake -S . -B build-release-off -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DVIX_ENABLE_SANITIZERS=OFF \
-DVIX_WEBSOCKET_WITH_JSON=OFF \
-DVIX_WEBSOCKET_BUILD_EXAMPLES=OFF \
-DVIX_WEBSOCKET_FETCH_CORE=OFF \
-DVIX_WEBSOCKET_FETCH_UTILS=OFF \
-DVIX_CORE_WITH_OPENSSL=OFF \
-DVIX_CORE_WITH_TEMPLATE=AUTO \
-DVIX_CORE_WITH_MYSQL=OFF
- name: Build release mode with JSON OFF
run: |
cmake --build build-release-off -j"${BUILD_JOBS}"
summary:
name: WebSocket Strict CI Summary
needs:
- build
- sqlite-check
- static-analysis
- config-coverage
runs-on: ubuntu-latest
steps:
- name: Print summary
run: |
echo "WebSocket strict CI completed."
echo "- gcc and clang builds"
echo "- JSON AUTO and OFF builds"
echo "- examples ON and OFF builds"
echo "- SQLite smoke check"
echo "- static analysis"
echo "- release configuration coverage"