Skip to content

Commit

Permalink
ci: Add github/lab build/run unit tests on linux
Browse files Browse the repository at this point in the history
Co-Authored-By: Erik Ekman <erik@kryo.se> (lwip-tcpip/lwip@853258ff)
Co-Authored-By: xueyunfei <xueyunfei@espressif.com> (74e2fa32)
Ref IDF-4797
  • Loading branch information
david-cermak committed Mar 20, 2022
1 parent 08f1b41 commit 4a2fb78
Show file tree
Hide file tree
Showing 3 changed files with 329 additions and 0 deletions.
50 changes: 50 additions & 0 deletions .github/workflows/ci-linux.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: CI

on: [push, pull_request]

jobs:
build:
strategy:
matrix:
compiler: [gcc, clang]
env:
CC: ${{ matrix.compiler }}
LSAN_OPTIONS: verbosity=1:log_threads=1
WGET_PATH: http://download.savannah.nongnu.org/releases/lwip
CONTRIB: contrib-2.1.0
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- name: Install deps
run: |
sudo apt-get install check ninja-build doxygen
wget --no-verbose ${WGET_PATH}/${CONTRIB}.zip
unzip -oq ${CONTRIB}.zip
patch -s -p0 < test/${CONTRIB}.patch
- name: Build unit tests with make
run: LWIPDIR=../../../../src make -C ${CONTRIB}/ports/unix/check
- name: Run unit tests
run: LWIPDIR=../../../../src make -C ${CONTRIB}/ports/unix/check check

- name: Run cmake
run: mkdir build && cd build && cmake .. -G Ninja
- name: Build with cmake
run: cd build && cmake --build .
- name: Build docs with cmake
run: cd build && cmake --build . --target lwipdocs

- name: Validate combinations of options
run: |
cp ${CONTRIB}/examples/example_app/lwipcfg.h.example ${CONTRIB}/examples/example_app/lwipcfg.h
cd ${CONTRIB}/ports/unix/example_app
export CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX"
export LWIPDIR=../../../../src/
chmod +x iteropts.sh && ./iteropts.sh
- name: Build and run unit tests with cmake
run: |
cd ${CONTRIB}/ports/unix/check
mkdir build && cd build && cmake -DLWIP_DIR=`pwd`/../../../../.. .. -G Ninja
cmake --build . && ./lwip_unittests
98 changes: 98 additions & 0 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
stages:
- host_test
- deploy

image: ${CI_DOCKER_REGISTRY}/esp-env-v5.0:2

variables:
# tag in lwip-contrib repo, which supports our esp-lwip branch (and it's cherry-picked commits from release branches)
LWIP_CONTRIB_TAG: STABLE-2_1_0_RELEASE
# test timeout is seconds
TEST_TIMEOUT: 200
CONTRIB: contrib-2.1.0
CMAKE_SH: cmake-3.22.3-linux-x86_64.sh

before_script:
# Use CI Tools
- curl -sSL ${CIT_LOADER_URL} | sh
- source citools/import_functions

.get_cmake: &get_cmake |
wget -q https://github.com/Kitware/CMake/releases/download/v3.22.3/${CMAKE_SH}
mkdir -p /opt/cmake && sh ${CMAKE_SH} --prefix=/opt/cmake --skip-license
export PATH=/opt/cmake/bin:$PATH

.get_contrib: &get_contrib |
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo -n $GITLAB_KEY > ~/.ssh/id_rsa_base64
base64 --decode --ignore-garbage ~/.ssh/id_rsa_base64 > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
echo -e "Host ${GITLAB_HOSTNAME}\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
git clone "${LWIP_CONTRIB_MIRROR}" ${CONTRIB} && cd ${CONTRIB} && git checkout tags/${LWIP_CONTRIB_TAG}
cd .. && sed -i $'s/\r$//' test/contrib-2.1.0.patch && patch -s -p0 < test/${CONTRIB}.patch

run_unittests:
stage: host_test
tags:
- host_test
dependencies: []
script:
- *get_contrib
- LWIPDIR=../../../../src make -C ${CONTRIB}/ports/unix/check check

run_unittests_cmake:
stage: host_test
tags:
- host_test
script:
- *get_contrib
- *get_cmake
- cd ${CONTRIB}/ports/unix/check
- mkdir build && cd build && cmake -DLWIP_DIR=`pwd`/../../../../.. .. -G Ninja
- cmake --build . && ./lwip_unittests

build_all:
stage: host_test
tags:
- host_test
script:
- *get_cmake
- mkdir build && cd build && cmake .. -G Ninja
- cmake --build .
- cmake --build . --target lwipdocs

validate_opts:
stage: host_test
tags:
- host_test
script:
- *get_contrib
- cp ${CONTRIB}/examples/example_app/lwipcfg.h.example ${CONTRIB}/examples/example_app/lwipcfg.h
- cd ${CONTRIB}/ports/unix/example_app
- export CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX"
- export LWIPDIR=../../../../src/
- chmod +x iteropts.sh && ./iteropts.sh


.add_gh_key_remote: &add_gh_key_remote |
command -v ssh-agent >/dev/null || exit 1
eval $(ssh-agent -s)
printf '%s\n' "${GH_PUSH_KEY}" | tr -d '\r' | ssh-add - > /dev/null
mkdir -p ~/.ssh && chmod 700 ~/.ssh
[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config || ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
git remote remove github || true
git remote add github ${GH_PUSH_REPO}

push_master_to_github:
stage: deploy
only:
- 2.1.2-esp
when: on_success
variables:
GIT_STRATEGY: clone
script:
- *add_gh_key_remote
- "[ -n \"${CI_COMMIT_TAG:-}\" ] && git push github ${CI_COMMIT_TAG}"
- "[ -z \"${CI_COMMIT_TAG:-}\" ] && git push github ${CI_COMMIT_SHA}:refs/heads/${CI_COMMIT_REF_NAME}"

181 changes: 181 additions & 0 deletions test/contrib-2.1.0.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
diff -ruN contrib-2.1.0/examples/example_app/test_configs/opt_no_tcp_dualstack.h contrib-2.1.0-P/examples/example_app/test_configs/opt_no_tcp_dualstack.h
--- contrib-2.1.0/examples/example_app/test_configs/opt_no_tcp_dualstack.h 2018-09-12 22:16:02.000000000 +0200
+++ contrib-2.1.0-P/examples/example_app/test_configs/opt_no_tcp_dualstack.h 2022-03-19 15:07:57.455415829 +0100
@@ -1,4 +1,4 @@
#include "test_configs/opt_dualstack.h"

#undef LWIP_TCP
-#define LWIP_TCP 0
\ No newline at end of file
+#define LWIP_TCP 0
diff -ruN contrib-2.1.0/examples/example_app/test_configs/opt_no_tcp_ipv4only.h contrib-2.1.0-P/examples/example_app/test_configs/opt_no_tcp_ipv4only.h
--- contrib-2.1.0/examples/example_app/test_configs/opt_no_tcp_ipv4only.h 2018-09-12 22:16:02.000000000 +0200
+++ contrib-2.1.0-P/examples/example_app/test_configs/opt_no_tcp_ipv4only.h 2022-03-19 15:08:27.446964821 +0100
@@ -1,4 +1,4 @@
#include "test_configs/opt_ipv4only.h"

#undef LWIP_TCP
-#define LWIP_TCP 0
\ No newline at end of file
+#define LWIP_TCP 0
diff -ruN contrib-2.1.0/examples/example_app/test_configs/opt_no_tcp_ipv6only.h contrib-2.1.0-P/examples/example_app/test_configs/opt_no_tcp_ipv6only.h
--- contrib-2.1.0/examples/example_app/test_configs/opt_no_tcp_ipv6only.h 2018-09-12 22:16:02.000000000 +0200
+++ contrib-2.1.0-P/examples/example_app/test_configs/opt_no_tcp_ipv6only.h 2022-03-19 15:08:36.622826844 +0100
@@ -1,4 +1,4 @@
#include "test_configs/opt_ipv6only.h"

#undef LWIP_TCP
-#define LWIP_TCP 0
\ No newline at end of file
+#define LWIP_TCP 0
diff -ruN contrib-2.1.0/examples/example_app/test_configs/opt_no_udp_dualstack.h contrib-2.1.0-P/examples/example_app/test_configs/opt_no_udp_dualstack.h
--- contrib-2.1.0/examples/example_app/test_configs/opt_no_udp_dualstack.h 2018-09-12 22:16:02.000000000 +0200
+++ contrib-2.1.0-P/examples/example_app/test_configs/opt_no_udp_dualstack.h 2022-03-19 15:08:43.974716296 +0100
@@ -1,4 +1,4 @@
#include "test_configs/opt_dualstack.h"

#undef LWIP_UDP
-#define LWIP_UDP 0
\ No newline at end of file
+#define LWIP_UDP 0
diff -ruN contrib-2.1.0/examples/example_app/test_configs/opt_no_udp_ipv4only.h contrib-2.1.0-P/examples/example_app/test_configs/opt_no_udp_ipv4only.h
--- contrib-2.1.0/examples/example_app/test_configs/opt_no_udp_ipv4only.h 2018-09-12 22:16:02.000000000 +0200
+++ contrib-2.1.0-P/examples/example_app/test_configs/opt_no_udp_ipv4only.h 2022-03-19 15:08:48.590646888 +0100
@@ -1,4 +1,4 @@
#include "test_configs/opt_ipv4only.h"

#undef LWIP_UDP
-#define LWIP_UDP 0
\ No newline at end of file
+#define LWIP_UDP 0
diff -ruN contrib-2.1.0/examples/example_app/test_configs/opt_no_udp_ipv6only.h contrib-2.1.0-P/examples/example_app/test_configs/opt_no_udp_ipv6only.h
--- contrib-2.1.0/examples/example_app/test_configs/opt_no_udp_ipv6only.h 2018-09-12 22:16:02.000000000 +0200
+++ contrib-2.1.0-P/examples/example_app/test_configs/opt_no_udp_ipv6only.h 2022-03-19 15:08:52.490588248 +0100
@@ -1,4 +1,4 @@
#include "test_configs/opt_ipv6only.h"

#undef LWIP_UDP
-#define LWIP_UDP 0
\ No newline at end of file
+#define LWIP_UDP 0
diff -ruN contrib-2.1.0/ports/CMakeCommon.cmake contrib-2.1.0-P/ports/CMakeCommon.cmake
--- contrib-2.1.0/ports/CMakeCommon.cmake 2018-09-04 22:54:08.000000000 +0200
+++ contrib-2.1.0-P/ports/CMakeCommon.cmake 2022-03-19 15:03:40.651279436 +0100
@@ -73,7 +73,6 @@
-fsanitize=undefined
-fno-sanitize=alignment
-fstack-protector
- -fstack-check
)
set(LWIP_SANITIZER_LIBS asan ubsan)
endif()
diff -ruN contrib-2.1.0/ports/unix/check/CMakeLists.txt contrib-2.1.0-P/ports/unix/check/CMakeLists.txt
--- contrib-2.1.0/ports/unix/check/CMakeLists.txt 2018-09-04 22:54:08.000000000 +0200
+++ contrib-2.1.0-P/ports/unix/check/CMakeLists.txt 2022-03-19 15:03:40.651279436 +0100
@@ -7,14 +7,12 @@
endif()

set(LWIP_CONTRIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
-set(LWIP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../lwip)

set(LWIP_USE_SANITIZERS true)
include(${LWIP_CONTRIB_DIR}/ports/CMakeCommon.cmake)

if(CMAKE_C_COMPILER_ID STREQUAL Clang)
# check.h causes 'error: token pasting of ',' and __VA_ARGS__ is a GNU extension' with clang 9.0.0
- list(LWIP_COMPILER_FLAGS APPEND -Wno-gnu-zero-variadic-macro-arguments)
endif()

set (LWIP_DEFINITIONS -DLWIP_DEBUG -DLWIP_NOASSERT_ON_ERROR)
diff -ruN contrib-2.1.0/ports/unix/example_app/iteropts.sh contrib-2.1.0-P/ports/unix/example_app/iteropts.sh
--- contrib-2.1.0/ports/unix/example_app/iteropts.sh 2018-09-12 22:16:02.000000000 +0200
+++ contrib-2.1.0-P/ports/unix/example_app/iteropts.sh 2022-03-19 15:03:40.651279436 +0100
@@ -1,24 +1,34 @@
-#!/bin/bash
-
-LOGFILE=iteropts.log
-EXAPPDIR=../../../examples/example_app
-
-pushd `dirname "$0"`
-pwd
-echo Starting Iteropts run >> $LOGFILE
-for f in $EXAPPDIR/test_configs/*.h
-do
- echo Cleaning...
- make clean
- BUILDLOG=$(basename "$f" ".h").log
- echo testing $f
- echo testing $f >> $LOGFILE
- rm $EXAPPDIR/lwipopts_test.h
- # cat the file to update its timestamp
- cat $f > $EXAPPDIR/lwipopts_test.h
- make TESTFLAGS=-DLWIP_OPTTEST_FILE -j 8 &> $BUILDLOG 2>&1 || echo file $f failed >> $LOGFILE
- echo test $f done >> $LOGFILE
-done
-echo done, cleaning
-make clean
-popd
+#!/bin/bash
+
+LOGFILE=iteropts.log
+EXAPPDIR=../../../examples/example_app
+RETVAL=0
+
+pushd `dirname "$0"`
+pwd
+echo Starting Iteropts run >> $LOGFILE
+for f in $EXAPPDIR/test_configs/*.h
+do
+ echo Cleaning...
+ make clean > /dev/null
+ BUILDLOG=$(basename "$f" ".h").log
+ echo testing $f
+ echo testing $f >> $LOGFILE
+ rm -f $EXAPPDIR/lwipopts_test.h
+ # cat the file to update its timestamp
+ cat $f > $EXAPPDIR/lwipopts_test.h
+ make TESTFLAGS="-DLWIP_OPTTEST_FILE -Wno-documentation" -j 4 1> $BUILDLOG 2>&1
+ ERR=$?
+ if [ $ERR != 0 ]; then
+ cat $BUILDLOG
+ echo file $f failed with $ERR >> $LOGFILE
+ echo ++++++++ $f FAILED +++++++
+ RETVAL=1
+ fi
+ echo test $f done >> $LOGFILE
+done
+echo done, cleaning
+make clean > /dev/null
+popd
+echo Exit value: $RETVAL
+exit $RETVAL
diff -ruN contrib-2.1.0/ports/unix/port/include/arch/sys_arch.h contrib-2.1.0-P/ports/unix/port/include/arch/sys_arch.h
--- contrib-2.1.0/ports/unix/port/include/arch/sys_arch.h 2018-07-12 21:24:16.000000000 +0200
+++ contrib-2.1.0-P/ports/unix/port/include/arch/sys_arch.h 2022-03-19 15:05:59.193194629 +0100
@@ -59,5 +59,8 @@
struct sys_thread;
typedef struct sys_thread * sys_thread_t;

+#define LWIP_EXAMPLE_APP_ABORT() lwip_unix_keypressed()
+int lwip_unix_keypressed(void);
+
#endif /* LWIP_ARCH_SYS_ARCH_H */

diff -ruN contrib-2.1.0/ports/unix/port/sys_arch.c contrib-2.1.0-P/ports/unix/port/sys_arch.c
--- contrib-2.1.0/ports/unix/port/sys_arch.c 2018-09-04 22:02:58.000000000 +0200
+++ contrib-2.1.0-P/ports/unix/port/sys_arch.c 2022-03-19 15:07:13.416078142 +0100
@@ -717,3 +717,14 @@
}
}
#endif /* SYS_LIGHTWEIGHT_PROT */
+
+/* get keyboard state to terminate the debug app by using select */
+int
+lwip_unix_keypressed(void)
+{
+ struct timeval tv = { 0L, 0L };
+ fd_set fds;
+ FD_ZERO(&fds);
+ FD_SET(0, &fds);
+ return select(1, &fds, NULL, NULL, &tv);
+}

0 comments on commit 4a2fb78

Please sign in to comment.