velxio/test/backend/e2e
davidmonterocrespo24 2bc492c16f test(e2e): add ESP32 + SPICE photodiode co-simulation test
Follows the same pattern as test_esp32_spice_analog.mjs and
test_esp32_spice_ntc_bridge.mjs: compile an ESP32 sketch on-the-fly via
/api/compile/, boot QEMU through the backend WebSocket, and sweep lux
levels while verifying analogRead() returns what ngspice solved.

The netlist uses the exact photodiode cards emitted by
frontend/.../componentToSpice.ts (D_<id> + I_<id>_ph + DPHOTO model), so
any drift in the frontend SPICE mapper surfaces here.

Validated against the live Docker container — lux=0/1000/2500 produce
raw=4095/2854/992, matching the expected 4095/2854/993 within ±1 LSB
and monotonically decreasing with brightness as expected.

The package-lock.json churn is a pre-existing drift: eecircuit-engine
was in package.json but missing from the lock — npm install re-added it.

Companion workflow change (registering the test in backend-e2e-tests.yml)
lives in a separate commit that requires a PAT with workflow scope to push.
2026-04-24 19:20:02 +02:00
..
README.md
package-lock.json test(e2e): add ESP32 + SPICE photodiode co-simulation test 2026-04-24 19:20:02 +02:00
package.json feat: add ESP32 + ngspice co-simulation E2E tests 2026-04-15 23:28:47 -03:00
rp2040-bootrom.mjs Add end-to-end test for MicroPython on Raspberry Pi Pico using rp2040js 2026-04-13 10:02:21 -03:00
test_dht22_simulation.mjs
test_esp32_spice_analog.mjs feat: add ESP32 + ngspice co-simulation E2E tests 2026-04-15 23:28:47 -03:00
test_esp32_spice_ntc_bridge.mjs feat: add ESP32 + ngspice co-simulation E2E tests 2026-04-15 23:28:47 -03:00
test_esp32_spice_photodiode.mjs test(e2e): add ESP32 + SPICE photodiode co-simulation test 2026-04-24 19:20:02 +02:00
test_esp32_spice_smoke.mjs feat: add ESP32 + ngspice co-simulation E2E tests 2026-04-15 23:28:47 -03:00
test_hcsr04_simulation.mjs
test_micropython_esp32.mjs feat: Update MicroPython firmware handling for ESP32; add end-to-end test and mark subproject commits as dirty 2026-04-12 23:55:11 -03:00
test_micropython_pico.mjs Add end-to-end test for MicroPython on Raspberry Pi Pico using rp2040js 2026-04-13 10:02:21 -03:00
test_mpu6050_simulation.mjs

README.md

Backend E2E Tests (JavaScript / Node.js)

These tests compile real firmware via the backend API and run the full simulation through a WebSocket, verifying sensor readings in the serial output.

CI status

These tests run in GitHub Actions via .github/workflows/backend-e2e-tests.yml.

The CI workflow:

  1. Downloads libqemu-xtensa-amd64.so and libqemu-riscv32-amd64.so from the qemu-prebuilt release.
  2. Downloads ROM files: esp32-v3-rom.bin, esp32-v3-rom-app.bin, esp32c3-rom.bin.
  3. Installs arduino-cli + esp32:esp32 core.
  4. Starts uvicorn app.main:app --port 8001 with QEMU_ESP32_LIB and QEMU_RISCV32_LIB set.
  5. Runs all three JS tests.

Local prerequisites

  1. Backend running with QEMU libs in PATH:

    cd backend
    QEMU_ESP32_LIB=/path/to/libqemu-xtensa.so \
    QEMU_RISCV32_LIB=/path/to/libqemu-riscv32.so \
    uvicorn app.main:app --reload --port 8001
    

    On Windows the .dll files live in backend/app/services/.

  2. Node.js 18+ installed.

Run all e2e tests

Use the convenience script from the repo root:

# Windows
scripts\run-e2e-tests.bat

# Or individually (from repo root):
node test/backend/e2e/test_dht22_simulation.mjs   --timeout=60
node test/backend/e2e/test_hcsr04_simulation.mjs  --timeout=75
node test/backend/e2e/test_mpu6050_simulation.mjs --timeout=60

Tests

File Sensor What it verifies Typical runtime
test_dht22_simulation.mjs DHT22 (GPIO4) Temperature & humidity readings, sensor_update changes values ~50 s
test_hcsr04_simulation.mjs HC-SR04 (GPIO18/19) Distance at 10/40/100/200 cm, sensor_update changes distance ~60 s
test_mpu6050_simulation.mjs MPU-6050 (I2C) Accelerometer/gyroscope I2C readings ~40 s

Pass criteria

Test Passes when
DHT22 First reading received + values change after sensor_update
HC-SR04 ≥3 correct readings, ≥2 distances, miss rate ≤30%
MPU-6050 I2C communication established, sensor data in serial output