summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build-and-run.yml39
-rw-r--r--.github/workflows/run-tests.yml154
-rw-r--r--accel-pppd/CMakeLists.txt13
-rw-r--r--accel-pppd/accel-ppp.conf6
-rw-r--r--accel-pppd/ctrl/pppoe/pppoe.c2
-rw-r--r--accel-pppd/ctrl/sstp/sstp.c12
-rw-r--r--accel-pppd/extra/logwtmp.c7
-rw-r--r--accel-pppd/libnetlink/iputils.c3
-rw-r--r--accel-pppd/session.c8
-rw-r--r--tests/README.md8
-rw-r--r--tests/accel-pppd/general/test_basic.py (renamed from tests/accel-pppd/test_basic.py)4
-rw-r--r--tests/accel-pppd/general/test_pcre_negative_cases.py65
-rw-r--r--tests/accel-pppd/ipoe/dhcpv4/test_ipoe_shared_session_wo_auth.py14
-rw-r--r--tests/accel-pppd/pppoe/conftest.py17
-rw-r--r--tests/accel-pppd/pppoe/test_pppoe_disc.py8
-rw-r--r--tests/accel-pppd/pppoe/test_pppoe_pado_delay.py8
-rw-r--r--tests/accel-pppd/pppoe/test_pppoe_session_chap_secrets.py103
-rw-r--r--tests/accel-pppd/pppoe/test_pppoe_session_wo_auth.py11
-rw-r--r--tests/accel-pppd/pppoe/test_pppoe_vlan_mon.py8
-rw-r--r--tests/conftest.py18
20 files changed, 474 insertions, 34 deletions
diff --git a/.github/workflows/build-and-run.yml b/.github/workflows/build-and-run.yml
index fb6dd798..591d8cbf 100644
--- a/.github/workflows/build-and-run.yml
+++ b/.github/workflows/build-and-run.yml
@@ -248,4 +248,41 @@ jobs:
run: sleep 1
- name: Check accel-ppp stat
run: accel-cmd show stat
- \ No newline at end of file
+
+ Build-in-Container-Gentoo:
+ runs-on: ubuntu-24.04
+ container:
+ image: gentoo/stage3
+ steps:
+ - name: Prepare gentoo
+ run: getuto && emerge --sync
+ - name: Install build tools
+ run: |
+ emerge -g --autounmask-write sys-kernel/gentoo-kernel-bin || (etc-update --verbose --automode -5 && emerge -g sys-kernel/gentoo-kernel-bin)
+ emerge -g dev-vcs/git dev-libs/libpcre dev-build/cmake dev-lang/lua:5.1
+ - name: Check out repository code
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: mkdir build
+ run: mkdir build
+ - name: Disable git security warnings
+ run: git config --global --add safe.directory '*'
+ - name: cmake
+ working-directory: ./build
+ run: >
+ cmake -DBUILD_IPOE_DRIVER=TRUE -DBUILD_VLAN_MON_DRIVER=TRUE -DCMAKE_INSTALL_PREFIX=/usr
+ -DCMAKE_INSTALL_SYSCONFDIR=/etc
+ -DKDIR=/usr/src/linux
+ -DLUA=TRUE -DSHAPER=TRUE -DRADIUS=TRUE ..
+ - name: make and install
+ working-directory: ./build
+ run: make && make install
+ - name: Copy default config
+ run: cp accel-pppd/accel-ppp.conf /etc/accel-ppp.conf
+ - name: Start accel-ppp with default config
+ run: accel-pppd -d -c /etc/accel-ppp.conf
+ - name: Sleep for 1 sec
+ run: sleep 1
+ - name: Check accel-ppp stat
+ run: accel-cmd show stat
diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml
index 3f8016a8..849ff6d6 100644
--- a/.github/workflows/run-tests.yml
+++ b/.github/workflows/run-tests.yml
@@ -56,8 +56,8 @@ jobs:
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 (fail is ok)
- run: sudo kvm-ok || exit 0
+ - name: Check kvm support
+ run: sudo kvm-ok
- name: Prepare cloud-init image disk
run: |
ssh-keygen -t ed25519 -q -N "" -f ssh-key
@@ -91,9 +91,9 @@ jobs:
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 -m 4096 -nographic -drive format=${{ matrix.format }},file=img/`ls -1 img` -drive format=raw,file=init.img
+ 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 -net nic -net user,hostfwd=tcp::2222-:22 -m 4096 -nographic -drive format=${{ matrix.format }},file=img/`ls -1 img`
+ 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
@@ -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
@@ -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: >
@@ -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: >
@@ -174,13 +174,143 @@ 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-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:
@@ -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
@@ -232,7 +362,7 @@ 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
@@ -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
@@ -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: |
diff --git a/accel-pppd/CMakeLists.txt b/accel-pppd/CMakeLists.txt
index cd7186ba..496fbdca 100644
--- a/accel-pppd/CMakeLists.txt
+++ b/accel-pppd/CMakeLists.txt
@@ -71,6 +71,19 @@ IF (HAVE_GOOD_IFARP)
ADD_DEFINITIONS(-DHAVE_GOOD_IFARP)
ENDIF (HAVE_GOOD_IFARP)
+INCLUDE (CheckCSourceCompiles)
+CHECK_C_SOURCE_COMPILES("
+#include <utmp.h>
+int main(void)
+{
+ logwtmp(\"\", \"\", \"\");
+ return 0;
+}" HAVE_LOGWTMP)
+
+IF (HAVE_LOGWTMP)
+ ADD_DEFINITIONS(-DHAVE_LOGWTMP)
+ENDIF (HAVE_LOGWTMP)
+
ADD_SUBDIRECTORY(triton)
ADD_SUBDIRECTORY(vlan-mon)
diff --git a/accel-pppd/accel-ppp.conf b/accel-pppd/accel-ppp.conf
index abfd1ac9..99d35c79 100644
--- a/accel-pppd/accel-ppp.conf
+++ b/accel-pppd/accel-ppp.conf
@@ -6,6 +6,9 @@ log_file
connlimit
+radius
+#chap-secrets
+
pptp
l2tp
#sstp
@@ -17,9 +20,6 @@ auth_mschap_v1
auth_chap_md5
auth_pap
-radius
-#chap-secrets
-
ippool
pppd_compat
diff --git a/accel-pppd/ctrl/pppoe/pppoe.c b/accel-pppd/ctrl/pppoe/pppoe.c
index dd623acc..8678db80 100644
--- a/accel-pppd/ctrl/pppoe/pppoe.c
+++ b/accel-pppd/ctrl/pppoe/pppoe.c
@@ -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;
}
diff --git a/accel-pppd/ctrl/sstp/sstp.c b/accel-pppd/ctrl/sstp/sstp.c
index 2e2c4d3b..2a9ddae3 100644
--- a/accel-pppd/ctrl/sstp/sstp.c
+++ b/accel-pppd/ctrl/sstp/sstp.c
@@ -187,6 +187,7 @@ static unsigned int stat_active;
static inline void sstp_queue(struct sstp_conn_t *conn, struct buffer_t *buf);
static int sstp_send(struct sstp_conn_t *conn, struct buffer_t *buf);
static inline void sstp_queue_deferred(struct sstp_conn_t *conn, struct buffer_t *buf);
+static int sstp_write(struct triton_md_handler_t *h);
static int sstp_read_deferred(struct sstp_conn_t *conn);
static int sstp_abort(struct sstp_conn_t *conn, int disconnect);
static void sstp_disconnect(struct sstp_conn_t *conn);
@@ -858,7 +859,7 @@ static int http_send_response(struct sstp_conn_t *conn, char *proto, char *statu
}
}
- return sstp_send(conn, buf);
+ return sstp_send(conn, buf) || sstp_write(&conn->hnd);
}
static int http_recv_request(struct sstp_conn_t *conn, uint8_t *data, int len)
@@ -937,7 +938,7 @@ static int http_handler(struct sstp_conn_t *conn, struct buffer_t *buf)
static const char *table[] = { "\n\r\n", "\r\r\n", NULL };
const char **pptr;
uint8_t *ptr, *end = NULL;
- int n;
+ int n, r;
if (conn->sstp_state != STATE_SERVER_CALL_DISCONNECTED)
return -1;
@@ -963,8 +964,11 @@ static int http_handler(struct sstp_conn_t *conn, struct buffer_t *buf)
} else
n = end - buf->head;
- if (http_recv_request(conn, buf->head, n) < 0)
+ r = http_recv_request(conn, buf->head, n);
+ if (r < 0)
return -1;
+ else if (r > 0)
+ return 1;
buf_pull(buf, n);
conn->sstp_state = STATE_SERVER_CONNECT_REQUEST_PENDING;
@@ -1950,6 +1954,8 @@ static int sstp_read(struct triton_md_handler_t *h)
n = conn->handler(conn, buf);
if (n < 0)
goto drop;
+ else if (n > 0)
+ return 1;
buf_expand_tail(buf, SSTP_MAX_PACKET_SIZE);
}
diff --git a/accel-pppd/extra/logwtmp.c b/accel-pppd/extra/logwtmp.c
index f95b62c4..f66e6403 100644
--- a/accel-pppd/extra/logwtmp.c
+++ b/accel-pppd/extra/logwtmp.c
@@ -14,6 +14,7 @@
#include "memdebug.h"
+#ifdef HAVE_LOGWTMP
static void ev_ses_started(struct ap_session *ses)
{
logwtmp(ses->ifname, ses->username ?: "", ses->ctrl->calling_station_id);
@@ -29,5 +30,11 @@ static void init(void)
triton_event_register_handler(EV_SES_STARTED, (triton_event_func)ev_ses_started);
triton_event_register_handler(EV_SES_FINISHED, (triton_event_func)ev_ses_finished);
}
+#else
+static void init(void)
+{
+ log_warn("logwtmp is not supported on your platfrom, check libc doc\n");
+}
+#endif
DEFINE_INIT(200, init);
diff --git a/accel-pppd/libnetlink/iputils.c b/accel-pppd/libnetlink/iputils.c
index 23325fcd..4bf7fd01 100644
--- a/accel-pppd/libnetlink/iputils.c
+++ b/accel-pppd/libnetlink/iputils.c
@@ -213,7 +213,8 @@ int __export iplink_vlan_add(const char *ifname, int ifindex, int vid)
data = NLMSG_TAIL(&req.n);
addattr_l(&req.n, 4096, IFLA_INFO_DATA, NULL, 0);
- addattr_l(&req.n, 4096, IFLA_VLAN_ID, &vid, 2);
+ uint16_t vid_16b = (uint16_t)vid;
+ addattr_l(&req.n, 4096, IFLA_VLAN_ID, &vid_16b, 2);
data->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)data;
linkinfo->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)linkinfo;
diff --git a/accel-pppd/session.c b/accel-pppd/session.c
index c01417f3..74b39475 100644
--- a/accel-pppd/session.c
+++ b/accel-pppd/session.c
@@ -30,6 +30,14 @@
#define SID_SOURCE_SEQ 0
#define SID_SOURCE_URANDOM 1
+#ifndef __WORDSIZE
+#if defined(__GLIBC__) || defined(__UCLIBC__)
+#include <bits/wordsize.h>
+#else
+#include <bits/reg.h>
+#endif
+#endif
+
static int conf_sid_ucase;
static int conf_single_session = -1;
static int conf_single_session_ignore_case;
diff --git a/tests/README.md b/tests/README.md
index d062ed46..689a16d8 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -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)
@@ -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)
@@ -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
diff --git a/tests/accel-pppd/test_basic.py b/tests/accel-pppd/general/test_basic.py
index 2b2c6f71..9652ee0b 100644
--- a/tests/accel-pppd/test_basic.py
+++ b/tests/accel-pppd/general/test_basic.py
@@ -19,9 +19,11 @@ def accel_pppd_config():
log_tcp
#log_pgsql
+ connlimit
pptp
l2tp
sstp
+ radius
pppoe
ipoe
@@ -30,7 +32,6 @@ def accel_pppd_config():
auth_chap_md5
auth_pap
- radius
chap-secrets
ippool
@@ -39,7 +40,6 @@ def accel_pppd_config():
shaper
#net-snmp
logwtmp
- connlimit
ipv6_nd
ipv6_dhcp
diff --git a/tests/accel-pppd/general/test_pcre_negative_cases.py b/tests/accel-pppd/general/test_pcre_negative_cases.py
new file mode 100644
index 00000000..698c83ab
--- /dev/null
+++ b/tests/accel-pppd/general/test_pcre_negative_cases.py
@@ -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
+ )
diff --git a/tests/accel-pppd/ipoe/dhcpv4/test_ipoe_shared_session_wo_auth.py b/tests/accel-pppd/ipoe/dhcpv4/test_ipoe_shared_session_wo_auth.py
index 104e4e9b..7ebb420a 100644
--- a/tests/accel-pppd/ipoe/dhcpv4/test_ipoe_shared_session_wo_auth.py
+++ b/tests/accel-pppd/ipoe/dhcpv4/test_ipoe_shared_session_wo_auth.py
@@ -9,7 +9,8 @@ def accel_pppd_config(veth_pair_netns):
return (
"""
[modules]
- pppoe
+ connlimit
+ radius
ipoe
ippool
@@ -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:]
)
diff --git a/tests/accel-pppd/pppoe/conftest.py b/tests/accel-pppd/pppoe/conftest.py
index 8ebaaed3..b3893200 100644
--- a/tests/accel-pppd/pppoe/conftest.py
+++ b/tests/accel-pppd/pppoe/conftest.py
@@ -1,5 +1,6 @@
-import pytest
+import pytest, subprocess, re
from common import pppd_process
+from packaging.version import Version
# pppd executable file name
@pytest.fixture()
@@ -13,11 +14,21 @@ def pppd(pytestconfig):
def pppd_config():
return ""
+# determines which plugin is required - pppoe.so (pppd 2.5.0+) or rp-pppoe.so (pppd <2.5.0)
+def pppd_plugin_so(pppd):
+ command = [pppd, "--version"]
+ result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
+ pppd_version = Version(re.search(r'\d+\.\d+\.\d+', result.stdout + result.stderr).group())
+ ref_version = Version("2.5.0")
+ if pppd_version >= ref_version:
+ return "pppoe.so"
+ else:
+ return "rp-pppoe.so"
# pppd configuration as command line args
@pytest.fixture()
-def pppd_args(pppd_config):
- return pppd_config.split()
+def pppd_args(pppd_config, pppd):
+ return ("plugin " + pppd_plugin_so(pppd) + "\n" + pppd_config).split()
# setup and teardown for tests that required running pppd (after accel-pppd)
diff --git a/tests/accel-pppd/pppoe/test_pppoe_disc.py b/tests/accel-pppd/pppoe/test_pppoe_disc.py
index eb069c42..64a0d295 100644
--- a/tests/accel-pppd/pppoe/test_pppoe_disc.py
+++ b/tests/accel-pppd/pppoe/test_pppoe_disc.py
@@ -8,15 +8,23 @@ def accel_pppd_config(veth_pair_netns):
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]
ac-name=test-accel
interface="""
diff --git a/tests/accel-pppd/pppoe/test_pppoe_pado_delay.py b/tests/accel-pppd/pppoe/test_pppoe_pado_delay.py
index 96c73bf8..3a93d920 100644
--- a/tests/accel-pppd/pppoe/test_pppoe_pado_delay.py
+++ b/tests/accel-pppd/pppoe/test_pppoe_pado_delay.py
@@ -30,15 +30,23 @@ def accel_pppd_config(veth_pair_netns):
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]
ac-name=test-accel
pado-delay=1500
diff --git a/tests/accel-pppd/pppoe/test_pppoe_session_chap_secrets.py b/tests/accel-pppd/pppoe/test_pppoe_session_chap_secrets.py
new file mode 100644
index 00000000..e8ac472d
--- /dev/null
+++ b/tests/accel-pppd/pppoe/test_pppoe_session_chap_secrets.py
@@ -0,0 +1,103 @@
+import pytest
+from common import process
+import time
+
+
+@pytest.fixture()
+def chap_secrets_config():
+ return "loginCSAB * pass123 192.0.2.37"
+
+
+@pytest.fixture()
+def accel_pppd_config(veth_pair_netns, chap_secrets_config_file):
+ print(
+ "accel_pppd_config veth_pair_netns: "
+ + str(veth_pair_netns)
+ + "chap_secrets_config_file"
+ + str(chap_secrets_config_file)
+ )
+ return (
+ """
+ [modules]
+ chap-secrets
+ pppoe
+ auth_pap
+
+ [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
+
+ [pppoe]
+ interface="""
+ + veth_pair_netns["veth_a"]
+ + """
+ [chap-secrets]
+ gw-ip-address=192.0.2.1
+ chap-secrets="""
+ + chap_secrets_config_file
+ )
+
+
+@pytest.fixture()
+def pppd_config(veth_pair_netns):
+ print("pppd_config veth_pair_netns: " + str(veth_pair_netns))
+ return (
+ """
+ nodetach
+ noipdefault
+ defaultroute
+ connect /bin/true
+ noauth
+ persist
+ mtu 1492
+ noaccomp
+ default-asyncmap
+ user loginCSAB
+ password pass123
+ nic-"""
+ + veth_pair_netns["veth_b"]
+ )
+
+
+# test pppoe session without auth check
+def test_pppoe_session_chap_secrets(pppd_instance, accel_cmd):
+
+ # test that pppd (with accel-pppd) started successfully
+ assert pppd_instance["is_started"]
+
+ # wait until session is started
+ max_wait_time = 10.0
+ sleep_time = 0.0
+ is_started = False # is session started
+ while sleep_time < max_wait_time:
+ (exit, out, err) = process.run(
+ [
+ accel_cmd,
+ "show sessions match username log.nCSAB username,ip,state",
+ ]
+ )
+ assert exit == 0 # accel-cmd fails
+ # print(out)
+ if "loginCSAB" in out and "192.0.2.37" in out and "active" in out:
+ # session is found
+ print(
+ "test_pppoe_session_chap_secrets: session found in (sec): "
+ + str(sleep_time)
+ )
+ is_started = True
+ break
+ time.sleep(0.1)
+ sleep_time += 0.1
+
+ print("test_pppoe_session_chap_secrets: last accel-cmd out: " + out)
+
+ # test that session is started
+ assert is_started == True
diff --git a/tests/accel-pppd/pppoe/test_pppoe_session_wo_auth.py b/tests/accel-pppd/pppoe/test_pppoe_session_wo_auth.py
index 0c8aa2c0..960b7c94 100644
--- a/tests/accel-pppd/pppoe/test_pppoe_session_wo_auth.py
+++ b/tests/accel-pppd/pppoe/test_pppoe_session_wo_auth.py
@@ -9,12 +9,18 @@ def accel_pppd_config(veth_pair_netns):
return (
"""
[modules]
+ radius
pppoe
auth_pap
ippool
+ [core]
+ log-error=/dev/stderr
+
[log]
log-debug=/dev/stdout
+ log-file=/dev/stdout
+ log-emerg=/dev/stderr
level=5
[auth]
@@ -27,6 +33,8 @@ def accel_pppd_config(veth_pair_netns):
[cli]
tcp=127.0.0.1:2001
+ [radius]
+
[pppoe]
interface="""
+ veth_pair_netns["veth_a"]
@@ -47,7 +55,6 @@ def pppd_config(veth_pair_netns):
mtu 1492
noaccomp
default-asyncmap
- plugin rp-pppoe.so
user loginAB
password pass123
nic-"""
@@ -69,7 +76,7 @@ def test_pppoe_session_wo_auth(pppd_instance, accel_cmd):
(exit, out, err) = process.run(
[
accel_cmd,
- "show sessions match username loginAB username,ip,state",
+ "show sessions match username log.nAB username,ip,state",
]
)
assert exit == 0 # accel-cmd fails
diff --git a/tests/accel-pppd/pppoe/test_pppoe_vlan_mon.py b/tests/accel-pppd/pppoe/test_pppoe_vlan_mon.py
index 670abc33..b73189c3 100644
--- a/tests/accel-pppd/pppoe/test_pppoe_vlan_mon.py
+++ b/tests/accel-pppd/pppoe/test_pppoe_vlan_mon.py
@@ -13,15 +13,23 @@ def accel_pppd_config(veth_pair_netns):
print(veth_pair_netns)
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]
ac-name=test-accel
vlan-mon=%s,10-20
diff --git a/tests/conftest.py b/tests/conftest.py
index d3733409..6687ed10 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -97,3 +97,21 @@ def veth_pair_netns(veth_pair_vlans_config):
# test teardown:
veth.delete_veth_pair_netns(veth_pair_netns_instance)
+
+# chap-secrets configuration as string (should be redefined by specific test)
+@pytest.fixture()
+def chap_secrets_config():
+ return ""
+
+
+# chap-secrets configuration file name
+@pytest.fixture()
+def chap_secrets_config_file(chap_secrets_config):
+ # test setup:
+ filename = config.make_tmp(chap_secrets_config)
+
+ # test execution
+ yield filename
+
+ # test teardown:
+ config.delete_tmp(filename)