name: Run tests on: workflow_dispatch: pull_request: push: branches: - master jobs: Test-in-Qemu: #if: ${{ false }} # disable for now runs-on: ubuntu-24.04 name: Test in Qemu (${{ matrix.distro }}) strategy: fail-fast: false matrix: include: - distro: Ubuntu-24.04 image: https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img untar: false format: qcow2 - distro: Ubuntu-22.04 image: https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img untar: false format: qcow2 - distro: Ubuntu-20.04 image: https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img untar: false format: qcow2 - distro: Debian13 image: https://cloud.debian.org/images/cloud/trixie/daily/latest/debian-13-generic-amd64-daily.tar.xz untar: true format: raw - distro: Debian12 image: https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.tar.xz untar: true format: raw - distro: Debian11 image: https://cdimage.debian.org/images/cloud/bullseye/latest/debian-11-generic-amd64.tar.xz untar: true format: raw steps: - name: Check out repository code uses: actions/checkout@v4 with: fetch-depth: 0 path: "accel-ppp" - name: Install qemu and required tools run: > sudo apt update && NEEDRESTART_SUSPEND=1 DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true sudo -E apt -y install qemu-system-x86 qemu-utils cloud-image-utils cpu-checker cloud-image-utils wget openssh-client screen - name: Check kvm support run: sudo kvm-ok - name: Prepare cloud-init image disk run: | ssh-keygen -t ed25519 -q -N "" -f ssh-key echo "instance-id: $(uuidgen || echo i-abcdefg)" > init-meta echo "#cloud-config" > init-data echo "package_update: true" >> init-data echo "package_upgrade: true" >> init-data echo "package_reboot_if_required: false" >> init-data echo "users:" >> init-data echo " - default" >> init-data echo " - name: user" >> init-data echo " shell: /bin/bash" >> init-data echo " sudo: ALL=(ALL) NOPASSWD:ALL" >> init-data echo " ssh_authorized_keys:" >> init-data echo " - "`cat ssh-key.pub` >> init-data echo "power_state:">> init-data echo " mode: poweroff">> init-data cat init-data cloud-localds init.img init-data init-meta - name: Download, unpack and resize target OS cloud image if: ${{ matrix.untar }} run: | wget -nv ${{ matrix.image }} mkdir img tar -xf *.tar.xz -C img qemu-img resize -f ${{ matrix.format }} img/`ls -1 img` +2G - name: Download and resize target OS cloud image if: ${{ !matrix.untar }} run: | mkdir img wget -nv ${{ matrix.image }} -O img/image qemu-img resize -f ${{ matrix.format }} img/`ls -1 img` +2G - name: Run target OS first time (for cloud-init actions) run: sudo qemu-system-x86_64 -enable-kvm -cpu host -m 4096 -nographic -drive format=${{ matrix.format }},file=img/`ls -1 img` -drive format=raw,file=init.img - name: Run target OS run: sudo screen -dmS qemu qemu-system-x86_64 -enable-kvm -cpu host -net nic -net user,hostfwd=tcp::2222-:22 -m 4096 -nographic -drive format=${{ matrix.format }},file=img/`ls -1 img` - name: Check that target OS is running run: | sleep 1 sudo screen -ls - name: Wait for ssh connection timeout-minutes: 30 run: > while ! ssh -o StrictHostKeyChecking=accept-new -p2222 -o ConnectTimeout=5 -i ssh-key user@localhost "exit 0"; do echo "Trying to establish ssh connection"; sleep 5; done; cat ~/.ssh/known_hosts - name: Display free space, current dir, kernel version and test sudo run: | ssh -i ssh-key -p2222 user@localhost "df -h" ssh -i ssh-key -p2222 user@localhost "pwd" ssh -i ssh-key -p2222 user@localhost "uname -a" ssh -i ssh-key -p2222 user@localhost "sudo cat /etc/passwd" - name: Install build tools (on target OS) run: > ssh -i ssh-key -p2222 user@localhost "sudo apt -y install git build-essential cmake gcc linux-headers-\`uname -r\` libpcre3-dev libssl-dev liblua5.1-0-dev kmod python3-pip libxml2-dev libxslt1-dev zlib1g-dev iproute2 ppp pppoe isc-dhcp-client timelimit && (sudo pip3 install pytest pytest-dependency pytest-order || sudo pip3 install --break-system-packages pytest pytest-dependency pytest-order)" - name: Copy source code to target OS run: | tar -Jcf accel-ppp.tar.xz accel-ppp scp -i ssh-key -P2222 accel-ppp.tar.xz user@localhost: ssh -i ssh-key -p2222 user@localhost "tar -xf accel-ppp.tar.xz" - name: Build accel-ppp run: > ssh -i ssh-key -p2222 user@localhost "cd accel-ppp && mkdir build && cd build && cmake -DBUILD_IPOE_DRIVER=TRUE -DBUILD_VLAN_MON_DRIVER=TRUE -DCMAKE_INSTALL_PREFIX=/usr -DKDIR=/usr/src/linux-headers-\`uname -r\` -DLUA=TRUE -DSHAPER=TRUE -DRADIUS=TRUE .. && make && sudo make install" - name: Run tests (not related to ipoe and vlan_mon drivers) timeout-minutes: 5 run: > ssh -i ssh-key -p2222 user@localhost "cd accel-ppp/tests && sudo python3 -m pytest -Wall --order-dependencies -v -m \"not ipoe_driver and not vlan_mon_driver\"" - name: Display processes and dmesg after tests if: ${{ always() }} run: > ssh -i ssh-key -p2222 user@localhost "ps aux | grep accel- && sudo dmesg" - name: Insert ipoe kernel module run: > ssh -i ssh-key -p2222 user@localhost "cd accel-ppp && sudo insmod build/drivers/ipoe/driver/ipoe.ko && lsmod | grep ipoe " - name: Run tests (not related to vlan_mon drivers) timeout-minutes: 5 if: ${{ always() }} run: > ssh -i ssh-key -p2222 user@localhost "cd accel-ppp/tests && sudo python3 -m pytest -Wall --order-dependencies -v -m \"not vlan_mon_driver\"" - name: Display processes and dmesg after tests if: ${{ always() }} run: > ssh -i ssh-key -p2222 user@localhost "ps aux | grep accel- && sudo dmesg" - name: Insert vlan_mon kernel module run: > ssh -i ssh-key -p2222 user@localhost "cd accel-ppp && sudo insmod build/drivers/vlan_mon/driver/vlan_mon.ko && lsmod | grep vlan_mon" - name: Run tests (all) timeout-minutes: 5 run: > ssh -i ssh-key -p2222 user@localhost "cd accel-ppp/tests && sudo python3 -m pytest -Wall --order-dependencies -v" - name: Display processes and dmesg after tests if: ${{ always() }} run: > ssh -i ssh-key -p2222 user@localhost "ps aux | grep accel- && sudo dmesg" Test-in-Alpine: #if: ${{ false }} # disable for now runs-on: ubuntu-24.04 name: Test in Qemu (Alpine) steps: - name: Check out repository code uses: actions/checkout@v4 with: fetch-depth: 0 path: "accel-ppp" - name: Install qemu and required tools run: > sudo apt update && NEEDRESTART_SUSPEND=1 DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true sudo -E apt -y install qemu-system-x86 qemu-utils cloud-image-utils cpu-checker cloud-image-utils wget openssh-client screen - name: Check kvm support run: sudo kvm-ok - name: Prepare cloud-init image disk run: | ssh-keygen -t ed25519 -q -N "" -f ssh-key echo "instance-id: $(uuidgen || echo i-abcdefg)" > init-meta echo "#cloud-config" > init-data echo "package_update: true" >> init-data echo "package_upgrade: true" >> init-data echo "package_reboot_if_required: false" >> init-data echo "users:" >> init-data echo " - default" >> init-data echo " - name: alpine" >> init-data echo " shell: /bin/bash" >> init-data echo " ssh_authorized_keys:" >> init-data echo " - "`cat ssh-key.pub` >> init-data echo "power_state:">> init-data echo " mode: poweroff">> init-data cat init-data cloud-localds init.img init-data init-meta - name: Download and resize target OS cloud image run: | mkdir img # we need to use metal image because virt image doesn't provide pppoe driver (https://gitlab.alpinelinux.org/alpine/aports/-/issues/13739) wget -nv https://dl-cdn.alpinelinux.org/alpine/latest-stable/releases/cloud/nocloud_alpine-3.20.2-x86_64-bios-cloudinit-metal-r0.qcow2 -O img/image qemu-img resize -f qcow2 img/`ls -1 img` +2G - name: Run target OS first time (for cloud-init actions) run: sudo qemu-system-x86_64 -enable-kvm -cpu host -m 4096 -nographic -drive format=qcow2,file=img/`ls -1 img` -drive format=raw,file=init.img - name: Run target OS run: sudo screen -dmS qemu qemu-system-x86_64 -enable-kvm -cpu host -net nic -net user,hostfwd=tcp::2222-:22 -m 4096 -nographic -drive format=qcow2,file=img/`ls -1 img` - name: Check that target OS is running run: | sleep 1 sudo screen -ls - name: Wait for ssh connection timeout-minutes: 30 run: > while ! ssh -o StrictHostKeyChecking=accept-new -p2222 -o ConnectTimeout=5 -i ssh-key alpine@localhost "exit 0"; do echo "Trying to establish ssh connection"; sleep 5; done; cat ~/.ssh/known_hosts - name: Display free space, current dir, kernel version and test doas run: | ssh -i ssh-key -p2222 alpine@localhost "df -h" ssh -i ssh-key -p2222 alpine@localhost "pwd" ssh -i ssh-key -p2222 alpine@localhost "uname -a" ssh -i ssh-key -p2222 alpine@localhost "doas cat /etc/passwd" - name: Install build tools (on target OS) run: > ssh -i ssh-key -p2222 alpine@localhost "doas apk add --no-cache git cmake make g++ pcre-dev libressl-dev linux-headers libucontext-dev lua5.1-dev linux-lts-dev py3-pip ppp ppp-pppoe && (doas pip3 install pytest pytest-dependency pytest-order || doas pip3 install --break-system-packages pytest pytest-dependency pytest-order)" - name: Copy source code to target OS run: | tar -Jcf accel-ppp.tar.xz accel-ppp scp -i ssh-key -P2222 accel-ppp.tar.xz alpine@localhost: ssh -i ssh-key -p2222 alpine@localhost "tar -xf accel-ppp.tar.xz" - name: Build accel-ppp run: > ssh -i ssh-key -p2222 alpine@localhost "cd accel-ppp && mkdir build && cd build && cmake -DBUILD_IPOE_DRIVER=TRUE -DBUILD_VLAN_MON_DRIVER=TRUE -DCMAKE_INSTALL_PREFIX=/usr -DKDIR=/usr/src/linux-headers-\`uname -r\` -DLUA=TRUE -DSHAPER=TRUE -DRADIUS=TRUE .. && make && doas make install" - name: Run tests (not related to ipoe and vlan_mon drivers) timeout-minutes: 5 run: > ssh -i ssh-key -p2222 alpine@localhost "cd accel-ppp/tests && doas python3 -m pytest -Wall --order-dependencies -v -m \"not ipoe_driver and not vlan_mon_driver\"" - name: Display processes and dmesg after tests if: ${{ always() }} run: > ssh -i ssh-key -p2222 alpine@localhost "ps aux | grep accel- && doas dmesg" - name: Insert ipoe kernel module run: > ssh -i ssh-key -p2222 alpine@localhost "cd accel-ppp && doas insmod build/drivers/ipoe/driver/ipoe.ko && lsmod | grep ipoe " - name: Run tests (not related to vlan_mon drivers) timeout-minutes: 5 if: ${{ always() }} run: > ssh -i ssh-key -p2222 alpine@localhost "cd accel-ppp/tests && doas python3 -m pytest -Wall --order-dependencies -v -m \"not vlan_mon_driver\"" - name: Display processes and dmesg after tests if: ${{ always() }} run: > ssh -i ssh-key -p2222 alpine@localhost "ps aux | grep accel- && doas dmesg" - name: Insert vlan_mon kernel module run: > ssh -i ssh-key -p2222 alpine@localhost "cd accel-ppp && doas insmod build/drivers/vlan_mon/driver/vlan_mon.ko && lsmod | grep vlan_mon" - name: Run tests (all) timeout-minutes: 5 run: > ssh -i ssh-key -p2222 alpine@localhost "cd accel-ppp/tests && doas python3 -m pytest -Wall --order-dependencies -v" - name: Display processes and dmesg after tests if: ${{ always() }} run: > ssh -i ssh-key -p2222 alpine@localhost "ps aux | grep accel- && doas dmesg" Test-in-GH: #if: ${{ false }} # disable for now strategy: fail-fast: false matrix: distro: ["ubuntu-24.04", "ubuntu-22.04", "ubuntu-20.04"] runs-on: ${{ matrix.distro }} steps: - name: Install build tools (using apt) run: > sudo apt update && NEEDRESTART_SUSPEND=1 DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true sudo -E apt -y install git build-essential cmake gcc linux-headers-`uname -r` libpcre3-dev libssl-dev liblua5.1-0-dev kmod python3-pip iproute2 ppp pppoe isc-dhcp-client - name: Install testing tools (using pip) run: > sudo pip3 install pytest pytest-dependency pytest-order || sudo pip3 install --break-system-packages pytest pytest-dependency pytest-order - name: Check out repository code uses: actions/checkout@v4 with: fetch-depth: 0 - name: mkdir build run: mkdir build - name: cmake working-directory: ./build run: > cmake -DBUILD_IPOE_DRIVER=TRUE -DBUILD_VLAN_MON_DRIVER=TRUE -DCMAKE_INSTALL_PREFIX=/usr -DKDIR=/usr/src/linux-headers-`uname -r` -DLUA=TRUE -DSHAPER=TRUE -DRADIUS=TRUE .. - name: make && make install working-directory: ./build run: make && sudo make install - name: Insert and check kernel modules (ipoe and vlan-mon) # if: ${{ false }} run: | sudo insmod build/drivers/vlan_mon/driver/vlan_mon.ko sudo insmod build/drivers/ipoe/driver/ipoe.ko lsmod | grep ipoe lsmod | grep vlan_mon - name: Run tests timeout-minutes: 5 working-directory: ./tests run: sudo python3 -m pytest -Wall --order-dependencies -v Test-in-GH-Coverage: #if: ${{ false }} # disable for now strategy: fail-fast: false matrix: distro: ["ubuntu-24.04", "ubuntu-22.04", "ubuntu-20.04"] runs-on: ${{ matrix.distro }} steps: - name: Install build tools (using apt) run: > sudo apt update && NEEDRESTART_SUSPEND=1 DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true sudo -E apt -y install git build-essential cmake gcc linux-headers-`uname -r` libpcre3-dev libssl-dev liblua5.1-0-dev kmod python3-pip iproute2 ppp pppoe isc-dhcp-client - name: Install testing tools (using pip) run: > sudo pip3 install pytest pytest-dependency pytest-order gcovr || sudo pip3 install --break-system-packages pytest pytest-dependency pytest-order gcovr - name: Check out repository code uses: actions/checkout@v4 with: fetch-depth: 0 - name: mkdir build run: mkdir build - name: cmake (with coverage) working-directory: ./build run: > cmake -DBUILD_IPOE_DRIVER=TRUE -DBUILD_VLAN_MON_DRIVER=TRUE -DCMAKE_INSTALL_PREFIX=/usr -DKDIR=/usr/src/linux-headers-`uname -r` -DLUA=TRUE -DSHAPER=TRUE -DRADIUS=TRUE -DCMAKE_C_FLAGS="--coverage -O0" .. - name: make && make install working-directory: ./build run: make && sudo make install - name: Insert and check kernel modules (ipoe and vlan-mon) # if: ${{ false }} run: | sudo insmod build/drivers/vlan_mon/driver/vlan_mon.ko sudo insmod build/drivers/ipoe/driver/ipoe.ko lsmod | grep ipoe lsmod | grep vlan_mon - name: Run tests (for coverage report) (fail is ok) timeout-minutes: 5 working-directory: ./tests run: sudo python3 -m pytest -Wall --order-dependencies -v || exit 0 - name: Generate coverage reports (default(txt), csv, html) run: | mkdir -p tests/report gcovr --config=tests/gcovr.conf --output=tests/report/accel-ppp.txt gcovr --config=tests/gcovr.conf --csv --output=tests/report/accel-ppp.csv gcovr --config=tests/gcovr.conf --html --html-details --output=tests/report/accel-ppp.html - name: Show default coverage report run: cat tests/report/accel-ppp.txt - name: Upload coverage report # if: ${{ false }} uses: actions/upload-artifact@v4 with: name: coverage-report-on-${{ matrix.distro }} path: tests/report/ if-no-files-found: error