mirror of
https://github.com/okalachev/flix.git
synced 2026-09-06 00:10:58 +00:00
Add tests to ci
Test pyflix and simulation using pytest. Fix running the sim in non-tty environment. Test presence of some essential files in the docs.
This commit is contained in:
@@ -84,15 +84,16 @@ jobs:
|
|||||||
run: sudo apt-get install -y libsdl2-dev
|
run: sudo apt-get install -y libsdl2-dev
|
||||||
- name: Build simulator
|
- name: Build simulator
|
||||||
run: make build_simulator
|
run: make build_simulator
|
||||||
- name: Run simulator
|
- name: Install Python requirements
|
||||||
|
run: sudo apt install -y python3-pip && pip3 install -r tools/requirements.txt && pip3 install pytest
|
||||||
|
- name: Run simulator and tests
|
||||||
env:
|
env:
|
||||||
GAZEBO_MODEL_PATH: ${{ github.workspace }}/gazebo/models
|
GAZEBO_MODEL_PATH: ${{ github.workspace }}/gazebo/models
|
||||||
GAZEBO_PLUGIN_PATH: ${{ github.workspace }}/gazebo/build
|
GAZEBO_PLUGIN_PATH: ${{ github.workspace }}/gazebo/build
|
||||||
|
GAZEBO_MODEL_DATABASE_URI: '' # disable downloading models
|
||||||
run: |
|
run: |
|
||||||
OUT=$(timeout -k 10s 120s gzserver --verbose gazebo/flix.world 2>&1 | tee /dev/stderr)
|
gzserver --verbose gazebo/flix.world &
|
||||||
if echo "$OUT" | grep -Pq "\[Err\](?! \[RenderEngine)"; then
|
pytest --capture=no --verbose tools/test.py
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
- uses: actions/upload-artifact@v7
|
- uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: gazebo-plugin-binary
|
name: gazebo-plugin-binary
|
||||||
|
|||||||
@@ -83,6 +83,11 @@ jobs:
|
|||||||
ln -s "$FQBN/flix.ino.bin" "flix.$BOARD.bin"
|
ln -s "$FQBN/flix.ino.bin" "flix.$BOARD.bin"
|
||||||
ln -s "$FQBN/flix.ino.bootloader.bin" "flix.$BOARD.bootloader.bin"
|
ln -s "$FQBN/flix.ino.bootloader.bin" "flix.$BOARD.bootloader.bin"
|
||||||
done
|
done
|
||||||
|
- name: Test build artifacts
|
||||||
|
working-directory: docs/build
|
||||||
|
run: |
|
||||||
|
ls; ls index.html gyro.html geometry.html firmware.html flix.esp32.merged.bin flix.esp32c3.merged.bin \
|
||||||
|
flix.esp32s3.merged.bin flix.esp32s3.opi.merged.bin flix.esp32s3.qspi.merged.bin flix.flix2.merged.bin
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-pages-artifact@v5
|
uses: actions/upload-pages-artifact@v5
|
||||||
with:
|
with:
|
||||||
|
|||||||
+2
-1
@@ -134,8 +134,9 @@ public:
|
|||||||
|
|
||||||
int available() {
|
int available() {
|
||||||
// to implement for Windows, see https://stackoverflow.com/a/71992965/6850197
|
// to implement for Windows, see https://stackoverflow.com/a/71992965/6850197
|
||||||
|
if (!isatty(STDIN_FILENO)) return 0;
|
||||||
struct pollfd pfd = { .fd = STDIN_FILENO, .events = POLLIN };
|
struct pollfd pfd = { .fd = STDIN_FILENO, .events = POLLIN };
|
||||||
return poll(&pfd, 1, 0) > 0;
|
return poll(&pfd, 1, 0) > 0 && (pfd.revents & POLLIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
int read() {
|
int read() {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
pymavlink
|
||||||
docopt
|
docopt
|
||||||
matplotlib
|
matplotlib
|
||||||
mcap
|
mcap
|
||||||
|
|||||||
Executable
+47
@@ -0,0 +1,47 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Script for testing pyflix and the simulation.
|
||||||
|
|
||||||
|
from pytest import approx
|
||||||
|
from math import isnan, isfinite
|
||||||
|
import time
|
||||||
|
from pyflix import Flix
|
||||||
|
|
||||||
|
def test():
|
||||||
|
print('=== Connect...')
|
||||||
|
flix = Flix(timeout=20)
|
||||||
|
|
||||||
|
print('=== Check initial state')
|
||||||
|
time.sleep(1) # give more time for initial state
|
||||||
|
assert flix.connected
|
||||||
|
assert flix.mode == 'STAB'
|
||||||
|
assert not flix.armed
|
||||||
|
assert flix.landed
|
||||||
|
assert isnan(flix.voltage) or flix.voltage == approx(4.2)
|
||||||
|
assert flix.rates == approx((0, 0, 0), abs=0.01)
|
||||||
|
assert flix.attitude == approx((1, 0, 0, 0), abs=0.01)
|
||||||
|
assert flix.attitude_euler == approx((0, 0, 0), abs=0.01)
|
||||||
|
assert all(m == 0 for m in flix.motors)
|
||||||
|
assert flix.acc == approx((0, 0, 9.81), abs=0.1)
|
||||||
|
assert flix.gyro == approx((0, 0, 0), abs=0.01)
|
||||||
|
assert all(ch == 0 for ch in flix.channels)
|
||||||
|
|
||||||
|
print('=== Check console commands')
|
||||||
|
assert 'Time: ' in flix.cli('time')
|
||||||
|
assert 'landed: 1' in flix.cli('imu')
|
||||||
|
|
||||||
|
print('=== Check parameters')
|
||||||
|
assert isfinite(flix.get_param('CTL_ATT_P_P'))
|
||||||
|
flix.set_param('CTL_ATT_P_P', 10.0)
|
||||||
|
|
||||||
|
print('=== Additional checks')
|
||||||
|
assert flix.wait('gyro') == approx((0, 0, 0), abs=0.01)
|
||||||
|
flix.wait('armed', False)
|
||||||
|
flix.wait('mode', 'STAB')
|
||||||
|
flix.wait('motors', lambda motors: not any(motors))
|
||||||
|
flix.set_armed(True)
|
||||||
|
flix.wait('armed', True)
|
||||||
|
flix.set_mode('ACRO')
|
||||||
|
flix.wait('mode', 'ACRO')
|
||||||
|
flix.set_mode('AUTO')
|
||||||
|
flix.wait('mode', 'AUTO')
|
||||||
Reference in New Issue
Block a user