|
1 | | -name: STM32H563 m33mu (echo only) |
| 1 | +name: STM32H563 m33mu |
2 | 2 |
|
3 | 3 | on: |
4 | 4 | push: |
@@ -109,3 +109,208 @@ jobs: |
109 | 109 | if [ -f /tmp/m33mu.pid ]; then |
110 | 110 | sudo kill "$(cat /tmp/m33mu.pid)" 2>/dev/null || true |
111 | 111 | fi |
| 112 | +
|
| 113 | + stm32h563_m33mu_full: |
| 114 | + runs-on: ubuntu-latest |
| 115 | + timeout-minutes: 30 |
| 116 | + container: |
| 117 | + image: ghcr.io/danielinux/m33mu-ci:1.5 |
| 118 | + options: --privileged |
| 119 | + |
| 120 | + steps: |
| 121 | + - uses: actions/checkout@v4 |
| 122 | + |
| 123 | + - name: Clone wolfSSL, wolfSSH, wolfMQTT |
| 124 | + run: | |
| 125 | + set -euo pipefail |
| 126 | + cd .. |
| 127 | + git clone --depth 1 https://github.com/wolfSSL/wolfssl.git |
| 128 | + git clone --depth 1 https://github.com/wolfSSL/wolfssh.git |
| 129 | + git clone --depth 1 https://github.com/wolfSSL/wolfMQTT.git wolfmqtt |
| 130 | +
|
| 131 | + - name: Install host tools |
| 132 | + run: | |
| 133 | + set -euo pipefail |
| 134 | + apt-get update |
| 135 | + apt-get install -y sudo dnsmasq iproute2 netcat-openbsd \ |
| 136 | + curl mosquitto-clients openssh-client |
| 137 | +
|
| 138 | + - name: Build STM32H563 full firmware |
| 139 | + run: | |
| 140 | + set -euo pipefail |
| 141 | + make -C src/port/stm32h563 \ |
| 142 | + ENABLE_HTTPS=1 ENABLE_MQTT_BROKER=1 ENABLE_SSH=1 \ |
| 143 | + CC=arm-none-eabi-gcc OBJCOPY=arm-none-eabi-objcopy |
| 144 | +
|
| 145 | + - name: Run m33mu + DHCP + full test |
| 146 | + timeout-minutes: 15 |
| 147 | + run: | |
| 148 | + set -euo pipefail |
| 149 | +
|
| 150 | + cleanup() { |
| 151 | + set +e |
| 152 | + if [ -f /tmp/m33mu.pid ]; then |
| 153 | + sudo kill "$(cat /tmp/m33mu.pid)" 2>/dev/null || true |
| 154 | + fi |
| 155 | + sudo pkill -x m33mu 2>/dev/null || true |
| 156 | + if [ -f /tmp/dnsmasq.pid ]; then |
| 157 | + sudo kill "$(cat /tmp/dnsmasq.pid)" 2>/dev/null || true |
| 158 | + fi |
| 159 | + sudo ip link del tap0 2>/dev/null || true |
| 160 | + } |
| 161 | + trap cleanup EXIT |
| 162 | +
|
| 163 | + sudo ip tuntap add dev tap0 mode tap |
| 164 | + sudo ip addr add 192.168.12.1/24 dev tap0 |
| 165 | + sudo ip link set tap0 up |
| 166 | +
|
| 167 | + cat > /tmp/dnsmasq.conf <<'EOF' |
| 168 | + interface=tap0 |
| 169 | + bind-interfaces |
| 170 | + dhcp-range=192.168.12.50,192.168.12.100,255.255.255.0,12h |
| 171 | + dhcp-leasefile=/tmp/dnsmasq.leases |
| 172 | + log-dhcp |
| 173 | + EOF |
| 174 | + sudo dnsmasq --conf-file=/tmp/dnsmasq.conf --pid-file=/tmp/dnsmasq.pid |
| 175 | +
|
| 176 | + sudo m33mu src/port/stm32h563/app.bin \ |
| 177 | + --cpu stm32h563 --tap:tap0 --uart-stdout --timeout 240 \ |
| 178 | + 2>&1 | tee /tmp/m33mu.log & |
| 179 | + sleep 1 |
| 180 | + m33mu_pid="$(pgrep -n -x m33mu || true)" |
| 181 | + if [ -n "${m33mu_pid}" ]; then |
| 182 | + echo "${m33mu_pid}" > /tmp/m33mu.pid |
| 183 | + fi |
| 184 | +
|
| 185 | + # Wait for DHCP lease |
| 186 | + ip="" |
| 187 | + for _ in $(seq 1 60); do |
| 188 | + if [ -s /tmp/dnsmasq.leases ]; then |
| 189 | + ip="$(tail -n1 /tmp/dnsmasq.leases | cut -d' ' -f3)" |
| 190 | + fi |
| 191 | + if [ -n "${ip}" ]; then |
| 192 | + break |
| 193 | + fi |
| 194 | + sleep 1 |
| 195 | + done |
| 196 | + if [ -z "${ip}" ]; then |
| 197 | + echo "No DHCP lease acquired." |
| 198 | + tail -n 200 /tmp/m33mu.log || true |
| 199 | + exit 1 |
| 200 | + fi |
| 201 | + echo "Leased IP: ${ip}" |
| 202 | +
|
| 203 | + # Helper: check m33mu is still running |
| 204 | + check_alive() { |
| 205 | + if ! pgrep -x m33mu >/dev/null 2>&1; then |
| 206 | + echo "FAIL: m33mu exited unexpectedly." |
| 207 | + tail -n 200 /tmp/m33mu.log || true |
| 208 | + exit 1 |
| 209 | + fi |
| 210 | + } |
| 211 | +
|
| 212 | + # Test 1: TCP Echo (port 7) |
| 213 | + echo "=== Test 1: TCP Echo ===" |
| 214 | + ok=0 |
| 215 | + for _ in $(seq 1 20); do |
| 216 | + check_alive |
| 217 | + if printf "ping" | nc -w 2 "${ip}" 7 | grep -q "ping"; then |
| 218 | + ok=1; break |
| 219 | + fi |
| 220 | + sleep 0.5 |
| 221 | + done |
| 222 | + if [ "${ok}" -ne 1 ]; then |
| 223 | + echo "FAIL: Echo test." |
| 224 | + tail -n 200 /tmp/m33mu.log || true |
| 225 | + exit 1 |
| 226 | + fi |
| 227 | + echo "PASS: Echo test." |
| 228 | +
|
| 229 | + # Test 2: HTTPS Web Server (port 443) |
| 230 | + echo "=== Test 2: HTTPS Server ===" |
| 231 | + ok=0 |
| 232 | + for _ in $(seq 1 10); do |
| 233 | + check_alive |
| 234 | + resp="$(curl -k -s --max-time 10 "https://${ip}/" 2>/dev/null || true)" |
| 235 | + if echo "${resp}" | grep -q "wolfIP Status"; then |
| 236 | + ok=1; break |
| 237 | + fi |
| 238 | + sleep 2 |
| 239 | + done |
| 240 | + if [ "${ok}" -ne 1 ]; then |
| 241 | + echo "FAIL: HTTPS test." |
| 242 | + tail -n 200 /tmp/m33mu.log || true |
| 243 | + exit 1 |
| 244 | + fi |
| 245 | + echo "PASS: HTTPS test." |
| 246 | +
|
| 247 | + # Test 3: TLS Echo (port 8443) |
| 248 | + echo "=== Test 3: TLS Echo ===" |
| 249 | + sleep 5 # allow recovery from HTTPS TLS session |
| 250 | + ok=0 |
| 251 | + for _ in $(seq 1 5); do |
| 252 | + check_alive |
| 253 | + resp="$(echo "TLS-ping" | timeout 10 openssl s_client \ |
| 254 | + -connect "${ip}:8443" -quiet 2>/dev/null || true)" |
| 255 | + if echo "${resp}" | grep -q "TLS-ping"; then |
| 256 | + ok=1; break |
| 257 | + fi |
| 258 | + sleep 3 |
| 259 | + done |
| 260 | + if [ "${ok}" -ne 1 ]; then |
| 261 | + echo "FAIL: TLS echo test." |
| 262 | + tail -n 200 /tmp/m33mu.log || true |
| 263 | + exit 1 |
| 264 | + fi |
| 265 | + echo "PASS: TLS echo test." |
| 266 | +
|
| 267 | + # Test 4: MQTT Broker (port 8883) |
| 268 | + echo "=== Test 4: MQTT Broker ===" |
| 269 | + sleep 5 # allow recovery from TLS echo session |
| 270 | + # Extract cert from certs.h for mosquitto |
| 271 | + sed -n '/server_cert_pem\[\]/,/^";$/p' src/port/certs.h \ |
| 272 | + | sed 's/^"//; s/"$//; s/\\n$//' \ |
| 273 | + | grep -v '^static\|^;' > /tmp/wolfip_cert.pem |
| 274 | + ok=0 |
| 275 | + for _ in $(seq 1 5); do |
| 276 | + check_alive |
| 277 | + out="$(mosquitto_pub -h "${ip}" -p 8883 \ |
| 278 | + --cafile /tmp/wolfip_cert.pem --insecure \ |
| 279 | + -t "ci/test" -m "hello" -d 2>&1 || true)" |
| 280 | + if echo "${out}" | grep -q "CONNACK"; then |
| 281 | + ok=1; break |
| 282 | + fi |
| 283 | + sleep 5 |
| 284 | + done |
| 285 | + if [ "${ok}" -ne 1 ]; then |
| 286 | + echo "FAIL: MQTT broker test." |
| 287 | + tail -n 200 /tmp/m33mu.log || true |
| 288 | + exit 1 |
| 289 | + fi |
| 290 | + echo "PASS: MQTT broker test." |
| 291 | +
|
| 292 | + # Test 5: SSH Server (port 22) |
| 293 | + echo "=== Test 5: SSH Server ===" |
| 294 | + sleep 5 # allow recovery from MQTT TLS session |
| 295 | + ok=0 |
| 296 | + for _ in $(seq 1 5); do |
| 297 | + check_alive |
| 298 | + # Test SSH banner (connection-level check, no auth) |
| 299 | + resp="$(timeout 10 bash -c "echo '' | nc -w 5 ${ip} 22" 2>/dev/null || true)" |
| 300 | + if echo "${resp}" | grep -qi "ssh"; then |
| 301 | + ok=1; break |
| 302 | + fi |
| 303 | + sleep 3 |
| 304 | + done |
| 305 | + if [ "${ok}" -ne 1 ]; then |
| 306 | + echo "FAIL: SSH banner test." |
| 307 | + tail -n 200 /tmp/m33mu.log || true |
| 308 | + exit 1 |
| 309 | + fi |
| 310 | + echo "PASS: SSH banner test." |
| 311 | +
|
| 312 | + echo "" |
| 313 | + echo "=== All tests passed ===" |
| 314 | + if [ -f /tmp/m33mu.pid ]; then |
| 315 | + sudo kill "$(cat /tmp/m33mu.pid)" 2>/dev/null || true |
| 316 | + fi |
0 commit comments