Merge branch 'master' into mod_http_cache_max-age

This commit is contained in:
fu'ad 2024-12-05 22:56:17 +01:00 committed by GitHub
commit 5168f3db59
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
26 changed files with 1194 additions and 254 deletions

View File

@ -0,0 +1,24 @@
ARG BUILDER_IMAGE=signalwire/freeswitch-public-ci-base:bookworm-amd64
FROM ${BUILDER_IMAGE}
ARG MAINTAINER_EMAIL="andrey@signalwire.com"
LABEL org.opencontainers.image.authors="${MAINTAINER_EMAIL}"
SHELL ["/bin/bash", "-c"]
COPY --from=sofia-sip / /usr/src/sofia-sip
COPY --from=freeswitch / /usr/src/freeswitch
RUN cd /usr/src/freeswitch && \
./ci.sh -t unit-test -a configure -c sofia-sip -p "/usr/src/sofia-sip" && \
./ci.sh -t unit-test -a build -c sofia-sip -p "/usr/src/sofia-sip" && \
./ci.sh -t unit-test -a install -c sofia-sip -p "/usr/src/sofia-sip" && \
./ci.sh -t unit-test -a configure -c freeswitch -p "/usr/src/freeswitch" && \
./ci.sh -t unit-test -a build -c freeswitch -p "/usr/src/freeswitch" && \
./ci.sh -t unit-test -a install -c freeswitch -p "/usr/src/freeswitch"
WORKDIR /usr/src/freeswitch/tests/unit
ENTRYPOINT ["/usr/src/freeswitch/tests/unit/run-tests.sh"]

View File

@ -4,18 +4,45 @@ on:
push:
branches:
- master
- v1.10
pull_request:
types:
- opened
- synchronize
workflow_dispatch:
inputs:
freeswitch_ref:
description: 'FreeSWITCH repository ref'
required: false
type: string
sofia-sip_ref:
description: 'Sofia-Sip repository ref'
required: false
type: string
dind:
description: 'Run tests using Docker-in-Docker'
required: false
type: boolean
default: false
env:
CI_BASE_STATIC_IMAGE: signalwire/freeswitch-public-ci-base:bookworm-amd64
DOCKER_BUILD_SUMMARY: false
DOCKER_BUILD_CHECKS_ANNOTATIONS: false
DOCKER_BUILD_RECORD_UPLOAD: false
jobs:
unit-tests-pre-config:
if: ${{ !inputs.dind }}
name: "Unit-tests pre-config"
runs-on: ubuntu-latest
env:
TOTAL_GROUPS: 2
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
container-image: ${{ steps.set-vars.outputs.container-image }}
working-directory: ${{ steps.set-vars.outputs.working-directory }}
tests-only: ${{ steps.set-vars.outputs.tests-only }}
steps:
- id: set-matrix
shell: bash
@ -25,81 +52,52 @@ jobs:
include: [range(1; $groups + 1) | {group: ., total: $groups}]
}')
echo "matrix=$MATRIX" | tee -a $GITHUB_OUTPUT
- id: set-vars
shell: bash
run: |
echo "tests-only=false" >> $GITHUB_OUTPUT
echo "working-directory=freeswitch/tests/unit" >> $GITHUB_OUTPUT
echo "container-image=$CI_BASE_STATIC_IMAGE" >> $GITHUB_OUTPUT
unit-tests:
needs: unit-tests-pre-config
if: ${{ !inputs.dind }}
name: "Unit-tests (group ${{ matrix.group }})"
needs:
- unit-tests-pre-config
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.unit-tests-pre-config.outputs.matrix) }}
name: "unit-tests (group ${{ matrix.group }})"
uses: ./.github/workflows/unit-test.yml
with:
total-groups: ${{ matrix.total }}
current-group: ${{ matrix.group }}
container-image: ${{ needs.unit-tests-pre-config.outputs.container-image }}
working-directory: ${{ needs.unit-tests-pre-config.outputs.working-directory }}
tests-only: ${{ fromJson(needs.unit-tests-pre-config.outputs.tests-only) }}
secrets: inherit
validate-unit-tests:
if: ${{ always() && !inputs.dind }}
name: "Validate Unit-tests"
needs: unit-tests
runs-on: ubuntu-latest
steps:
- name: Check unit tests status
run: |
if [ "${{ needs.unit-tests.result }}" != "success" ]; then
exit 1
fi
unit-tests-dind:
if: ${{ inputs.dind }}
name: "Unit-tests D-in-D"
uses: ./.github/workflows/unit-test-dind.yml
with:
freeswitch_ref: ${{ inputs.freeswitch_ref }}
sofia-sip_ref: ${{ inputs.sofia-sip_ref }}
secrets: inherit
scan-build:
runs-on: ubuntu-latest
container:
image: signalwire/freeswitch-public-base:bookworm
credentials:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
options: --privileged
env:
REPOTOKEN: ${{ secrets.REPOTOKEN }}
DEBIAN_FRONTEND: noninteractive
steps:
- name: Install dependencies
shell: bash
run: |
echo "machine freeswitch.signalwire.com password $REPOTOKEN" > /etc/apt/auth.conf && \
apt-get update && \
apt-get -y remove \
libsofia-sip-ua0 \
libspandsp-dev && \
apt-get -y install \
autoconf \
libsofia-sip-ua-dev \
libspandsp3-dev && \
rm -rf /etc/apt/auth.conf
- name: Checkout code
uses: actions/checkout@v4
with:
path: /__w/freeswitch/freeswitch
- name: Bootstrap
shell: bash
working-directory: /__w/freeswitch/freeswitch
run: |
./bootstrap.sh -j || exit 1
- name: Scan-build FreeSwitch
shell: bash
working-directory: /__w/freeswitch/freeswitch
run: |
cp build/modules.conf.most modules.conf && \
echo 'codecs/mod_openh264' >> modules.conf && \
sed -i \
-e '/mod_mariadb/s/^#//g' \
-e '/mod_v8/s/^#//g' \
-e '/mod_ilbc/s/^/#/g' \
-e '/mod_isac/s/^/#/g' \
-e '/mod_mp4/s/^/#/g' \
-e '/mod_mongo/s/^/#/g' \
-e '/mod_pocketsphinx/s/^/#/g' \
-e '/mod_sangoma_codec/s/^/#/g' \
-e '/mod_siren/s/^/#/g' \
-e '/mod_avmd/s/^/#/g' \
-e '/mod_basic/s/^/#/g' \
-e '/mod_cdr_mongodb/s/^/#/g' \
-e '/mod_cv/s/^/#/g' \
-e '/mod_erlang_event/s/^/#/g' \
-e '/mod_perl/s/^/#/g' \
-e '/mod_rtmp/s/^/#/g' \
-e '/mod_unimrcp/s/^/#/g' \
-e '/mod_xml_rpc/s/^/#/g' \
modules.conf && \
./configure && \
./scan_build.sh
name: "Scan Build"
uses: ./.github/workflows/scan-build.yml
secrets: inherit

99
.github/workflows/scan-build.yml vendored Normal file
View File

@ -0,0 +1,99 @@
name: Scan build (Static Analysis)
on:
workflow_call:
inputs:
freeswitch_ref:
description: 'FreeSWITCH repository ref'
required: false
type: string
sofia-sip_ref:
description: 'Sofia-Sip repository ref'
required: false
type: string
jobs:
scan-build:
runs-on: ubuntu-latest
container:
image: signalwire/freeswitch-public-ci-base:bookworm-amd64
options: --privileged
env:
DEBIAN_FRONTEND: noninteractive
steps:
- name: Checkout Sofia-Sip
if: inputs.sofia-sip_ref == ''
uses: actions/checkout@v4
with:
repository: freeswitch/sofia-sip
path: sofia-sip
- name: Checkout Sofia-Sip (via ref)
if: inputs.sofia-sip_ref != ''
uses: actions/checkout@v4
with:
repository: freeswitch/sofia-sip
ref: ${{ inputs.sofia-sip_ref }}
path: sofia-sip
- name: Checkout FreeSWITCH (via ref)
if: inputs.freeswitch_ref != ''
uses: actions/checkout@v4
with:
ref: ${{ inputs.freeswitch_ref }}
path: freeswitch
- name: Checkout FreeSWITCH
if: inputs.freeswitch_ref == ''
uses: actions/checkout@v4
with:
path: freeswitch
- name: Configure, Build and Install Sofia-Sip
shell: bash
working-directory: freeswitch
run: |
./ci.sh -t scan-build -a configure -c sofia-sip -p "$GITHUB_WORKSPACE/sofia-sip"
./ci.sh -t scan-build -a build -c sofia-sip -p "$GITHUB_WORKSPACE/sofia-sip"
./ci.sh -t scan-build -a install -c sofia-sip -p "$GITHUB_WORKSPACE/sofia-sip"
- name: Configure FreeSWITCH
shell: bash
working-directory: freeswitch
run: |
./ci.sh -t scan-build -a configure -c freeswitch -p "$GITHUB_WORKSPACE/freeswitch"
- name: Run scan-build analysis
shell: bash
working-directory: freeswitch
run: |
./ci.sh -t scan-build -a build -c freeswitch -p "$GITHUB_WORKSPACE/freeswitch"
- name: Check analysis results
if: always()
shell: bash
working-directory: freeswitch
run: |
./ci.sh -t scan-build -a validate -c freeswitch -p "$GITHUB_WORKSPACE/freeswitch"
- name: Upload Scan-Build logs
if: failure()
uses: actions/upload-artifact@v4
with:
name: scan-build-logs
path: freeswitch/scan-build
if-no-files-found: ignore
compression-level: 9
- name: Notify run tests result to slack
if: |
failure() &&
github.event_name == 'push' &&
(github.ref == 'refs/heads/master' || github.ref == 'refs/heads/v1.10')
uses: signalwire/actions-template/.github/actions/slack@main
with:
CHANNEL: ${{ secrets.SLACK_DEVOPS_CI_CHANNEL }}
MESSAGE: Scan-Build ${{ github.repository }} > <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.run_id }}>. Static analysis failed.
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

100
.github/workflows/unit-test-dind.yml vendored Normal file
View File

@ -0,0 +1,100 @@
name: Unit-tests D-in-D
on:
workflow_call:
inputs:
freeswitch_ref:
description: 'FreeSWITCH repository ref'
required: false
type: string
sofia-sip_ref:
description: 'Sofia-Sip repository ref'
required: false
type: string
env:
MAX_CONTAINERS: 8
NUM_CPU_PER_CONTAINER: 1
DOCKER_BUILD_SUMMARY: false
DOCKER_BUILD_CHECKS_ANNOTATIONS: false
DOCKER_BUILD_RECORD_UPLOAD: false
jobs:
unit-tests:
runs-on: ubuntu-latest
container:
image: signalwire/freeswitch-public-ci-base:bookworm-amd64
options: --privileged
env:
DEBIAN_FRONTEND: noninteractive
ASAN_OPTIONS: log_path=stdout:disable_coredump=0:unmap_shadow_on_exit=1:fast_unwind_on_malloc=0
steps:
- name: Checkout Sofia-Sip (via ref)
if: inputs.sofia-sip_ref != ''
uses: actions/checkout@v4
with:
repository: freeswitch/sofia-sip
ref: ${{ inputs.sofia-sip_ref }}
path: sofia-sip
- name: Checkout Sofia-Sip
if: inputs.sofia-sip_ref == ''
uses: actions/checkout@v4
with:
repository: freeswitch/sofia-sip
path: sofia-sip
- name: Checkout FreeSWITCH (via ref)
if: inputs.freeswitch_ref != ''
uses: actions/checkout@v4
with:
ref: ${{ inputs.freeswitch_ref }}
path: freeswitch
- name: Checkout FreeSWITCH
if: inputs.freeswitch_ref == ''
uses: actions/checkout@v4
with:
path: freeswitch
- name: Run Unit-Test containers and collect artifacts
id: unit_tests
shell: bash
run: |
echo "logs_path=${GITHUB_WORKSPACE}/freeswitch/tests/unit/logs" >> $GITHUB_OUTPUT
"${GITHUB_WORKSPACE}/freeswitch/tests/unit/run-tests-docker.sh" \
--base-image signalwire/freeswitch-public-ci-base:bookworm-amd64 \
--cpus ${{ env.NUM_CPU_PER_CONTAINER }} \
--image-tag ci.local \
--max-containers ${{ env.MAX_CONTAINERS }} \
--output-dir "${GITHUB_WORKSPACE}/freeswitch/tests/unit/logs" \
--sofia-sip-path "${GITHUB_WORKSPACE}/sofia-sip" \
--freeswitch-path "${GITHUB_WORKSPACE}/freeswitch"
test -d "/cores" && ls -lah /cores
cd "${GITHUB_WORKSPACE}/freeswitch/tests/unit/" && \
./collect-test-logs.sh --dir logs --print
- name: Upload Unit-Test logs
if: failure()
uses: actions/upload-artifact@v4
with:
name: test-results-${{ github.sha }}-${{ github.run_number }}
path: ${{ steps.unit_tests.outputs.logs_path }}
if-no-files-found: ignore
compression-level: 9
- name: Notify run tests result to slack
if: |
failure() &&
github.event_name == 'push' &&
(github.ref == 'refs/heads/master' || github.ref == 'refs/heads/v1.10')
uses: signalwire/actions-template/.github/actions/slack@main
with:
CHANNEL: ${{ secrets.SLACK_DEVOPS_CI_CHANNEL }}
MESSAGE: Unit-Tests ${{ github.repository }} > <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.run_id }}>. Some tests are failing.
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

View File

@ -7,19 +7,41 @@ on:
description: 'Total number of test groups'
required: true
type: number
default: 1
current-group:
description: 'Current test group number'
required: true
type: number
default: 1
freeswitch_ref:
description: 'FreeSWITCH repository ref'
required: false
type: string
sofia-sip_ref:
description: 'Sofia-Sip repository ref'
required: false
type: string
container-image:
description: 'Container image to use for running tests'
required: false
type: string
default: 'signalwire/freeswitch-public-ci-base:bookworm-amd64'
working-directory:
description: 'Working directory for running tests'
required: false
type: string
default: 'freeswitch/tests/unit'
tests-only:
description: 'Run only tests, skip other tasks'
required: false
type: boolean
default: false
jobs:
unit-test:
runs-on: ubuntu-latest
container:
image: signalwire/freeswitch-public-base:bookworm
credentials:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
image: ${{ inputs.container-image }}
options: --privileged
env:
DEBIAN_FRONTEND: noninteractive
@ -29,83 +51,86 @@ jobs:
- name: Override core_pattern
shell: bash
run: |
cat /proc/sys/kernel/core_pattern
echo '/cores/core.%s.%E.%e.%p.%t' > /proc/sys/kernel/core_pattern
cat /proc/sys/kernel/core_pattern
- name: Install dependencies
shell: bash
env:
REPOTOKEN: ${{ secrets.REPOTOKEN }}
run: |
echo "machine freeswitch.signalwire.com password $REPOTOKEN" > /etc/apt/auth.conf && \
apt-get update && \
apt-get -y remove \
libsofia-sip-ua0 \
libspandsp-dev && \
apt-get -y install \
libspandsp3-dev && \
rm -rf /etc/apt/auth.conf
- name: Checkout code
uses: actions/checkout@v4
with:
path: /__w/freeswitch/freeswitch
- name: Bootstrap
shell: bash
working-directory: /__w/freeswitch/freeswitch
run: |
./bootstrap.sh -j || exit 1
- name: Checkout Sofia-Sip
- name: Checkout Sofia-Sip (via ref)
if: ${{ !inputs.tests-only && inputs.sofia-sip_ref != '' }}
uses: actions/checkout@v4
with:
repository: freeswitch/sofia-sip
path: /__w/freeswitch/freeswitch/sofia-sip
ref: ${{ inputs.sofia-sip_ref }}
path: sofia-sip
- name: Build sofia-sip
shell: bash
working-directory: /__w/freeswitch/freeswitch/sofia-sip
run: |
./autogen.sh && \
./configure.gnu && \
make -j$(nproc --all) install
- name: Build FreeSwitch
shell: bash
working-directory: /__w/freeswitch/freeswitch
run: |
echo 'codecs/mod_openh264' >> modules.conf && \
sed -i \
-e '/applications\/mod_http_cache/s/^#//g' \
-e '/event_handlers\/mod_rayo/s/^#//g' \
-e '/formats\/mod_opusfile/s/^#//g' \
-e '/languages\/mod_lua/s/^#//g' \
modules.conf && \
./configure \
--enable-address-sanitizer \
--enable-fake-dlclose && \
make -j$(nproc --all) |& tee ./unit-tests-build-result.txt
echo ${PIPESTATUS[0]} > ./build-status.txt
if ! test "$(cat ./build-status.txt | tr -d '[:space:]')" -eq 0; then
exit "$(cat ./build-status.txt | tr -d '[:space:]')"
fi
make install
- name: Run tests
shell: bash
working-directory: /__w/freeswitch/freeswitch/tests/unit
run: |
./run-tests.sh ${{ inputs.total-groups }} ${{ inputs.current-group }}
mkdir logs && (mv log_run-tests_*.html logs || true) && (mv backtrace_*.txt logs || true)
./collect-test-logs.sh
- name: Notify result
if: failure()
uses: signalwire/actions-template/.github/actions/notify-ci-result@main
- name: Checkout Sofia-Sip
if: ${{ !inputs.tests-only && inputs.sofia-sip_ref == '' }}
uses: actions/checkout@v4
with:
for: "run_tests"
test_logs_path: /__w/freeswitch/freeswitch/tests/unit
test_artifacts_suffix: "-${{ inputs.current-group }}"
repository: freeswitch/sofia-sip
path: sofia-sip
- name: Checkout FreeSWITCH (via ref)
if: ${{ !inputs.tests-only && inputs.freeswitch_ref != '' }}
uses: actions/checkout@v4
with:
ref: ${{ inputs.freeswitch_ref }}
path: freeswitch
- name: Checkout FreeSWITCH
if: ${{ !inputs.tests-only && inputs.freeswitch_ref == '' }}
uses: actions/checkout@v4
with:
path: freeswitch
- name: Configure, Build and Install Sofia-Sip
if: ${{ !inputs.tests-only }}
shell: bash
working-directory: freeswitch
run: |
./ci.sh -t unit-test -a configure -c sofia-sip -p "$GITHUB_WORKSPACE/sofia-sip"
./ci.sh -t unit-test -a build -c sofia-sip -p "$GITHUB_WORKSPACE/sofia-sip"
./ci.sh -t unit-test -a install -c sofia-sip -p "$GITHUB_WORKSPACE/sofia-sip"
- name: Configure, Build and Install FreeSWITCH
if: ${{ !inputs.tests-only }}
shell: bash
working-directory: freeswitch
run: |
./ci.sh -t unit-test -a configure -c freeswitch -p "$GITHUB_WORKSPACE/freeswitch"
./ci.sh -t unit-test -a build -c freeswitch -p "$GITHUB_WORKSPACE/freeswitch"
./ci.sh -t unit-test -a install -c freeswitch -p "$GITHUB_WORKSPACE/freeswitch"
- name: Run unit tests
shell: bash
working-directory: ${{ inputs.working-directory }}
run: |
./run-tests.sh ${{ inputs.total-groups }} ${{ inputs.current-group }} --output-dir logs || exit 1
- name: Collect unit test logs
if: always()
shell: bash
working-directory: ${{ inputs.working-directory }}
run: |
test -d "/cores" && ls -lah /cores
./collect-test-logs.sh --dir logs --print
- name: Upload Unit-Test logs
if: failure()
uses: actions/upload-artifact@v4
with:
name: test-results-${{ github.sha }}-${{ github.run_number }}-${{ inputs.current-group }}-of-${{ inputs.total-groups }}
path: ${{ inputs.working-directory }}/logs
if-no-files-found: ignore
compression-level: 9
- name: Notify run tests result to slack
if: |
failure() &&
github.event_name == 'push' &&
(github.ref == 'refs/heads/master' || github.ref == 'refs/heads/v1.10')
uses: signalwire/actions-template/.github/actions/slack@main
with:
CHANNEL: ${{ secrets.SLACK_DEVOPS_CI_CHANNEL }}
MESSAGE: Unit-Tests ${{ github.repository }} > <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.run_id }}>. Some tests are failing.
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

28
.github/workflows/windows.yml vendored Normal file
View File

@ -0,0 +1,28 @@
name: Windows
on:
pull_request:
types: [opened, synchronize]
push:
branches: [master, release]
jobs:
x64:
runs-on: windows-2019
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v2
- name: Build
run: msbuild Freeswitch.2017.sln -t:build -verbosity:minimal -property:Configuration=Release -property:Platform=x64
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: MSI Package
path: D:\a\freeswitch\freeswitch\x64\*.msi
if: contains(github.event.pull_request.title, ':upload-artifacts') || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/v1.10'

View File

@ -17,5 +17,4 @@ extraclean-modules: extraclean
print_tests:
@set +e; \
test -z "$(TESTS)" || for i in $(TESTS); do echo $(subdir)/$$i; done;
test -z "$(TESTS)" || for i in $(TESTS); do echo $(subdir)/$$i; done; echo;

259
ci.sh Executable file
View File

@ -0,0 +1,259 @@
#!/usr/bin/env bash
### shfmt -w -s -ci -sr -kp -fn ci.sh
#------------------------------------------------------------------------------
# CI Script
# Helper script for running CI jobs
#------------------------------------------------------------------------------
# Function to display usage information
display_usage()
{
echo "Usage: $0 -t <type> -a <action> -c <code> -p <path>"
echo "Options:"
echo " -t Type (unit-test, scan-build)"
echo " -a Action (configure, build, install, validate)"
echo " -c Code (sofia-sip, freeswitch)"
echo " -p Path to code"
exit 1
}
# Parse command line arguments
while getopts "t:p:a:c:h" opt; do
case $opt in
t) TYPE="$OPTARG" ;;
a) ACTION="$OPTARG" ;;
c) CODE="$OPTARG" ;;
p) PATH_TO_CODE="$OPTARG" ;;
h) display_usage ;;
?) display_usage ;;
esac
done
# Function to handle sofia-sip configuration
configure_sofia_sip()
{
./autogen.sh && ./configure.gnu || exit 1
}
# Function to handle sofia-sip build
build_sofia_sip()
{
make -j$(nproc) || exit 1
}
# Function to handle sofia-sip installation
install_sofia_sip()
{
make install || exit 1
}
# Function to handle sofia-sip validation
validate_sofia_sip()
{
exit 0
}
# Function to handle freeswitch configuration
configure_freeswitch()
{
local type="$1"
./bootstrap.sh -j || exit 1
case "$type" in
"unit-test")
echo 'codecs/mod_openh264' >> modules.conf
sed -i \
-e '/applications\/mod_http_cache/s/^#//g' \
-e '/event_handlers\/mod_rayo/s/^#//g' \
-e '/formats\/mod_opusfile/s/^#//g' \
-e '/languages\/mod_lua/s/^#//g' \
modules.conf
export ASAN_OPTIONS=log_path=stdout:disable_coredump=0:unmap_shadow_on_exit=1:fast_unwind_on_malloc=0
./configure \
--enable-address-sanitizer \
--enable-fake-dlclose ||
exit 1
;;
"scan-build")
cp build/modules.conf.most modules.conf
# "Enable"/"Uncomment" mods
echo 'codecs/mod_openh264' >> modules.conf
sed -i \
-e '/mod_mariadb/s/^#//g' \
-e '/mod_v8/s/^#//g' \
modules.conf
# "Disable"/"Comment out" mods
sed -i \
-e '/mod_ilbc/s/^/#/g' \
-e '/mod_isac/s/^/#/g' \
-e '/mod_mp4/s/^/#/g' \
-e '/mod_mongo/s/^/#/g' \
-e '/mod_pocketsphinx/s/^/#/g' \
-e '/mod_sangoma_codec/s/^/#/g' \
-e '/mod_siren/s/^/#/g' \
-e '/mod_avmd/s/^/#/g' \
-e '/mod_basic/s/^/#/g' \
-e '/mod_cdr_mongodb/s/^/#/g' \
-e '/mod_cv/s/^/#/g' \
-e '/mod_erlang_event/s/^/#/g' \
-e '/mod_perl/s/^/#/g' \
-e '/mod_rtmp/s/^/#/g' \
-e '/mod_unimrcp/s/^/#/g' \
-e '/mod_xml_rpc/s/^/#/g' \
modules.conf
./configure || exit 1
;;
*)
exit 1
;;
esac
}
# Function to handle freeswitch build
build_freeswitch()
{
local type="$1"
set -o pipefail
case "$type" in
"unit-test")
make --no-keep-going -j$(nproc --all) |& tee ./unit-tests-build-result.txt
build_status=${PIPESTATUS[0]}
if [[ $build_status != "0" ]]; then
exit $build_status
fi
;;
"scan-build")
if ! command -v scan-build-14 > /dev/null 2>&1; then
echo "Error: scan-build-14 command not found. Please ensure clang static analyzer is installed." >&2
exit 1
fi
mkdir -p scan-build
scan-build-14 \
--force-analyze-debug-code \
--status-bugs \
-o ./scan-build/ \
make --no-keep-going -j$(nproc --all) |& tee ./scan-build-result.txt
build_status=${PIPESTATUS[0]}
if ! grep -siq "scan-build: No bugs found" ./scan-build-result.txt; then
echo "scan-build: bugs found!"
exit 1
fi
if [[ $build_status != "0" ]]; then
echo "scan-build: compilation failed!"
exit $build_status
fi
;;
*)
exit 1
;;
esac
}
# Function to handle freeswitch installation
install_freeswitch()
{
make install || exit 1
}
# Function to handle freeswitch validation
validate_freeswitch()
{
local type="$1"
case "$type" in
"unit-test")
exit 0
;;
"scan-build")
REPORT_PATH=$(find scan-build* -mindepth 1 -type d)
if [ -n "$REPORT_PATH" ]; then
echo "Found analysis report at: $REPORT_PATH"
if command -v html2text > /dev/null 2>&1; then
echo "Report contents:"
html2text "$REPORT_PATH"/*.html || true
fi
echo "Number of issues found:"
grep -c "<!--BUGDESC" "$REPORT_PATH"/*.html || true
exit $([ -d "$REPORT_PATH" ])
else
echo "No analysis report found"
exit 0
fi
;;
*)
exit 1
;;
esac
}
# Change to the code directory
if [ -n "$PATH_TO_CODE" ]; then
cd "$PATH_TO_CODE" || exit 1
fi
# Execute appropriate flow based on code, type, and action
case "$CODE" in
"sofia-sip")
case "$ACTION" in
"configure")
configure_sofia_sip "$TYPE"
;;
"build")
build_sofia_sip "$TYPE"
;;
"install")
install_sofia_sip "$TYPE"
;;
"validate")
validate_sofia_sip "$TYPE"
;;
*)
exit 1
;;
esac
;;
"freeswitch")
case "$ACTION" in
"configure")
configure_freeswitch "$TYPE"
;;
"build")
build_freeswitch "$TYPE"
;;
"install")
install_freeswitch "$TYPE"
;;
"validate")
validate_freeswitch "$TYPE"
;;
*)
exit 1
;;
esac
;;
*)
exit 1
;;
esac

View File

@ -23,7 +23,7 @@
<ProjectGuid>{FEA2D0AE-6713-4E41-A473-A143849BC7FF}</ProjectGuid>
<RootNamespace>ESL</RootNamespace>
<Keyword>ManagedCProj</Keyword>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

View File

@ -22,7 +22,7 @@
<ProjectGuid>{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>duktape_lib</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

View File

@ -22,7 +22,7 @@
<ProjectGuid>{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>lua_lib</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

View File

@ -21,7 +21,7 @@
<PropertyGroup Label="Globals">
<ProjectName>ffmpeg</ProjectName>
<RootNamespace>ffmpeg</RootNamespace>
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectGuid>{BC1FD72E-1CD5-4525-A7F5-17C5740BFDED}</ProjectGuid>
</PropertyGroup>
<Import Project="$(SolutionDir)w32\zlib.props" Condition=" '$(zlibImported)' == '' " />

View File

@ -21,7 +21,7 @@
<PropertyGroup Label="Globals">
<ProjectName>libav</ProjectName>
<RootNamespace>libav</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectGuid>{841C345F-FCC7-4F64-8F54-0281CEABEB01}</ProjectGuid>
</PropertyGroup>
<Import Project="$(SolutionDir)\w32\yasm.props" Condition=" '$(YasmPropsImported)' == '' " />

View File

@ -23,7 +23,7 @@
<ProjectGuid>{B6E22500-3DB6-4E6E-8CD5-591B781D7D99}</ProjectGuid>
<RootNamespace>libyuv</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='release|Win32'" Label="Configuration">

View File

@ -38,7 +38,7 @@
<ProjectGuid>{03207781-0D1C-4DB3-A71D-45C608F28DBD}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<ProjectName>libspeexdsp</ProjectName>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(SolutionDir)\w32\download_speex.props" Condition=" '$(downloadspeexPropsImported)' == '' " />

View File

@ -1,28 +0,0 @@
#!/bin/bash
mkdir -p scan-build
scan-build-14 --force-analyze-debug-code -o ./scan-build/ make -j`nproc --all` |& tee ./scan-build-result.txt
exitstatus=${PIPESTATUS[0]}
echo "*** Exit status is $exitstatus"
export SubString="scan-build: No bugs found"
export COMPILATION_FAILED="false"
export BUGS_FOUND="false"
if [[ "0" != "$exitstatus" ]] ; then
export COMPILATION_FAILED="true"
echo MESSAGE="compilation failed" >> $GITHUB_OUTPUT
fi
export RESULTFILE="$PWD/scan-build-result.txt"
# cat $RESULTFILE
if ! grep -sq "$SubString" $RESULTFILE; then
export BUGS_FOUND="true"
echo MESSAGE="found bugs" >> $GITHUB_OUTPUT
fi
export REPORT=$PWD/`find scan-build* -mindepth 1 -type d`
echo "COMPILATION_FAILED: $COMPILATION_FAILED"
echo "BUGS_FOUND: $BUGS_FOUND"
echo "COMPILATION_FAILED=$COMPILATION_FAILED" >> $GITHUB_OUTPUT
echo "BUGS_FOUND=$BUGS_FOUND" >> $GITHUB_OUTPUT
echo "REPORT=$REPORT" >> $GITHUB_OUTPUT
if [[ "0" != "$exitstatus" ]] || ! grep -sq "$SubString" $RESULTFILE; then
exit 1
fi
exit 0

View File

@ -22,7 +22,7 @@
<ProjectName>test_mod_av</ProjectName>
<RootNamespace>test_mod_av</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectGuid>{7926CB0D-62CE-4A09-AE94-1DA2BC92D625}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

View File

@ -1,34 +1,99 @@
#!/bin/bash
#!/usr/bin/env bash
echo "Collecting test logs"
LOG_DIR=./logs
html="<html><h3>There are failed unit-tests:</h3><table>"
logs=$(find $LOG_DIR -type f -iname "*.html" -print | sort)
logs_found=0
olddirname=""
for name in $logs
do
logname=$(basename $name)
testname=$(echo $logname | awk -F 'log_run-tests_' '{print $2}' | awk -F '.html' '{print $1}')
testpath="${testname//!/\/}"
dirname=$(dirname $testpath)
test=$(basename $testpath)
if [ "$olddirname" != "$dirname" ]; then
html+="<tr align=\"left\"><th><br>$dirname</th></tr>" ;
olddirname=$dirname ;
fi
html+="<tr align=\"left\"><td><a href="$logname">$test</a>"
backtrace="backtrace_$testname.txt"
if test -f "${LOG_DIR}/$backtrace"; then
html+=". Core dumped, backtrace is available <a href=\"$backtrace\">here</a>"
fi
html+="</td></tr>"
logs_found=1
### shfmt -w -s -ci -sr -kp -fn tests/unit/collect-test-logs.sh
#------------------------------------------------------------------------------
# Collects test logs and generates an HTML report
# of failed unit tests with links to backtraces
#------------------------------------------------------------------------------
# Configuration with default value
LOG_DIR="./logs"
PRINT_TO_CONSOLE=0
# Parse command line arguments
while [[ $# -gt 0 ]]; do
case $1 in
-p | --print)
if ! command -v html2text > /dev/null 2>&1; then
echo "Error: html2text is required for printing HTML contents"
echo "Please install html2text and try again"
exit 1
fi
PRINT_TO_CONSOLE=1
shift
;;
-d | --dir)
if [ -z "$2" ]; then
echo "Error: Log directory path is required for -d|--dir option"
exit 1
fi
LOG_DIR="$2"
shift 2
;;
*)
echo "Unknown option: $1"
echo "Usage: $0 [-p|--print] [-d|--dir DIR]"
exit 1
;;
esac
done
# Initialize HTML
echo "Collecting test logs"
html="<html><head><title>Failed Unit Tests Report</title></head><body><h3>There are failed unit-tests:</h3><table>"
# Find all HTML log files and sort them
logs=$(find "$LOG_DIR" -type f -iname "*.html" -print | sort)
logs_found=0
olddirname=""
# Process each log file
for name in $logs; do
# Extract test information
logname=$(basename "$name")
testname=$(echo "$logname" | awk -F 'log_run-tests_' '{print $2}' | awk -F '.html' '{print $1}')
testpath="${testname//!/\/}"
dirname=$(dirname "$testpath")
test=$(basename "$testpath")
# Add directory header if it's new
if [ "$olddirname" != "$dirname" ]; then
html+="<tr align=\"left\"><th><br>$dirname</th></tr>"
olddirname=$dirname
fi
# Add test entry
html+="<tr align=\"left\"><td><a href=\"$logname\">$test</a>"
# Check for backtrace
backtrace="backtrace_$testname.txt"
if test -f "${LOG_DIR}/$backtrace"; then
if [ $PRINT_TO_CONSOLE -eq 1 ]; then
echo "Core dumped, backtrace:"
cat $backtrace
echo
fi
html+=". Core dumped, backtrace is available <a href=\"$backtrace\">here</a>"
fi
html+="</td></tr>"
logs_found=1
# Print current log file if requested
if [ $PRINT_TO_CONSOLE -eq 1 ]; then
echo "=== Contents of $name ==="
html2text "$name"
echo "=== End of $name ==="
echo
fi
done
# Generate report if logs were found
if [ $logs_found -ne 0 ]; then
html+="</table></html>"
echo $html > $LOG_DIR/artifacts.html
html+="</table></body></html>"
echo "$html" > "$LOG_DIR/artifacts.html"
exit 1
fi

165
tests/unit/run-tests-docker.sh Executable file
View File

@ -0,0 +1,165 @@
#!/usr/bin/env bash
### shfmt -w -s -ci -sr -kp -fn tests/unit/run-tests-docker.sh
#------------------------------------------------------------------------------
# Docker Test Runner
# Parallel test execution in Docker with configurable CPU and container counts
#------------------------------------------------------------------------------
# Exit on error
set -e
# Global exit status
GLOBAL_EXIT_STATUS=0
# Default values
SOFIA_SIP_PATH=""
FREESWITCH_PATH=""
IMAGE_TAG="ci.local"
BASE_IMAGE=""
MAX_CONTAINERS="1"
CPUS_PER_CONTAINER="1"
CONTAINER_IDS_FILE=$(mktemp)
OUTPUT_DIR=""
# Parse command line arguments
while [[ $# -gt 0 ]]; do
case $1 in
--sofia-sip-path)
SOFIA_SIP_PATH="$2"
shift
;;
--freeswitch-path)
FREESWITCH_PATH="$2"
shift
;;
--image-tag)
IMAGE_TAG="$2"
shift
;;
--base-image)
BASE_IMAGE="$2"
shift
;;
--max-containers)
MAX_CONTAINERS="$2"
shift
;;
--cpus)
CPUS_PER_CONTAINER="$2"
shift
;;
--output-dir)
OUTPUT_DIR="$2"
shift
;;
*)
echo "Unknown parameter: $1"
exit 1
;;
esac
shift
done
# Validate paths exist
if [ ! -d "$SOFIA_SIP_PATH" ]; then
echo "Error: Sofia-SIP path does not exist: $SOFIA_SIP_PATH"
exit 1
fi
if [ ! -d "$FREESWITCH_PATH" ]; then
echo "Error: FreeSWITCH path does not exist: $FREESWITCH_PATH"
exit 1
fi
# Validate output directory is provided (required for test results)
if [ -z "$OUTPUT_DIR" ]; then
echo "Error: Output directory must be specified with --output-dir"
exit 1
fi
# Create output directory
mkdir -p "$OUTPUT_DIR"
# Define build log file
BUILD_LOG="$OUTPUT_DIR/docker_build.log"
echo "Starting Docker build..."
# Build Docker image and redirect output to log file
if ! docker build \
--build-arg BUILDER_IMAGE="$BASE_IMAGE" \
--build-context sofia-sip="$SOFIA_SIP_PATH" \
--build-context freeswitch="$FREESWITCH_PATH" \
--file "$FREESWITCH_PATH/.github/docker/debian/bookworm/amd64/CI/Dockerfile" \
--tag "$IMAGE_TAG" \
"$FREESWITCH_PATH/.github/docker/debian" > "$BUILD_LOG" 2>&1; then
echo "Docker build failed! Build log:"
cat "$BUILD_LOG"
exit 1
fi
echo "Build completed successfully! Build log saved to: $BUILD_LOG"
# Get working directory from image
CONTAINER_WORKDIR=$(docker inspect "$IMAGE_TAG" --format='{{.Config.WorkingDir}}')
if [ -z "$CONTAINER_WORKDIR" ]; then
echo "Error: Could not determine container working directory"
exit 1
fi
# Start test containers with output directory mounted
echo "Starting $MAX_CONTAINERS containers..."
for i in $(seq 1 "$MAX_CONTAINERS"); do
CTID=$(docker run --privileged \
--cpus "$CPUS_PER_CONTAINER" \
--volume "$OUTPUT_DIR:$CONTAINER_WORKDIR/$OUTPUT_DIR" \
--detach \
"$IMAGE_TAG" \
--output-dir "$OUTPUT_DIR" \
$MAX_CONTAINERS $i)
echo "$CTID $i" >> "$CONTAINER_IDS_FILE"
echo "Started container: $CTID (index: $i)"
done
echo "All containers started successfully!"
# Wait for containers to finish and collect results
echo "Waiting for containers to finish..."
while read -r line; do
CTID=$(echo "$line" | cut -d' ' -f1)
INDEX=$(echo "$line" | cut -d' ' -f2)
docker wait "$CTID" > /dev/null 2>&1
EXIT_CODE=$(docker inspect "$CTID" --format='{{.State.ExitCode}}')
# Save container logs to output directory
docker logs "$CTID" > "$OUTPUT_DIR/$CTID.log" 2>&1
echo "Container logs saved to: $OUTPUT_DIR/$CTID.log"
if [ "$EXIT_CODE" -ne 0 ]; then
echo "Container $CTID (index: $INDEX) failed with exit code: $EXIT_CODE"
GLOBAL_EXIT_STATUS=1
tail -n 50 "$OUTPUT_DIR/$CTID.log"
else
echo "Container $CTID (index: $INDEX) completed successfully"
fi
done < "$CONTAINER_IDS_FILE"
# Clean up temporary files
rm -f "$CONTAINER_IDS_FILE"
echo "Test outputs have been saved to: $OUTPUT_DIR"
# Exit with global status
if [ "$GLOBAL_EXIT_STATUS" -eq 0 ]; then
echo "All containers completed successfully!"
else
echo "One or more containers failed!"
fi
exit $GLOBAL_EXIT_STATUS

View File

@ -1,29 +1,202 @@
#!/bin/bash
#!/usr/bin/env bash
# "print_tests" returns relative paths to all the tests
TESTS=$(make -s -C ../.. print_tests)
### shfmt -w -s -ci -sr -kp -fn tests/unit/run-tests.sh
chunks=${1:-1}
chunk_number=${2:-1}
#------------------------------------------------------------------------------
# Test Runner Script
# Runs tests in chunks, distributing them across processors
# Supports moving test artifacts to specified output directory
#------------------------------------------------------------------------------
IFS=$'\n' read -d '' -r -a lines <<< "$TESTS"
# Exit on error, undefined vars, and propagate pipe failures
set -euo pipefail
result=""
for ((i=chunk_number-1; i<${#lines[@]}; i+=chunks))
do
result+="${lines[$i]}"$'\n'
# Global variable for test failures
declare -i TESTS_FAILED=0
# Function to show usage
show_usage()
{
echo "Usage: $0 [chunks] [chunk_number] [options]"
echo " chunks : Number of chunks to split tests into (default: 1)"
echo " chunk_number : Which chunk to run (default: 1)"
echo "Options:"
echo " --dry-run : Show test distribution without running tests"
echo " --output-dir : Directory to store test artifacts (will be created if needed)"
echo " -h|--help : Show this help message"
exit 1
}
# Function to validate numeric input
validate_number()
{
local val=$1
local name=$2
if ! [[ $val =~ ^[0-9]+$ ]]; then
echo "Error: $name must be a positive number, got: $val"
exit 1
fi
if [ "$val" -lt 1 ]; then
echo "Error: $name must be greater than 0, got: $val"
exit 1
fi
}
# Function to format duration in human-readable form
format_duration()
{
local duration=$1
local minutes=$((duration / 60))
local seconds=$((duration % 60))
printf "%02d:%02d" $minutes $seconds
}
# Function to move test artifacts to output directory
move_artifacts()
{
local output_dir=$1
# Create output directory if it doesn't exist
mkdir -p "$output_dir"
# Move HTML logs and backtrace files if they exist
# Using || true to prevent script failure if no files match
(mv log_run-tests_*.html "$output_dir" 2> /dev/null || true)
(mv backtrace_*.txt "$output_dir" 2> /dev/null || true)
# Check if any files were moved
if [ -n "$(ls -A "$output_dir" 2> /dev/null)" ]; then
echo "Test artifacts moved to: $output_dir"
else
echo "No test artifacts found to move"
fi
}
# Parse command line arguments
chunks=1
chunk_number=1
dry_run=false
output_dir=""
while [[ $# -gt 0 ]]; do
case $1 in
--dry-run)
dry_run=true
shift
;;
--output-dir)
if [ -n "${2:-}" ]; then
output_dir="$2"
shift 2
else
echo "Error: --output-dir requires a directory path"
exit 1
fi
;;
-h | --help)
show_usage
;;
*)
if [[ $chunks -eq 1 ]]; then
chunks=$1
elif [[ $chunk_number -eq 1 ]]; then
chunk_number=$1
else
echo "Error: Unknown argument $1"
show_usage
fi
shift
;;
esac
done
TESTS=$result
# Validate numeric inputs
validate_number "$chunks" "chunks"
validate_number "$chunk_number" "chunk_number"
echo "-----------------------------------------------------------------";
echo "Starting tests on $(nproc --all) processors";
echo "Tests found: ${TESTS}";
echo "-----------------------------------------------------------------";
# Validate chunk parameters
if [ "$chunk_number" -gt "$chunks" ]; then
echo "Error: chunk_number ($chunk_number) cannot be greater than total chunks ($chunks)"
exit 1
fi
make -f run-tests.mk TEST_LIST=$TESTS
# Get list of tests from make
echo "Fetching test list..."
TESTS=$(make -s -C ../.. print_tests 2>/dev/null) || {
echo "Error: Failed to fetch test list"
exit 1
}
echo "Timing results:"
cat test_times.log
# Split tests into array
IFS=$'\n' read -d '' -r -a all_tests <<< "$TESTS" || true # || true to handle last line without newline
echo "Done running tests!"
# Check if any tests were found
if [ ${#all_tests[@]} -eq 0 ]; then
echo "Error: No tests found!"
exit 1
fi
# Get total number of tests from array length
total_tests=${#all_tests[@]}
# Select tests for this chunk
chunk_tests=()
for ((i = chunk_number - 1; i < total_tests; i += chunks)); do
chunk_tests+=("${all_tests[$i]}")
done
# Size of this chunk
chunk_size=${#chunk_tests[@]}
# Print execution information
echo ""
echo "Test Distribution Information:"
echo "Total tests found: $total_tests"
echo "Chunk size: $chunk_size"
echo "Running chunk $chunk_number/$chunks"
if [ -n "$output_dir" ]; then
echo "Artifacts will be stored in: $output_dir"
fi
echo ""
echo "Tests to be executed:"
for i in "${!chunk_tests[@]}"; do
printf "%3d) %s\n" "$((i + 1))" "${chunk_tests[$i]}"
done
echo ""
# Exit here if dry run
if [ "$dry_run" = true ]; then
echo "Dry run complete. Use without --dry-run to execute tests."
exit 0
fi
# Record start time
start_time=$(date +%s)
# Run tests sequentially within the chunk
if ! make -f run-tests.mk TEST_LIST="${chunk_tests[*]}"; then
TESTS_FAILED=1
fi
# Move artifacts if output directory was specified
if [ -n "$output_dir" ]; then
move_artifacts "$output_dir"
fi
# Record end time and calculate duration
end_time=$(date +%s)
duration=$((end_time - start_time))
# Print timing results and statistics
echo ""
echo "Execution Summary for chunk $chunk_number/$chunks:"
echo "Started at : $(date -d @$start_time '+%Y-%m-%d %H:%M:%S')"
echo "Finished at: $(date -d @$end_time '+%Y-%m-%d %H:%M:%S')"
echo "Duration : $(format_duration $duration)"
echo "Status : $([ $TESTS_FAILED -eq 0 ] && echo "SUCCESS" || echo "FAILED")"
echo ""
# Exit with appropriate status code
exit $TESTS_FAILED

View File

@ -1,5 +1,13 @@
#!/bin/bash
#!/usr/bin/env bash
### shfmt -w -s -ci -sr -kp -fn tests/unit/run-tests.sh
#------------------------------------------------------------------------------
# Test Execution Script
# Executes unit tests and handles test logs and core dumps
#------------------------------------------------------------------------------
# Initialize timing
start_time=$(date +%s)
# All output will be collected here
@ -8,49 +16,74 @@ TESTSUNITPATH=$PWD
# All relative paths are based on the tree's root
FSBASEDIR=$(realpath "$PWD/../../")
# Set system limits
ulimit -c unlimited
ulimit -a
# Get test identifier from argument
i=$1
echo "----------------------------------" ;
echo "Starting test: $i" ;
echo "----------------------------------" ;
echo ""
echo "Starting test: $i"
echo ""
# Change folder to where the test is
currenttestpath="$FSBASEDIR/$i"
cd $(dirname "$currenttestpath")
cd "$(dirname "$currenttestpath")"
# Tests are unique per module, so need to distinguish them by their directory
relativedir=$(dirname "$i")
echo "Relative dir is $relativedir"
# Set up log file path
file=$(basename -- "$currenttestpath")
log="$TESTSUNITPATH/log_run-tests_${relativedir//\//!}!$file.html";
log="$TESTSUNITPATH/log_run-tests_${relativedir//\//!}!$file.html"
# Execute the test
echo "Start executing $currenttestpath"
$currenttestpath 2>&1 | tee >(ansi2html > $log) ;
exitstatus=${PIPESTATUS[0]} ;
$currenttestpath 2>&1 | tee >(ansi2html > "$log")
exitstatus=${PIPESTATUS[0]}
echo "End executing $currenttestpath"
# Record execution time
end_time=$(date +%s)
duration=$((end_time - start_time))
echo "Test $1 took $duration seconds" >> test_times.log
echo "Exit status is $exitstatus"
if [ "0" -eq $exitstatus ] ; then
rm $log ;
# Handle test results
if [ "0" -eq "$exitstatus" ]; then
rm "$log"
else
echo "*** ./$i exit status is $exitstatus" ;
corefilesearch=/cores/core.*.!__w!freeswitch!freeswitch!${relativedir//\//!}!.libs!$file.* ;
echo $corefilesearch ;
echo "*** ./$i exit status is $exitstatus"
# Search for core dumps
corefilesearch="/cores/core.*.!__w!freeswitch!freeswitch!${relativedir//\//!}!.libs!$file.*"
echo "$corefilesearch"
if ls $corefilesearch 1> /dev/null 2>&1; then
echo "coredump found";
coredump=$(ls $corefilesearch) ;
echo $coredump;
echo "set logging file $TESTSUNITPATH/backtrace_${i//\//!}.txt" ;
gdb -ex "set logging file $TESTSUNITPATH/backtrace_${i//\//!}.txt" -ex "set logging on" -ex "set pagination off" -ex "bt full" -ex "bt" -ex "info threads" -ex "thread apply all bt" -ex "thread apply all bt full" -ex "quit" /__w/freeswitch/freeswitch/$relativedir/.libs/$file $coredump ;
fi ;
echo "*** $log was saved" ;
fi ;
echo "----------------" ;
echo "coredump found"
coredump=$(ls $corefilesearch)
echo "$coredump"
# Generate backtrace using GDB
gdb \
-ex "set logging file $TESTSUNITPATH/backtrace_${i//\//!}.txt" \
-ex "set logging on" \
-ex "set pagination off" \
-ex "bt full" \
-ex "bt" \
-ex "info threads" \
-ex "thread apply all bt" \
-ex "thread apply all bt full" \
-ex "quit" \
"$FSBASEDIR/$relativedir/.libs/$file" \
"$coredump"
fi
echo "*** $log was saved"
exit $exitstatus
fi
echo ""

View File

@ -22,7 +22,7 @@
<ProjectName>test_switch_core</ProjectName>
<RootNamespace>test_switch_core</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectGuid>{EF62B845-A0CE-44FD-B8E6-475FE87D06C3}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

View File

@ -22,7 +22,7 @@
<ProjectName>test_switch_core_codec</ProjectName>
<RootNamespace>test_switch_core_codec</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectGuid>{589A07E7-5DE5-49FD-A62C-27795B806AFB}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

View File

@ -22,7 +22,7 @@
<ProjectName>test_switch_core_db</ProjectName>
<RootNamespace>test_switch_core_db</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectGuid>{580675D7-C1C9-4197-AAC5-00F64FAFDE78}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

View File

@ -22,7 +22,7 @@
<ProjectName>test_switch_ivr_originate</ProjectName>
<RootNamespace>test_switch_ivr_originate</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectGuid>{69A7464A-9B0D-4804-A108-835229DACF58}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

View File

@ -23,7 +23,7 @@
<ProjectGuid>{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}</ProjectGuid>
<RootNamespace>FreeSwitchCoreLib</RootNamespace>
<Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">