From 1f46a1042f52a8826c43699addcfe3a733d7f8c5 Mon Sep 17 00:00:00 2001 From: Jan Friesse Date: Thu, 19 Mar 2020 15:29:49 +0100 Subject: [PATCH] Add CI tests using the Standard Test Interface --- tests/.gitignore | 3 + tests/smoke/runtest.sh | 133 +++++++++++++++++++++++++++++++++++++++++ tests/tests.yml | 7 +++ 3 files changed, 143 insertions(+) create mode 100644 tests/.gitignore create mode 100644 tests/smoke/runtest.sh create mode 100644 tests/tests.yml diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 index 0000000..e6c79fd --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1,3 @@ +# Ignore tests runs/artefacts. +artifacts/** +**/*.retry diff --git a/tests/smoke/runtest.sh b/tests/smoke/runtest.sh new file mode 100644 index 0000000..fba378d --- /dev/null +++ b/tests/smoke/runtest.sh @@ -0,0 +1,133 @@ +#!/bin/bash + +# Copyright (c) 2019, Red Hat, Inc. +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND RED HAT, INC. DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RED HAT, INC. BE LIABLE +# FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# Author: Jan Friesse + +# Home https://github.com/jfriesse/csts/tree/master/smoke + +# -e is really important +set -xe +set -o pipefail + +# Variables changing test behavior +MAX_REPEATS=60 +SLEEP=5 + +# Start of the test (for journalctl) +JOURNAL_DATE_SINCE=$(date +"%F %T") + +#################### +# Helper functions # +#################### + +# service_start service +service_start() { + # service service must be inactive + systemctl is-active "$1" && exit 1 || true + + systemctl start "$1" + + systemctl is-active "$1" +} + +# service_stop service +service_stop() { + systemctl is-active "$1" || exit 1 + + systemctl stop "$1" + + systemctl is-active "$1" && exit 1 || true +} + +# wait_for_log_msg message +wait_for_log_msg() { + local cont=true + local repeats=0 + + journalctl --since "$JOURNAL_DATE_SINCE" | cat + + while $cont;do + if journalctl _SYSTEMD_UNIT=spausedd.service -o cat --since "$JOURNAL_DATE_SINCE" | grep "$1";then + cont=false + else + sleep 1 + repeats=$((repeats+1)) + [ "$repeats" -le "$MAX_REPEATS" ] || return 1 + fi + done +} + +################## +# Test functions # +################## + +test_spausedd_h() { + # Check that spausedd binary exists and -h returns help text + res=`spausedd -h || true` + [ "$res" != "${res/usage/}" ] +} + +test_spausedd_start() { + service_start "spausedd" + + wait_for_log_msg 'Running main poll loop with maximum timeout .* and steal threshold .*%' +} + +test_spausedd_stop() { + service_stop "spausedd" + + wait_for_log_msg 'During .*s runtime spausedd was .*x not scheduled on time' +} + +test_sig_stop() { + local cont=true + local repeats=0 + + spausedd_pid=$(systemctl show spausedd -p "MainPID") + spausedd_pid=${spausedd_pid##*=} + + while $cont;do + # Wait a while for full start + sleep $SLEEP + + kill -STOP "$spausedd_pid" + sleep $SLEEP + kill -CONT "$spausedd_pid" + + if wait_for_log_msg 'Not scheduled for .*s (threshold is .*s), steal time is ';then + cont=false + else + repeats=$((repeats+1)) + [ "$repeats" -le "$MAX_REPEATS" ] + fi + done +} + +test_man_page() { + man -w "spausedd" +} + +######## +# main # +######## +test_spausedd_h +test_man_page + +test_spausedd_start + +test_sig_stop + +test_spausedd_stop diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..1725279 --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,7 @@ +- hosts: localhost + roles: + - role: standard-test-basic + tags: + - classic + tests: + - smoke