Skip to content

Commit a4bb6da

Browse files
nezharVibePod
authored andcommitted
Add integration tests for cli
1 parent 265a4a9 commit a4bb6da

5 files changed

Lines changed: 382 additions & 13 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: Runtime Integration
2+
3+
on:
4+
push:
5+
pull_request:
6+
workflow_dispatch:
7+
8+
jobs:
9+
version-runtime:
10+
runs-on: ubuntu-latest
11+
timeout-minutes: 20
12+
strategy:
13+
fail-fast: false
14+
matrix:
15+
scenario:
16+
- docker-only
17+
- podman-only
18+
- none
19+
- both-auto
20+
- both-default-docker
21+
- both-default-podman
22+
- both-switch
23+
24+
env:
25+
VP_REAL_RUNTIME_SCENARIO: ${{ matrix.scenario }}
26+
VP_RUNTIME_PROBE_TIMEOUT: "20"
27+
PYTHONUNBUFFERED: "1"
28+
29+
steps:
30+
- name: Check out repository
31+
uses: actions/checkout@v4
32+
33+
- name: Set up Python
34+
uses: actions/setup-python@v5
35+
with:
36+
python-version: "3.12"
37+
38+
- name: Install dependencies
39+
run: |
40+
python -m pip install --upgrade pip
41+
python -m pip install -e ".[dev]"
42+
43+
- name: Prepare runtime scenario and run tests
44+
run: |
45+
export XDG_RUNTIME_DIR="${RUNNER_TEMP}/xdg-runtime"
46+
bash scripts/prepare_runtime_scenario.sh "${VP_REAL_RUNTIME_SCENARIO}"
47+
python -m pytest -q tests/test_version_integration.py
48+
49+
- name: Clean up runtime scenario
50+
if: always()
51+
run: bash scripts/cleanup_runtime_scenario.sh
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
RUNNER_TEMP="${RUNNER_TEMP:-/tmp}"
5+
PODMAN_PID_FILE="${RUNNER_TEMP}/podman-service.pid"
6+
7+
if [[ -f "${PODMAN_PID_FILE}" ]]; then
8+
kill "$(cat "${PODMAN_PID_FILE}")" >/dev/null 2>&1 || true
9+
rm -f "${PODMAN_PID_FILE}"
10+
fi
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
SCENARIO="${1:?missing runtime scenario}"
5+
RUNNER_TEMP="${RUNNER_TEMP:-/tmp}"
6+
XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-${RUNNER_TEMP}/xdg-runtime}"
7+
PODMAN_DIR="${XDG_RUNTIME_DIR}/podman"
8+
PODMAN_SOCKET_PATH="${PODMAN_DIR}/podman.sock"
9+
PODMAN_SOCKET_URL="unix://${PODMAN_SOCKET_PATH}"
10+
PODMAN_PID_FILE="${RUNNER_TEMP}/podman-service.pid"
11+
PODMAN_LOG_FILE="${RUNNER_TEMP}/podman-service.log"
12+
13+
wait_for_docker() {
14+
for _ in $(seq 1 30); do
15+
if docker version >/dev/null 2>&1; then
16+
return 0
17+
fi
18+
sleep 1
19+
done
20+
docker version
21+
}
22+
23+
wait_for_podman() {
24+
for _ in $(seq 1 30); do
25+
if [[ -S "${PODMAN_SOCKET_PATH}" ]] && podman --url "${PODMAN_SOCKET_URL}" version >/dev/null 2>&1; then
26+
return 0
27+
fi
28+
sleep 1
29+
done
30+
podman --url "${PODMAN_SOCKET_URL}" version
31+
}
32+
33+
ensure_docker_started() {
34+
if command -v systemctl >/dev/null 2>&1; then
35+
sudo systemctl start docker.socket || true
36+
sudo systemctl start docker.service || true
37+
fi
38+
if command -v service >/dev/null 2>&1; then
39+
sudo service docker start || true
40+
fi
41+
wait_for_docker
42+
}
43+
44+
stop_docker() {
45+
if command -v systemctl >/dev/null 2>&1; then
46+
sudo systemctl stop docker.service || true
47+
sudo systemctl stop docker.socket || true
48+
fi
49+
if command -v service >/dev/null 2>&1; then
50+
sudo service docker stop || true
51+
fi
52+
sleep 2
53+
}
54+
55+
install_podman() {
56+
sudo touch /etc/subuid /etc/subgid
57+
58+
if ! grep -q "^${USER}:" /etc/subuid; then
59+
echo "${USER}:100000:65536" | sudo tee -a /etc/subuid >/dev/null
60+
fi
61+
if ! grep -q "^${USER}:" /etc/subgid; then
62+
echo "${USER}:100000:65536" | sudo tee -a /etc/subgid >/dev/null
63+
fi
64+
65+
if command -v podman >/dev/null 2>&1; then
66+
return 0
67+
fi
68+
69+
sudo apt-get update
70+
sudo apt-get install -y podman
71+
}
72+
73+
stop_podman_service() {
74+
if [[ -f "${PODMAN_PID_FILE}" ]]; then
75+
kill "$(cat "${PODMAN_PID_FILE}")" >/dev/null 2>&1 || true
76+
rm -f "${PODMAN_PID_FILE}"
77+
fi
78+
rm -f "${PODMAN_SOCKET_PATH}"
79+
}
80+
81+
start_podman_service() {
82+
install_podman
83+
stop_podman_service
84+
85+
mkdir -p "${PODMAN_DIR}"
86+
chmod 700 "${XDG_RUNTIME_DIR}"
87+
88+
nohup podman system service --time=0 "${PODMAN_SOCKET_URL}" >"${PODMAN_LOG_FILE}" 2>&1 &
89+
echo "$!" >"${PODMAN_PID_FILE}"
90+
91+
wait_for_podman
92+
}
93+
94+
case "${SCENARIO}" in
95+
docker-only)
96+
stop_podman_service
97+
ensure_docker_started
98+
;;
99+
podman-only)
100+
start_podman_service
101+
stop_docker
102+
;;
103+
none)
104+
stop_podman_service
105+
stop_docker
106+
;;
107+
both-auto|both-default-docker|both-default-podman|both-switch)
108+
ensure_docker_started
109+
start_podman_service
110+
;;
111+
*)
112+
echo "Unknown runtime scenario: ${SCENARIO}" >&2
113+
exit 1
114+
;;
115+
esac
116+
117+
echo "Prepared runtime scenario: ${SCENARIO}"
118+
docker version >/dev/null 2>&1 && docker version --format '{{.Server.Version}}' || true
119+
command -v podman >/dev/null 2>&1 && podman --url "${PODMAN_SOCKET_URL}" version --format '{{.Server.Version}}' || true

0 commit comments

Comments
 (0)