-
Notifications
You must be signed in to change notification settings - Fork 105
184 lines (162 loc) · 6.01 KB
/
network-contention-test.yml
File metadata and controls
184 lines (162 loc) · 6.01 KB
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
182
183
184
name: wolfSSH Network Contention Test
on:
push:
branches: [ 'master', 'main', 'release/**' ]
pull_request:
branches: [ '*' ]
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
create_matrix:
runs-on: ubuntu-latest
outputs:
versions: ${{ steps.json.outputs.versions }}
steps:
- name: Create wolfSSL version matrix
id: json
run: |
current=`curl -s https://api.github.com/repos/wolfssl/wolfssl/releases | grep tag_name | cut -d : -f 2,3 | tr -d \" | tr -d , | tr -d ' ' | head -1`
last=`curl -s https://api.github.com/repos/wolfssl/wolfssl/releases | grep tag_name | cut -d : -f 2,3 | tr -d \" | tr -d , | tr -d ' ' | head -2 | tail -1`
VERSIONS=$(echo "[ \"master\", \"$current\", \"$last\" ]")
echo "wolfSSL versions found: $VERSIONS"
echo "versions=$VERSIONS" >> $GITHUB_OUTPUT
build_wolfssl:
needs: create_matrix
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest ]
wolfssl: ${{ fromJson(needs.create_matrix.outputs['versions']) }}
name: Build wolfssl
runs-on: ${{ matrix.os }}
timeout-minutes: 4
steps:
- name: Checking cache for wolfssl
uses: actions/cache@v4
id: cache-wolfssl
with:
path: build-dir/
key: wolfssh-contention-wolfssl-${{ matrix.wolfssl }}-${{ matrix.os }}
lookup-only: true
- name: Checkout, build, and install wolfssl
if: steps.cache-wolfssl.outputs.cache-hit != 'true'
uses: wolfSSL/actions-build-autotools-project@v1
with:
repository: wolfssl/wolfssl
ref: ${{ matrix.wolfssl }}
path: wolfssl
configure: --enable-ssh
check: false
install: true
test_sftp_contention:
needs:
- build_wolfssl
- create_matrix
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest ]
wolfssl: ${{ fromJson(needs.create_matrix.outputs['versions']) }}
block_prob: [ 30, 50, 70 ]
name: SFTP contention test (prob=${{ matrix.block_prob }}%)
runs-on: ${{ matrix.os }}
timeout-minutes: 15
steps:
- name: Checking cache for wolfssl
uses: actions/cache@v4
with:
path: build-dir/
key: wolfssh-contention-wolfssl-${{ matrix.wolfssl }}-${{ matrix.os }}
fail-on-cache-miss: true
- uses: actions/checkout@v4
with:
path: wolfssh/
- name: autogen
working-directory: ./wolfssh/
run: ./autogen.sh
- name: configure with TEST_BLOCK
working-directory: ./wolfssh/
run: |
./configure --enable-sftp \
LDFLAGS="-L${{ github.workspace }}/build-dir/lib" \
CPPFLAGS="-I${{ github.workspace }}/build-dir/include -DWOLFSSH_TEST_BLOCK -DWOLFSSH_BLOCK_PROB=${{ matrix.block_prob }} -DWOLFSSH_NO_FPKI"
- name: make
working-directory: ./wolfssh/
run: make
- name: Setup network delay with tc/netem
run: |
sudo tc qdisc add dev lo root netem delay 10ms 5ms loss 0.1%
echo "Network delay configured:"
tc qdisc show dev lo
- name: Run SFTP contention tests
working-directory: ./wolfssh/
timeout-minutes: 10
run: ./scripts/sftp.test
- name: Install expect for extended tests
run: sudo apt-get update && sudo apt-get install -y expect
- name: Create large test files
run: |
dd if=/dev/urandom of=/tmp/test_1kb.dat bs=1K count=1
dd if=/dev/urandom of=/tmp/test_2mb.dat bs=1M count=2
dd if=/dev/urandom of=/tmp/test_10mb.dat bs=1M count=10
md5sum /tmp/test_*.dat > /tmp/test_checksums.md5
echo "Test files created:"
ls -la /tmp/test_*.dat
- name: Run extended SFTP file transfer tests
working-directory: ./wolfssh/
timeout-minutes: 10
run: |
# Start echoserver in non-blocking mode
./examples/echoserver/echoserver -N -f &
SERVER_PID=$!
sleep 2
# Create expect script for file transfers
cat > /tmp/sftp_test.exp << 'EXPECTEOF'
#!/usr/bin/expect -f
set timeout 120
set testfile [lindex $argv 0]
set outfile [lindex $argv 1]
spawn ./examples/sftpclient/wolfsftp -N -h 127.0.0.1 -p 22222 -u jill
expect "Password:"
send "upthehill\r"
expect "wolfSSH sftp>"
send "get $testfile $outfile\r"
expect "wolfSSH sftp>"
send "exit\r"
expect eof
EXPECTEOF
chmod +x /tmp/sftp_test.exp
# Test 1KB file transfer
echo "Testing 1KB file transfer..."
/tmp/sftp_test.exp /tmp/test_1kb.dat /tmp/recv_1kb.dat
if ! cmp -s /tmp/test_1kb.dat /tmp/recv_1kb.dat; then
echo "FAILED: 1KB file integrity check"
kill $SERVER_PID 2>/dev/null || true
exit 1
fi
echo "1KB file transfer: PASSED"
# Test 2MB file transfer
echo "Testing 2MB file transfer..."
/tmp/sftp_test.exp /tmp/test_2mb.dat /tmp/recv_2mb.dat
if ! cmp -s /tmp/test_2mb.dat /tmp/recv_2mb.dat; then
echo "FAILED: 2MB file integrity check"
kill $SERVER_PID 2>/dev/null || true
exit 1
fi
echo "2MB file transfer: PASSED"
# Test 10MB file transfer
echo "Testing 10MB file transfer..."
/tmp/sftp_test.exp /tmp/test_10mb.dat /tmp/recv_10mb.dat
if ! cmp -s /tmp/test_10mb.dat /tmp/recv_10mb.dat; then
echo "FAILED: 10MB file integrity check"
kill $SERVER_PID 2>/dev/null || true
exit 1
fi
echo "10MB file transfer: PASSED"
kill $SERVER_PID 2>/dev/null || true
echo "All extended SFTP tests PASSED"
- name: Cleanup network delay
if: always()
run: sudo tc qdisc del dev lo root netem || true