# Copyright (C) 2024 Umorpha Systems # SPDX-License-Identifier: AGPL-3.0-or-later bats_require_minimum_version 1.7.0 bats_load_library bats-support bats_load_library bats-assert bats_load_library bats-file teardown() { if [[ -n "${httpd_pid:-}" ]]; then kill "$httpd_pid" wait || true fi if [[ -n "${tmpdir:-}" ]]; then rm -rf -- "$tmpdir" fi } run_httpd() { eclipse-httpd --config="$tmpdir/leader.yml" --socket=tcp:127.0.0.1:0 &>"$tmpdir/httpd.log" & httpd_pid=$! echo "httpd_pid: $httpd_pid" httpd_port='' while [[ -z "$httpd_port" ]]; do httpd_port=$(sed -n -E 's/.* Serving on 127\.0\.0\.1:([0-9]+)\.\.\.$/\1/p' <"$tmpdir/httpd.log") if ! [[ -d "/proc/$httpd_pid" ]]; then cat "$tmpdir/httpd.log" return 1 fi done echo "httpd_port: $httpd_port" } @test "httpd fails if dirs don't exist" { tmpdir="$(temp_make)" eclipse-keygen leader "${tmpdir}/leader.pub" "${tmpdir}/leader.priv" cat >"$tmpdir/leader.yml" <<-EOF pubkey_file: ${tmpdir}/leader.pub state_dir: ${tmpdir}/state cache_dir: ${tmpdir}/cache actions_dir: ${tmpdir}/actions.d cache_git_for: 5s parallel_downloads: 1 EOF r=0 run_httpd || r=$? [[ $r != 0 ]] } @test "httpd starts" { tmpdir="$(temp_make)" eclipse-keygen leader "${tmpdir}/leader.pub" "${tmpdir}/leader.priv" cat >"$tmpdir/leader.yml" <<-EOF pubkey_file: ${tmpdir}/leader.pub state_dir: ${tmpdir}/state cache_dir: ${tmpdir}/cache actions_dir: ${tmpdir}/actions.d cache_git_for: 5s parallel_downloads: 1 EOF mkdir "$tmpdir"/{state,cache,actions.d} run_httpd } @test "runs jobs" { tmpdir="$(temp_make)" eclipse-keygen leader "${tmpdir}/leader.pub" "${tmpdir}/leader.priv" cat >"$tmpdir/leader.yml" <<-EOF pubkey_file: ${tmpdir}/leader.pub state_dir: ${tmpdir}/state cache_dir: ${tmpdir}/cache actions_dir: ${tmpdir}/actions.d cache_git_for: 5s parallel_downloads: 1 EOF mkdir "$tmpdir"/{state,cache,actions.d} cat >"$tmpdir/actions.d/test.yml" <<-EOF - triggers: - repo_url: "${tmpdir}/upstream" rev: HEAD run: "echo foo" EOF git init "$tmpdir/upstream" pushd "$tmpdir/upstream" echo 'Hello, World!' >hello.txt git add hello.txt git commit -m 'initial commit' hash=$(git rev-parse --verify HEAD) popd run_httpd eclipse-keygen follower "$tmpdir/leader.priv" "$tmpdir/follower.key" cat >"$tmpdir/follower.yml" <<-EOF apikey_file: "${tmpdir}/follower.key" leader_url: http://127.0.0.1:${httpd_port} EOF run curl --no-progress-meter "http://127.0.0.1:${httpd_port}/jobs/" assert_success assert_output 'null' eclipse-trigger --config="$tmpdir/leader.yml" run curl --no-progress-meter "http://127.0.0.1:${httpd_port}/jobs/" assert_success jq <<<"$output" >"$tmpdir/actual.json" jq >"$tmpdir/expected.json" <<-EOF [ { "ID": 1, "TriggerExpressions": [ "{\"repo_url\":\"${tmpdir}/upstream\",\"rev\":\"HEAD\"}" ], "TriggerValues": [ "${hash}" ], "Command": "echo foo", "Status": "new", "CreatedAt": "2024-01-23T21:16:13-07:00", "UpdatedAt": "2024-01-23T21:16:13-07:00" } ] EOF sed -i -e /CreatedAt/d -e /UpdatedAt/d -- "$tmpdir/actual.json" "$tmpdir/expected.json" diff -u "$tmpdir/expected.json" "$tmpdir/actual.json" job_url=$(eclipse-pick --config="$tmpdir/follower.yml") assert_equal "$job_url" "http://127.0.0.1:${httpd_port}/jobs/1/" eclipse-run --config="$tmpdir/follower.yml" -- "$job_url" run curl --no-progress-meter "http://127.0.0.1:${httpd_port}/jobs/" assert_success jq <<<"$output" >"$tmpdir/actual.json" jq >"$tmpdir/expected.json" <<-EOF [ { "ID": 1, "TriggerExpressions": [ "{\"repo_url\":\"${tmpdir}/upstream\",\"rev\":\"HEAD\"}" ], "TriggerValues": [ "${hash}" ], "Command": "echo foo", "Status": "succeeded", "CreatedAt": "2024-01-23T21:16:13-07:00", "UpdatedAt": "2024-01-23T21:16:13-07:00" } ] EOF sed -i -e /CreatedAt/d -e /UpdatedAt/d -- "$tmpdir/actual.json" "$tmpdir/expected.json" diff -u "$tmpdir/expected.json" "$tmpdir/actual.json" echo foo >"$tmpdir/expected.txt" diff -u "$tmpdir/expected.txt" "$tmpdir/state/jobfiles/1/log.txt" } @test "pick waits for jobs" { tmpdir="$(temp_make)" eclipse-keygen leader "${tmpdir}/leader.pub" "${tmpdir}/leader.priv" cat >"$tmpdir/leader.yml" <<-EOF pubkey_file: ${tmpdir}/leader.pub state_dir: ${tmpdir}/state cache_dir: ${tmpdir}/cache actions_dir: ${tmpdir}/actions.d cache_git_for: 5s parallel_downloads: 1 EOF mkdir "$tmpdir"/{state,cache,actions.d} cat >"$tmpdir/actions.d/test.yml" <<-EOF - triggers: - repo_url: "${tmpdir}/upstream" rev: HEAD run: "echo foo" EOF git init "$tmpdir/upstream" pushd "$tmpdir/upstream" echo 'Hello, World!' >hello.txt git add hello.txt git commit -m 'initial commit' hash=$(git rev-parse --verify HEAD) popd run_httpd eclipse-keygen follower "$tmpdir/leader.priv" "$tmpdir/follower.key" cat >"$tmpdir/follower.yml" <<-EOF apikey_file: "${tmpdir}/follower.key" leader_url: http://127.0.0.1:${httpd_port} EOF run curl --no-progress-meter "http://127.0.0.1:${httpd_port}/jobs/" assert_success assert_output 'null' echo 'starting pick...' eclipse-pick --config="$tmpdir/follower.yml" >"$tmpdir/output.txt" & pick_pid=$! echo 'sleeping...' sleep 2 echo 'triggering job...' eclipse-trigger --config="$tmpdir/leader.yml" echo 'waiting for pick to notice...' wait "$pick_pid" output=$(cat "$tmpdir/output.txt") assert_output "http://127.0.0.1:${httpd_port}/jobs/1/" }