Skip to content

Commit 08c2f6a

Browse files
committed
tests: add wake from sleep test and CI
1 parent 2a5ce76 commit 08c2f6a

6 files changed

Lines changed: 736 additions & 3 deletions

File tree

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# name: Test Harness Build
2+
3+
# on:
4+
# push:
5+
# branches:
6+
# - main
7+
# - develop
8+
# paths:
9+
# - 'nym-vpn-core/crates/test/**'
10+
# - 'nym-vpn-core/crates/nym-vpnd/**'
11+
# - 'nym-vpn-core/crates/nym-vpnc/**'
12+
# pull_request:
13+
# branches:
14+
# - main
15+
# - develop
16+
# paths:
17+
# - 'nym-vpn-core/crates/test/**'
18+
# - 'nym-vpn-core/crates/nym-vpnd/**'
19+
# - 'nym-vpn-core/crates/nym-vpnc/**'
20+
# workflow_dispatch:
21+
22+
# env:
23+
# CARGO_TERM_COLOR: always
24+
# RUST_BACKTRACE: 1
25+
26+
# jobs:
27+
# build-test-binaries:
28+
# name: Build Test Binaries
29+
# runs-on: ubuntu-latest
30+
# timeout-minutes: 30
31+
32+
# steps:
33+
# - name: Checkout repository
34+
# uses: actions/checkout@v4
35+
36+
# - name: Install system dependencies
37+
# run: |
38+
# sudo apt-get update
39+
# sudo apt-get install -y \
40+
# git \
41+
# build-essential \
42+
# pkg-config \
43+
# libpcap-dev \
44+
# libssl-dev \
45+
# protobuf-compiler \
46+
# curl
47+
48+
# - name: Install Rust toolchain
49+
# uses: dtolnay/rust-toolchain@stable
50+
# with:
51+
# targets: x86_64-unknown-linux-gnu
52+
53+
# - name: Cache Cargo registry
54+
# uses: actions/cache@v4
55+
# with:
56+
# path: |
57+
# ~/.cargo/registry
58+
# ~/.cargo/git
59+
# key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
60+
# restore-keys: |
61+
# ${{ runner.os }}-cargo-
62+
63+
# - name: Cache Cargo build artifacts
64+
# uses: actions/cache@v4
65+
# with:
66+
# path: |
67+
# nym-vpn-core/target
68+
# nym-vpn-core/crates/test/target
69+
# key: ${{ runner.os }}-test-harness-${{ hashFiles('nym-vpn-core/**/Cargo.lock') }}
70+
# restore-keys: |
71+
# ${{ runner.os }}-test-harness-
72+
73+
# - name: Build test-runner and connection-checker
74+
# working-directory: nym-vpn-core/crates/test
75+
# run: |
76+
# cargo build --release --target x86_64-unknown-linux-gnu \
77+
# -p test-runner \
78+
# -p connection-checker
79+
80+
# - name: Build Nym VPN binaries
81+
# working-directory: nym-vpn-core
82+
# run: |
83+
# cargo build --release \
84+
# -p nym-vpnd \
85+
# -p nym-vpnc
86+
87+
# - name: Verify binaries
88+
# run: |
89+
# echo "Built binaries:"
90+
# ls -lh nym-vpn-core/crates/test/target/x86_64-unknown-linux-gnu/release/test-runner || echo "test-runner not found"
91+
# ls -lh nym-vpn-core/crates/test/target/x86_64-unknown-linux-gnu/release/connection-checker || echo "connection-checker not found"
92+
# ls -lh nym-vpn-core/target/release/nym-vpnd || echo "nym-vpnd not found"
93+
# ls -lh nym-vpn-core/target/release/nym-vpnc || echo "nym-vpnc not found"
94+
95+
# - name: Upload binaries as artifacts
96+
# uses: actions/upload-artifact@v4
97+
# with:
98+
# name: test-binaries
99+
# path: |
100+
# nym-vpn-core/crates/test/target/x86_64-unknown-linux-gnu/release/test-runner
101+
# nym-vpn-core/crates/test/target/x86_64-unknown-linux-gnu/release/connection-checker
102+
# nym-vpn-core/target/release/nym-vpnd
103+
# nym-vpn-core/target/release/nym-vpnc
104+
# retention-days: 7
105+
106+
Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
name: Test Harness
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
- develop
8+
paths:
9+
- 'nym-vpn-core/crates/test/**'
10+
- 'nym-vpn-core/crates/nym-vpnd/**'
11+
- 'nym-vpn-core/crates/nym-vpnc/**'
12+
- 'nym-vpn-core/crates/nym-vpn-lib/**'
13+
- 'nym-vpn-core/crates/nym-vpn-proto/**'
14+
pull_request:
15+
branches:
16+
- main
17+
- develop
18+
paths:
19+
- 'nym-vpn-core/crates/test/**'
20+
- 'nym-vpn-core/crates/nym-vpnd/**'
21+
- 'nym-vpn-core/crates/nym-vpnc/**'
22+
- 'nym-vpn-core/crates/nym-vpn-lib/**'
23+
- 'nym-vpn-core/crates/nym-vpn-proto/**'
24+
workflow_dispatch:
25+
inputs:
26+
test_name:
27+
description: 'Test name to run (default: basic_functionality)'
28+
required: false
29+
default: 'basic_functionality'
30+
vm_config:
31+
description: 'VM config name'
32+
required: false
33+
default: 'ci-test-vm'
34+
35+
env:
36+
CARGO_TERM_COLOR: always
37+
RUST_BACKTRACE: 1
38+
39+
jobs:
40+
build-and-test:
41+
name: Build and Test
42+
runs-on: ubuntu-latest
43+
timeout-minutes: 60
44+
45+
steps:
46+
- name: Checkout repository
47+
uses: actions/checkout@v4
48+
49+
- name: Install system dependencies
50+
run: |
51+
sudo apt-get update
52+
sudo apt-get install -y \
53+
git \
54+
build-essential \
55+
pkg-config \
56+
libpcap-dev \
57+
libssl-dev \
58+
protobuf-compiler \
59+
rootlesskit \
60+
slirp4netns \
61+
procps \
62+
nftables \
63+
wireguard-tools \
64+
dnsmasq \
65+
curl \
66+
qemu-system-x86_64 \
67+
qemu-utils \
68+
podman
69+
70+
- name: Install Rust toolchain
71+
uses: dtolnay/rust-toolchain@stable
72+
with:
73+
targets: x86_64-unknown-linux-gnu
74+
75+
- name: Cache Cargo registry
76+
uses: actions/cache@v4
77+
with:
78+
path: |
79+
~/.cargo/registry
80+
~/.cargo/git
81+
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
82+
restore-keys: |
83+
${{ runner.os }}-cargo-
84+
85+
- name: Cache Cargo build artifacts
86+
uses: actions/cache@v4
87+
with:
88+
path: |
89+
nym-vpn-core/target
90+
nym-vpn-core/crates/test/target
91+
key: ${{ runner.os }}-test-harness-${{ hashFiles('nym-vpn-core/**/Cargo.lock') }}
92+
restore-keys: |
93+
${{ runner.os }}-test-harness-
94+
95+
- name: Build WireGuard library
96+
working-directory: wireguard
97+
run: |
98+
./build-wireguard-go.sh
99+
100+
- name: Build test-runner and connection-checker
101+
working-directory: nym-vpn-core/crates/test
102+
run: |
103+
if command -v podman &> /dev/null; then
104+
./scripts/container-run.sh ./scripts/build/test-runner.sh linux
105+
else
106+
cargo build --release --target x86_64-unknown-linux-gnu \
107+
-p test-runner \
108+
-p connection-checker
109+
fi
110+
111+
- name: Build Nym VPN binaries
112+
working-directory: nym-vpn-core
113+
run: |
114+
cargo build --release \
115+
-p nym-vpnd \
116+
-p nym-vpnc
117+
118+
- name: Verify binaries
119+
run: |
120+
echo "Built binaries:"
121+
ls -lh nym-vpn-core/crates/test/target/x86_64-unknown-linux-gnu/release/test-runner || echo "test-runner not found"
122+
ls -lh nym-vpn-core/crates/test/target/x86_64-unknown-linux-gnu/release/connection-checker || echo "connection-checker not found"
123+
ls -lh nym-vpn-core/target/release/nym-vpnd || echo "nym-vpnd not found"
124+
ls -lh nym-vpn-core/target/release/nym-vpnc || echo "nym-vpnc not found"
125+
126+
- name: Prepare package directory
127+
run: |
128+
mkdir -p ~/.cache/nym-test/packages
129+
PACKAGE_DIR=~/.cache/nym-test/packages
130+
131+
cp nym-vpn-core/crates/test/target/x86_64-unknown-linux-gnu/release/test-runner "$PACKAGE_DIR/" || true
132+
cp nym-vpn-core/crates/test/target/x86_64-unknown-linux-gnu/release/connection-checker "$PACKAGE_DIR/" || true
133+
cp nym-vpn-core/target/release/nym-vpnd "$PACKAGE_DIR/" || true
134+
cp nym-vpn-core/target/release/nym-vpnc "$PACKAGE_DIR/" || true
135+
136+
ls -lh "$PACKAGE_DIR/"
137+
138+
- name: Download or create QCOW2 image
139+
id: qcow_image
140+
run: |
141+
# TODO: Download QCOW2 image from builds.ci.nymte.ch
142+
echo "image_exists=false" >> $GITHUB_OUTPUT
143+
144+
- name: Configure VM
145+
if: steps.qcow_image.outputs.image_exists == 'true'
146+
working-directory: nym-vpn-core/crates/test/test-manager
147+
env:
148+
NYM_TEST_QCOW_IMAGE: ${{ steps.qcow_image.outputs.image_path }}
149+
NYM_TEST_VM_CONFIG: ${{ github.event.inputs.vm_config || 'ci-test-vm' }}
150+
run: |
151+
cargo run --release -- config vm set \
152+
"$NYM_TEST_VM_CONFIG" \
153+
qemu \
154+
"$NYM_TEST_QCOW_IMAGE" \
155+
linux \
156+
--package-type deb \
157+
--architecture x64 \
158+
--provisioner ssh \
159+
--ssh-user test \
160+
--ssh-password test \
161+
--vcpus 2 \
162+
--memory 2048
163+
164+
- name: Run tests
165+
if: steps.qcow_image.outputs.image_exists == 'true'
166+
working-directory: nym-vpn-core/crates/test/test-manager
167+
env:
168+
NYM_TEST_QCOW_IMAGE: ${{ steps.qcow_image.outputs.image_path }}
169+
NYM_TEST_VM_CONFIG: ${{ github.event.inputs.vm_config || 'ci-test-vm' }}
170+
MAINNET_MNEMONIC: ${{ secrets.MAINNET_MNEMONIC || 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about' }}
171+
PACKAGE_DIR: ~/.cache/nym-test/packages
172+
run: |
173+
TEST_NAME="${{ github.event.inputs.test_name || 'basic_functionality' }}"
174+
175+
cargo run --release -- run-tests \
176+
--vm "$NYM_TEST_VM_CONFIG" \
177+
--runner-dir "$PACKAGE_DIR" \
178+
--nym-mnemonic "$MAINNET_MNEMONIC" \
179+
--verbose \
180+
"$TEST_NAME"
181+
182+
- name: Upload test binaries
183+
if: always()
184+
uses: actions/upload-artifact@v4
185+
with:
186+
name: test-binaries
187+
path: |
188+
nym-vpn-core/crates/test/target/x86_64-unknown-linux-gnu/release/test-runner
189+
nym-vpn-core/crates/test/target/x86_64-unknown-linux-gnu/release/connection-checker
190+
nym-vpn-core/target/release/nym-vpnd
191+
nym-vpn-core/target/release/nym-vpnc
192+
retention-days: 7
193+
194+
- name: Upload test results
195+
if: always() && steps.qcow_image.outputs.image_exists == 'true'
196+
uses: actions/upload-artifact@v4
197+
with:
198+
name: test-results
199+
path: |
200+
nym-vpn-core/crates/test/test-manager/target/**/*.log
201+
retention-days: 7
202+
203+
- name: Comment on PR
204+
if: always() && github.event_name == 'pull_request'
205+
uses: actions/github-script@v7
206+
with:
207+
script: |
208+
const qcowExists = '${{ steps.qcow_image.outputs.image_exists }}' === 'true';
209+
const testsPassed = '${{ steps.run_tests.outcome }}' === 'success';
210+
211+
let body = '## 🧪 Test Harness Results\n\n';
212+
213+
if (!qcowExists) {
214+
body += '⚠️ Tests were skipped because no QCOW2 image is available.\n';
215+
body += '✅ Binaries built successfully and are available as artifacts.';
216+
} else if (testsPassed) {
217+
body += '✅ All tests passed successfully!';
218+
} else {
219+
body += '❌ Some tests failed. Check the test results artifact for details.';
220+
}
221+
222+
github.rest.issues.createComment({
223+
issue_number: context.issue.number,
224+
owner: context.repo.owner,
225+
repo: context.repo.repo,
226+
body: body
227+
});

0 commit comments

Comments
 (0)