Skip to content

Commit

Permalink
Merge pull request #625 from cgwalters/more-tests-2
Browse files Browse the repository at this point in the history
 tests: Add pytest and nushell based tests
  • Loading branch information
cgwalters authored Jun 24, 2024
2 parents b73b5f7 + 9a758e3 commit e976458
Show file tree
Hide file tree
Showing 11 changed files with 86 additions and 8 deletions.
3 changes: 3 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
.cosa
target
!target/dev-rootfs
# These directories don't contribute to our container build
docs/
plans/
8 changes: 8 additions & 0 deletions .github/workflows/python.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
name: Python static analysis
on: [push, pull_request]
jobs:
ruff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: chartboost/ruff-action@v1
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ test-tmt:
validate:
cargo fmt
cargo clippy
ruff check
.PHONY: validate

vendor:
Expand Down
22 changes: 20 additions & 2 deletions hack/provision-derived.sh
Original file line number Diff line number Diff line change
@@ -1,9 +1,26 @@
#!/bin/bash
set -xeu
case "$1" in
variant=$1
# I'm a big fan of nushell for interactive use, and I want to support
# using it in our test suite because it's better than bash. First,
# enable EPEL to get it.
. /usr/lib/os-release
if echo $ID_LIKE $ID | grep -q centos; then
dnf config-manager --set-enabled crb
dnf -y install epel-release epel-next-release
fi
# Ensure this is pre-created
mkdir -p -m 0700 /var/roothome
mkdir -p ~/.config/nushell
echo '$env.config = { show_banner: false, }' > ~/.config/nushell/config.nu
touch ~/.config/nushell/env.nu
dnf -y install nu
# And we also add pytest, to support running tests written in Python
dnf -y install python3-pytest
case "$variant" in
tmt)
# tmt wants rsync
dnf -y install cloud-init rsync && dnf clean all
dnf -y install cloud-init rsync
ln -s ../cloud-init.target /usr/lib/systemd/system/default.target.wants
# And tmt wants to write to /usr/local/bin
rm /usr/local -rf && ln -sr /var/usrlocal /usr/local && mkdir -p /var/usrlocal/bin
Expand All @@ -14,3 +31,4 @@ case "$1" in
echo "Unknown variant: $1" exit 1
;;
esac
dnf clean all && rm /var/log/* -rf
18 changes: 12 additions & 6 deletions plans/integration-run.fmf
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
# This tmt test just demonstrates local tmt usage.
# We'll hopefully expand it to do more interesting things in the
# future and unify with the other test plans.
# Run this via `make test-tmt` which will build a container,
# and a disk image from it.
provision:
how: virtual
# Generated by `cargo xtask `
# Generated by make test-tmt
image: file://./target/testvm/disk.qcow2
disk: 20
summary: Basic smoke test
summary: Execute booted tests
execute:
how: tmt
script: bootc status
# There's currently two dynamic test frameworks; python and nushell.
# python is well known and understood. nushell is less well known, but
# is quite nice for running subprocesses and the like while making
# it easy to parse JSON etc.
script: |
set -xeu
pytest tests/booted/*.py
ls tests/booted/*-test-*.nu |sort -n | while read t; do nu $t; done
1 change: 1 addition & 0 deletions tests/booted/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
8 changes: 8 additions & 0 deletions tests/booted/001-test-status.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
use std assert
use tap.nu

tap begin "verify bootc status --json looks sane"

let st = bootc status --json | from json
assert equal $st.apiVersion org.containers.bootc/v1alpha1
tap ok
4 changes: 4 additions & 0 deletions tests/booted/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Booted tests

These are intended to run via tmt; use e.g.
`make test-tmt`.
12 changes: 12 additions & 0 deletions tests/booted/basic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Tests which are read-only/nondestructive

import json
import subprocess

def run(*args):
subprocess.check_call(*args)

def test_bootc_status():
o = subprocess.check_output(["bootc", "status", "--json"])
st = json.loads(o)
assert st['apiVersion'] == 'org.containers.bootc/v1alpha1'
15 changes: 15 additions & 0 deletions tests/booted/tap.nu
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# A simple nushell "library" for the
# "Test anything protocol":
# https://testanything.org/tap-version-14-specification.html
export def begin [description] {
print "TAP version 14"
print $description
}

export def ok [] {
print "ok"
}

export def fail [] {
print "not ok"
}
2 changes: 2 additions & 0 deletions xtask/src/xtask.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@ fn man2markdown(sh: &Shell) -> Result<()> {
#[context("test-integration")]
fn test_tmt(sh: &Shell) -> Result<()> {
cmd!(sh, "cargo run -p tests-integration run-vm prepare-tmt").run()?;
// cc https://pagure.io/testcloud/pull-request/174
cmd!(sh, "rm -vf /var/tmp/tmt/testcloud/images/disk.qcow2").run()?;
cmd!(sh, "tmt run plans -n integration-run").run()?;
Ok(())
}
Expand Down

0 comments on commit e976458

Please sign in to comment.