]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[GHA] Add tests. 2538/head
authors3rj1k <evasive.gyron@gmail.com>
Thu, 25 Jul 2024 17:47:30 +0000 (19:47 +0200)
committers3rj1k <evasive.gyron@gmail.com>
Fri, 11 Oct 2024 18:16:39 +0000 (20:16 +0200)
.github/workflows/ci.yml [new file with mode: 0644]
.github/workflows/unit-test.yml [new file with mode: 0644]
scan_build.sh [new file with mode: 0755]
src/mod/endpoints/mod_sofia/Makefile.am
tests/unit/run-tests.mk [new file with mode: 0644]
tests/unit/run-tests.sh
tests/unit/test.sh

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644 (file)
index 0000000..d16f1a9
--- /dev/null
@@ -0,0 +1,94 @@
+name: CI
+
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+    types:
+      - opened
+      - synchronize
+
+jobs:
+  unit-tests_1:
+    name: "unit-tests (group 1)"
+    uses: ./.github/workflows/unit-test.yml
+    with:
+      total-groups: 2
+      current-group: 1
+    secrets: inherit
+
+  unit-tests_2:
+    name: "unit-tests (group 2)"
+    uses: ./.github/workflows/unit-test.yml
+    with:
+      total-groups: 2
+      current-group: 2
+    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
diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml
new file mode 100644 (file)
index 0000000..8ff0d83
--- /dev/null
@@ -0,0 +1,111 @@
+name: Unit tests
+
+on:
+  workflow_call:
+    inputs:
+      total-groups:
+        description: 'Total number of test groups'
+        required: true
+        type: number
+      current-group:
+        description: 'Current test group number'
+        required: true
+        type: number
+
+jobs:
+  unit-tests:
+    runs-on: ubuntu-latest
+    container:
+      image: signalwire/freeswitch-public-base:bookworm
+      credentials:
+        username: ${{ secrets.DOCKERHUB_USERNAME }}
+        password: ${{ secrets.DOCKERHUB_TOKEN }}
+      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: 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
+        uses: actions/checkout@v4
+        with:
+          repository: freeswitch/sofia-sip
+          path: /__w/freeswitch/freeswitch/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
+        with:
+          for: "run_tests"
+          test_logs_path: /__w/freeswitch/freeswitch/tests/unit
+          test_artifacts_suffix: "-${{ inputs.current-group }}"
diff --git a/scan_build.sh b/scan_build.sh
new file mode 100755 (executable)
index 0000000..200cc2d
--- /dev/null
@@ -0,0 +1,28 @@
+#!/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
index c813f9f597101b08fd44e65671b00d94b9ce5c10..3a5d295ddbd0c7b514312a776a3c94dbb0e7010d 100644 (file)
@@ -38,7 +38,8 @@ test_sipp_based_tests_CFLAGS = $(AM_CFLAGS) $(SOFIA_SIP_CFLAGS) -DSWITCH_TEST_BA
 test_sipp_based_tests_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
 test_sipp_based_tests_LDADD = libsofiamod.la $(SOFIA_SIP_LIBS)
 
-TESTS = test/test_sofia_funcs.sh test/test_nuafail test/test_run_sipp.sh
+TESTS = test/test_sofia_funcs.sh test/test_nuafail
+#TESTS += test/test_run_sipp.sh
 
 if ISMAC
 mod_sofia_la_LDFLAGS += -framework CoreFoundation -framework SystemConfiguration
diff --git a/tests/unit/run-tests.mk b/tests/unit/run-tests.mk
new file mode 100644 (file)
index 0000000..8c260cf
--- /dev/null
@@ -0,0 +1,5 @@
+.DEFAULT:
+       ./test.sh "$@"
+
+all: $(TEST_LIST)
+
index bda6a3257151cd5a543f681367b61c70250df4fa..559dec4a8f0ddfe71aefc6a0cb3f821645520c01 100755 (executable)
@@ -3,26 +3,27 @@
 # "print_tests" returns relative paths to all the tests
 TESTS=$(make -s -C ../.. print_tests)
 
+chunks=${1:-1}
+chunk_number=${2:-1}
+
+IFS=$'\n' read -d '' -r -a lines <<< "$TESTS"
+
+result=""
+for ((i=chunk_number-1; i<${#lines[@]}; i+=chunks))
+do
+  result+="${lines[$i]}"$'\n'
+done
+
+TESTS=$result
+
 echo "-----------------------------------------------------------------";
-echo "Starting tests";
+echo "Starting tests on $(nproc --all) processors";
 echo "Tests found: ${TESTS}";
 echo "-----------------------------------------------------------------";
-echo "Starting" > pids.txt
-for i in $TESTS
-do
-    echo "Testing $i" ;
-    ./test.sh "$i" &
-    pid=($!)
-    pids+=($pid)
-    echo "$pid $i" >> pids.txt
-    echo "----------------" ;
-done
 
-for pid in "${pids[@]}"
-do
-  echo "$pid waiting" >> pids.txt
-  wait "$pid"
-  echo "$pid finished" >> pids.txt
-done
+make -f run-tests.mk TEST_LIST=$TESTS
+
+echo "Timing results:"
+cat test_times.log
 
-echo "Done running tests!"
\ No newline at end of file
+echo "Done running tests!"
index 89711ca99bbcdcfe27ddd9898df6fa52fee461b2..08de6ccd991652abe2b0182f3cee4678160f0e7e 100755 (executable)
@@ -1,11 +1,16 @@
 #!/bin/bash
 
+start_time=$(date +%s)
+
 # All output will be collected here
 TESTSUNITPATH=$PWD
 
 # All relative paths are based on the tree's root
 FSBASEDIR=$(realpath "$PWD/../../")
 
+ulimit -c unlimited
+ulimit -a
+
 i=$1
 
 echo "----------------------------------" ;
@@ -28,20 +33,23 @@ echo "Start executing $currenttestpath"
 $currenttestpath 2>&1 | tee >(ansi2html > $log) ;
 exitstatus=${PIPESTATUS[0]} ;
 echo "End executing $currenttestpath"
+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 ;
 else
        echo "*** ./$i exit status is $exitstatus" ;
-       corefilesearch=/cores/core.*.!drone!src!${relativedir//\//!}!.libs!$file.* ;
+       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" /drone/src/$relativedir/.libs/$file $coredump ;
+           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 ;