diff --git a/.github/workflows/ci_bats.yml b/.github/workflows/ci_bats.yml index 756684cec..3233d0cd7 100644 --- a/.github/workflows/ci_bats.yml +++ b/.github/workflows/ci_bats.yml @@ -35,9 +35,6 @@ jobs: - name: "BATS: build crowdsec" run: make bats-clean bats-build - - name: "BATS: prepare fixture config+data" - run: make bats-instance-data - - name: "BATS: run tests" run: make bats-test diff --git a/tests/bats.mk b/tests/bats.mk index 0dcb081ab..8642cf4d2 100644 --- a/tests/bats.mk +++ b/tests/bats.mk @@ -21,18 +21,18 @@ export PID_DIR="$(PID_DIR)" export PLUGIN_DIR="$(PLUGIN_DIR)" endef -bats-all: bats-clean bats-build bats-instance-data bats-test +bats-all: bats-clean bats-build bats-test # Source this to run the scripts outside of the Makefile bats-environment: $(file >$(TEST_DIR)/.environment.sh,$(ENV)) -# See if bats-core has been cloned from the repo -check-bats-libs: - @$(TEST_DIR)/lib/bats-core/bin/bats --version >/dev/null 2>&1 || (echo "ERROR: bats-core submodule is required. Please run 'git submodule init; git submodule update' and retry."; exit 1) +# Verify dependencies and submodules +bats-check-requirements: + @$(TEST_DIR)/check-requirements # Builds and installs crowdsec in a local directory -bats-build: bats-environment +bats-build: bats-environment bats-check-requirements @DEFAULT_CONFIGDIR=$(CONFIG_DIR) DEFAULT_DATADIR=$(DATA_DIR) $(MAKE) build @mkdir -p $(BIN_DIR) $(CONFIG_DIR) $(DATA_DIR) $(LOG_DIR) $(PID_DIR) $(LOCAL_INIT_DIR) $(PLUGIN_DIR) @install -m 0755 cmd/crowdsec/crowdsec $(BIN_DIR)/ @@ -41,26 +41,22 @@ bats-build: bats-environment @install -m 0755 plugins/notifications/http/notification-http $(PLUGIN_DIR)/ @install -m 0755 plugins/notifications/slack/notification-slack $(PLUGIN_DIR)/ @install -m 0755 plugins/notifications/splunk/notification-splunk $(PLUGIN_DIR)/ - -# Create a reusable package with initial configuration + data -bats-instance-data: bats-environment - $(TEST_DIR)/instance-data make + # Create a reusable package with initial configuration + data + @$(TEST_DIR)/instance-data make + # Generate dynamic tests + @$(TEST_DIR)/generate-hub-tests # Removes the local crowdsec installation and the fixture config + data bats-clean: @$(RM) -r $(LOCAL_DIR) $(LOCAL_INIT_DIR) $(TEST_DIR)/dyn-bats/*.bats -# Creates the hub tests -bats-generate-hubtests: bats-environment check-bats-libs - ${TEST_DIR}/generate-hub-tests - # Run the test suite -bats-test: bats-environment check-bats-libs bats-generate-hubtests +bats-test: bats-environment bats-check-requirements $(TEST_DIR)/run-tests # Static checks for the test scripts. # Not failproof but they can catch bugs and improve learning of sh/bash bats-lint: @shellcheck --version >/dev/null 2>&1 || (echo "ERROR: shellcheck is required."; exit 1) - @shellcheck -x ${TEST_DIR}/bats/*.bats + @shellcheck -x $(TEST_DIR)/bats/*.bats diff --git a/tests/bats/70_plugins.bats b/tests/bats/70_plugins.bats index 6ba989975..f769adf31 100644 --- a/tests/bats/70_plugins.bats +++ b/tests/bats/70_plugins.bats @@ -9,9 +9,13 @@ setup_file() { MOCK_OUT="${LOG_DIR}/mock-http.out" export MOCK_OUT + MOCK_PORT="9999" + MOCK_URL="http://localhost:${MOCK_PORT}" + export MOCK_URL + # https://mikefarah.gitbook.io/yq/operators/env-variable-operators yq ' - .url="http://localhost:9999" | + .url=strenv(MOCK_URL) | .group_wait="5s" | .group_threshold=2 ' -i "${CONFIG_DIR}/notifications/http.yaml" @@ -29,7 +33,7 @@ setup_file() { rm -f -- "${MOCK_OUT}" ./instance-crowdsec start - ./instance-mock-http start 9999 + ./instance-mock-http start "${MOCK_PORT}" } teardown_file() { diff --git a/tests/check-requirements b/tests/check-requirements new file mode 100755 index 000000000..73772c807 --- /dev/null +++ b/tests/check-requirements @@ -0,0 +1,65 @@ +#!/usr/bin/env bash + +set -eu + +die() { + echo >&2 "$@" + exit 1 +} + +# shellcheck disable=SC1007 +TEST_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +# shellcheck source=./.environment.sh +. "${TEST_DIR}/.environment.sh" + + +check_bats_core() { + if ! "${TEST_DIR}/lib/bats-core/bin/bats" --version >/dev/null 2>&1; then + die "ERROR: bats-core submodule is required. Please run 'git submodule init; git submodule update' and retry." + fi +} + +check_python3() { + if ! command -v python3 >/dev/null; then + die "missing required program 'python3'" + fi +} + +check_nc() { + if ! command -v nc >/dev/null; then + die "missing required program 'nc' (package 'netcat-openbsd')" + fi +} + +check_yq() { + if ! command -v yq >/dev/null; then + die "missing required program 'yq'. You can install it with 'GO111MODULE=on go get github.com/mikefarah/yq/v4' and add ~/go/bin to $PATH" + fi +} + +check_daemonizer() { + SYSTEM=$(uname -s) + case "${SYSTEM,,}" in + linux) + if ! command -v daemonize >/dev/null; then + die "missing required program 'daemonize' (package 'daemonize')" + fi + ;; + freebsd) + if ! command -v daemon >/dev/null; then + die "missing required program 'daemon'" + fi + ;; + *) + die "unsupported system: $SYSTEM" + ;; + esac +} + + +check_bats_core +check_python3 +check_nc +check_yq +check_daemonizer + diff --git a/tests/run-tests b/tests/run-tests index 0cd094623..213cce65b 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -12,41 +12,7 @@ TEST_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) # shellcheck source=./.environment.sh . "${TEST_DIR}/.environment.sh" - - -check_requirements() { - if ! command -v python3 >/dev/null; then - die "missing required program 'python3'" - fi - - if ! command -v nc >/dev/null; then - die "missing required program 'nc' (package 'netcat-openbsd')" - fi - - if ! command -v yq >/dev/null; then - die "missing required program 'yq'. You can install it with 'GO111MODULE=on go get github.com/mikefarah/yq/v4' and add ~/go/bin to $PATH" - fi - - SYSTEM=$(uname -s) - case "${SYSTEM,,}" in - linux) - if ! command -v daemonize >/dev/null; then - die "missing required program 'daemonize' (package 'daemonize')" - fi - ;; - freebsd) - if ! command -v daemon >/dev/null; then - die "missing required program 'daemon'" - fi - ;; - *) - die "unsupported system: $SYSTEM" - ;; - esac -} - - -check_requirements +"${TEST_DIR}/check-requirements" if [ $# -ge 1 ]; then "${TEST_DIR}/lib/bats-core/bin/bats" \