Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 141 additions & 11 deletions .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:

jobs:
Test-in-Qemu:
#if: ${{ false }} # disable for now
if: ${{ false }} # disable for now
runs-on: ubuntu-24.04
name: Test in Qemu (${{ matrix.distro }})
strategy:
Expand Down Expand Up @@ -120,7 +120,7 @@ jobs:
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 || sudo pip3 install --break-system-packages pytest pytest-dependency)"
(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
Expand All @@ -139,7 +139,7 @@ jobs:
timeout-minutes: 5
run: >
ssh -i ssh-key -p2222 user@localhost "cd accel-ppp/tests &&
sudo python3 -m pytest -Wall -v -m \"not ipoe_driver and not vlan_mon_driver\""
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: >
Expand All @@ -157,7 +157,7 @@ jobs:
if: ${{ always() }}
run: >
ssh -i ssh-key -p2222 user@localhost "cd accel-ppp/tests &&
sudo python3 -m pytest -Wall -v -m \"not vlan_mon_driver\""
sudo python3 -m pytest -Wall --order-dependencies -v -m \"not vlan_mon_driver\""
- name: Display processes and dmesg after tests
if: ${{ always() }}
run: >
Expand All @@ -174,15 +174,145 @@ jobs:
timeout-minutes: 5
run: >
ssh -i ssh-key -p2222 user@localhost "cd accel-ppp/tests &&
sudo python3 -m pytest -Wall -v"
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-GH:
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:
Expand All @@ -200,7 +330,7 @@ jobs:

- name: Install testing tools (using pip)
run: >
sudo pip3 install pytest pytest-dependency || sudo pip3 install --break-system-packages pytest pytest-dependency
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
Expand Down Expand Up @@ -232,10 +362,10 @@ jobs:
- name: Run tests
timeout-minutes: 5
working-directory: ./tests
run: sudo python3 -m pytest -Wall -v
run: sudo python3 -m pytest -Wall --order-dependencies -v

Test-in-GH-Coverage:
#if: ${{ false }} # disable for now
if: ${{ false }} # disable for now
strategy:
fail-fast: false
matrix:
Expand All @@ -253,7 +383,7 @@ jobs:

- name: Install testing tools (using pip)
run: >
sudo pip3 install pytest pytest-dependency gcovr || sudo pip3 install --break-system-packages pytest pytest-dependency gcovr
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
Expand Down Expand Up @@ -286,7 +416,7 @@ jobs:
- name: Run tests (for coverage report) (fail is ok)
timeout-minutes: 5
working-directory: ./tests
run: sudo python3 -m pytest -Wall -v || exit 0
run: sudo python3 -m pytest -Wall --order-dependencies -v || exit 0

- name: Generate coverage reports (default(txt), csv, html)
run: |
Expand Down
2 changes: 2 additions & 0 deletions accel-pppd/ctrl/pppoe/pppoe.c
Original file line number Diff line number Diff line change
Expand Up @@ -1394,6 +1394,8 @@ static void pppoe_add_interface_re(const char *opt, void *cli)
re = pcre_compile2(pattern, 0, NULL, &pcre_err, &pcre_offset, NULL);

if (!re) {
if (cli)
cli_sendv(cli, "pppoe: %s at %i\r\n", pcre_err, pcre_offset);
log_error("pppoe: %s at %i\r\n", pcre_err, pcre_offset);
return;
}
Expand Down
8 changes: 4 additions & 4 deletions tests/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ These tests are done for Ubuntu and Debian distros. Please use latest stable Deb

Install pytest

Using apt: `sudo apt install python3-pytest python3-pytest-dependency` or using pip: `sudo pip3 install pytest pytest-dependency`.
Using apt: `sudo apt install python3-pytest python3-pytest-dependency python3-pytest-order` or using pip: `sudo pip3 install pytest pytest-dependency pytest-order`.

pytest-dependency version must be >= 0.5 (with 'scope' support)

Expand Down Expand Up @@ -43,13 +43,13 @@ sudo insmod build/drivers/ipoe/driver/ipoe.ko

```bash
# from this dir (tests)
sudo python3 -m pytest -Wall -v
sudo python3 -m pytest -Wall --order-dependencies -v
```

To skip tests related to ipoe and vlan_mon kernel modules:
```bash
# from this dir (tests)
sudo python3 -m pytest -Wall -v -m "not ipoe_driver and not vlan_mon_driver"
sudo python3 -m pytest -Wall --order-dependencies -v -m "not ipoe_driver and not vlan_mon_driver"
```

## Preparations (for coverage report)
Expand Down Expand Up @@ -83,7 +83,7 @@ Then insert kernel modules (ipoe.ko and vlan-mon.ko)

```bash
# from root dir (parent for this dir)
sudo python3 -m pytest -Wall tests -v # execute tests to collect coverage data
sudo python3 -m pytest -Wall --order-dependencies tests -v # execute tests to collect coverage data
mkdir tests/report
gcovr --config=tests/gcovr.conf # default report
gcovr --config=tests/gcovr.conf --csv # csv report
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ def accel_pppd_config():
log_tcp
#log_pgsql

connlimit
pptp
l2tp
sstp
radius
pppoe
ipoe

Expand All @@ -30,16 +32,14 @@ def accel_pppd_config():
auth_chap_md5
auth_pap

radius
chap-secrets

ippool

pppd_compat
shaper
#net-snmp
logwtmp
connlimit
#logwtmp

ipv6_nd
ipv6_dhcp
Expand Down
65 changes: 65 additions & 0 deletions tests/accel-pppd/general/test_pcre_negative_cases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import pytest
from common import process


@pytest.fixture()
def accel_pppd_config():
return """
[modules]
radius
pppoe

[core]
log-error=/dev/stderr

[log]
log-debug=/dev/stdout
log-file=/dev/stdout
log-emerg=/dev/stderr
level=5

[cli]
tcp=127.0.0.1:2001

[radius]

[pppoe]
"""


# test pcre-related negative cases
def test_pcre_negative_cases(accel_pppd_instance, accel_cmd):

# test that accel-pppd started successfully
assert accel_pppd_instance

(exit_sh_sess, out_sh_sess, err_sh_sess) = process.run([accel_cmd, "show sessions match username 00("])
# test that 'show sessions' with invalid regexp reports the issue and error position
assert (
exit_sh_sess == 0
and len(out_sh_sess) > 0
and err_sh_sess == ""
and "match: " in out_sh_sess
and "at 3" in out_sh_sess
)


(exit_iface_add, out_iface_add, err_iface_add) = process.run([accel_cmd, "pppoe interface add re:000("])
# test that 'pppoe interface add' with invalid regexp reports the issue and error position
assert (
exit_iface_add == 0
and len(out_iface_add) > 0
and err_iface_add == ""
and "pppoe: " in out_iface_add
and "at 4" in out_iface_add
)

(exit_term, out_term, err_term) = process.run([accel_cmd, "terminate match username 00("])
# test that 'terminate' with invalid regexp reports the issue and error position
assert (
exit_term == 0
and len(out_term) > 0
and err_term == ""
and "match: " in out_term
and "at 3" in out_term
)
14 changes: 11 additions & 3 deletions tests/accel-pppd/ipoe/dhcpv4/test_ipoe_shared_session_wo_auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ def accel_pppd_config(veth_pair_netns):
return (
"""
[modules]
pppoe
connlimit
radius
ipoe
ippool

Expand All @@ -20,16 +21,23 @@ def accel_pppd_config(veth_pair_netns):
[cli]
tcp=127.0.0.1:2001

[core]
log-error=/dev/stderr

[log]
log-debug=/dev/stdout
log-file=/dev/stdout
log-emerg=/dev/stderr
level=5

[radius]

[ipoe]
noauth=1
shared=1
gw-ip-address=192.0.2.1/24
interface="""
+ veth_pair_netns["veth_a"]
interface=re:."""
+ veth_pair_netns["veth_a"][1:]
)


Expand Down
Loading