-
Notifications
You must be signed in to change notification settings - Fork 117
181 lines (159 loc) · 5.51 KB
/
functional_tests.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
name: Functional tests
on:
push:
branches:
- main
- "releases/**"
pull_request:
branches:
- main
- "releases/**"
# Restrict tests to the most recent commit.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build_test_app:
name: Build Test Client
runs-on: ubuntu-22.04
outputs:
matrix: ${{ steps.testGen.outputs.tests }}
steps:
- name: Clone repository
uses: actions/checkout@v3
with:
submodules: 'recursive'
- name: Install build dependecies
run: |
sudo apt-get update
sudo apt-get install -y $(./scripts/linux/getdeps.py -a linux/debian/control)
- name: Cache grcov
id: cache-grcov
uses: actions/cache@v3
with:
path: grcov-build/
key: ${{runner.os}}-grcov-v0.8.13
- name: Install Grcov
if: steps.cache-grcov.outputs.cache-hit != 'true'
shell: bash
run: |
cargo install grcov --root ${{github.workspace}}/grcov-build --version 0.8.13
- name: Compile test client
shell: bash
if: steps.cache-build.outputs.cache-hit != 'true'
run: |
pip3 install -r requirements.txt
mkdir -p build/cmake
mkdir -p build/profile
cmake -S $(pwd) -B build/cmake \
-DCMAKE_CXX_FLAGS="--coverage -fprofile-generate=$(pwd)/build/profile" \
-DCMAKE_EXE_LINKER_FLAGS="--coverage -fprofile-generate=$(pwd)/build/profile"
cmake --build build/cmake -j$(nproc) --target dummyvpn
mkdir -p build/profile
rsync -a --include '*/' --include '*.gcno' --exclude '*' \
build/cmake/tests/dummyvpn/CMakeFiles/dummyvpn.dir/ build/profile/
cp ./build/cmake/tests/dummyvpn/dummyvpn build/
- name: Compile test addons
shell: bash
if: steps.cache-build.outputs.cache-hit != 'true'
run: |
mkdir -p build/addons
cmake -S $(pwd)/tests/functional/addons -B build/addons
cmake --build build/addons
- uses: actions/upload-artifact@v3
with:
name: test-client-${{ github.sha }}
path: |
build/
!build/cmake/
- name: Generate tasklist
id: testGen
shell: bash
run: |
echo -n "tests=" >> $GITHUB_OUTPUT
for test in $(find tests/functional -name 'test*.js' | sort); do
printf '{"name": "%s", "path": "%s"}' $(basename ${test%.js} | sed -n 's/test//p') $test
done | jq -s -c >> $GITHUB_OUTPUT
- name: Check tests
shell: bash
env:
TEST_LIST: ${{ steps.testGen.outputs.tests }}
run: |
echo $TEST_LIST | jq
functionaltests:
name: Functional tests
needs:
- build_test_app
runs-on: ubuntu-22.04
timeout-minutes: 45
strategy:
fail-fast: false # Don't cancel other jobs if a test fails
matrix:
test: ${{ fromJson(needs.build_test_app.outputs.matrix) }}
steps:
- name: Clone repository
uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
name: test-client-${{ github.sha }}
path: build/
- name: Install test dependecies
run: |
sudo apt-get update
sudo apt-get install -y $(./scripts/linux/getdeps.py -r linux/debian/control)
sudo apt install --no-upgrade firefox xvfb -y
pip3 install -r requirements.txt
npm install
- name: Cache grcov
id: cache-grcov
uses: actions/cache@v3
with:
path: grcov-build/
key: ${{runner.os}}-grcov-v0.8.13
- name: Check build
shell: bash
run: |
chmod +x ./build/dummyvpn
./build/dummyvpn -v
chmod +x ${{github.workspace}}/grcov-build/bin/grcov
${{github.workspace}}/grcov-build/bin/grcov --version
- name: Running ${{matrix.test.name}} Tests
id: runTests
uses: nick-invision/retry@v2
with:
timeout_minutes: 15
max_attempts: 3
command: |
export PATH=$GECKOWEBDRIVER:$(npm bin):$PATH
export HEADLESS=yes
export TZ=Europe/London
mkdir -p $ARTIFACT_DIR
xvfb-run -a npm run functionalTest -- --retries 3 ${{matrix.test.path}}
env:
ARTIFACT_DIR: ${{ runner.temp }}/artifacts
MVPN_BIN: ./build/dummyvpn
MVPN_ADDONS_PATH: ./build/addons
- name: Generating grcov reports
id: generateGrcov
continue-on-error: true # Ignore GRCOV parsing errors, see github.com/mozilla/grcov/issues/570
timeout-minutes: 1 # Give GRCOV a short timeout in case it hangs after a panic
run: |
export PATH=${{github.workspace}}/grcov-build/bin:$PATH
grcov build/profile \
-s src -t lcov --branch --ignore-not-existing \
-o ${{runner.temp}}/artifacts/functional_lcov.info
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
if: steps.generateGrcov.outcome == 'success'
with:
directory: .
flags: functional_tests
name: codecov-poc
files: ${{runner.temp}}/artifacts/functional_lcov.info
verbose: true
- name: Uploading artifacts
uses: actions/upload-artifact@v3
if: ${{ always() }}
with:
name: ${{matrix.test.name}} Logs
path: ${{ runner.temp }}/artifacts