-
Notifications
You must be signed in to change notification settings - Fork 39
304 lines (266 loc) · 12.4 KB
/
tests.yml
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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
name: Tests
on:
push:
branches: '**'
tags-ignore: '**'
pull_request:
jobs:
Static-Code-Checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.9'
- name: Install pip Dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install --user fusepy pytest lz4 PySquashfsImage asyncssh fsspec
- name: Style Check With Black
run: |
python3 -m pip install black
black -q --diff --line-length 120 --skip-string-normalization ratarmount.py tests/*.py core/ratarmountcore/*.py > black.diff
if [ -s black.diff ]; then
cat black.diff
exit 123
fi
- name: Lint With Codespell
run: |
python3 -m pip install codespell
codespell $( git ls-tree -r --name-only HEAD | 'grep' -E '[.](py|md|txt|sh|yml)' )
- name: Lint With Flake8
run: |
python3 -m pip install flake8
flake8 --config tests/.flake8 *.py tests/*.py core/ratarmountcore/[^_]*.py
- name: Lint With Pylint
run: |
python3 -m pip install pylint
pylint --rcfile tests/.pylintrc *.py tests/*.py core/ratarmountcore/*.py | tee pylint.log
! 'egrep' ': E[0-9]{4}: ' pylint.log
- name: Lint With Pytype
run: |
python3 -m pip install pytype
pytype -d import-error -P$( cd core && pwd ):$( pwd ) ratarmount.py core/ratarmountcore/*.py
- name: Lint With Mypy
run: |
yes | python3 -m pip install --upgrade-strategy eager --upgrade types-dataclasses mypy
mypy --config-file tests/.mypy.ini *.py core/ratarmountcore/*.py
yes | python3 -m pip uninstall types-dataclasses
- name: Lint With ShellCheck
run: |
sudo apt-get -y install shellcheck
shellcheck -e SC2064 tests/*.sh
Tests:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: ['macos-13', 'ubuntu-latest']
# macos-13 / macos-latest does not work anymore because the dependencies don't have any wheels,
# probably because it is M1 based.
# ToDo: Add windows-latest but it requires a lot of setup of the dependencies!
# Maybe only test ratarmount-core without most dependencies after I have split that off.
# Oldest and newest versions should be enough. Python versions are supported 5 years from release date.
# https://endoflife.date/python
# 3.5 was released 2015-09-13 and end-of-life was 2020-09-13
# 3.6 was released 2016-12-23 and end-of-life was 2021-12-23
# 3.7 was released 2018-06-27 and end-of-life was 2023-06-27
# 3.8 was released 2019-10-14 and end-of-life will be 2024-10-14
# 3.9 was released 2020-10-05 and end-of-life will be 2025-10-25
# 3.10 was released 2021-10-04 and end-of-life will be 2026-10-04
# 3.11 was released 2022-10-24 and end-of-life will be 2027-10
# 3.12 was released 2023-10-02 and end-of-life will be 2028-10
# 3.13 is to be released 2024-10
# 3.14 is to be released 2025-10
python-version: ['3.9', '3.12', '3.13']
include:
- os: ubuntu-latest
python-version: '3.14.0-alpha.0'
defaults:
run:
# This is especially important for windows because it seems to default to powershell
shell: bash
steps:
- uses: actions/checkout@v4
with:
# We need one tag for testing the git mount.
# This is BROKEN! God damn it. Is anything working at all...
# https://github.com/actions/checkout/issues/1781
fetch-tags: true
- name: Fetch tag for tests
run: git fetch origin refs/tags/v0.15.2:refs/tags/v0.15.2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Print System Information
run: |
echo "uname -a: $( uname -a )"
echo "Shell: $SHELL"
echo "Cores: $( nproc )"
echo "Mount points:"; mount
- uses: msys2/setup-msys2@v2
if: startsWith( matrix.os, 'windows' )
with:
install: gcc make liblzma-devel libzstd-devel zlib-devel
- name: Install Dependencies (Linux)
if: startsWith( matrix.os, 'ubuntu' )
run: |
# Libarchive calls the grzip, lrzip, lzop binaries for lrzip support. Others, such as bzip2, gzip, lz4, lzma,
# zstd, may also call external binaries depending on how libarchive was compiled!
# https://github.com/libarchive/libarchive/blob/ad5a0b542c027883d7069f6844045e6788c7d70c/libarchive/
# archive_read_support_filter_lrzip.c#L68
sudo apt-get -y install libfuse2 fuse3 bzip2 pbzip2 pixz zstd unar lrzip lzop gcc liblzo2-dev ruby-webrick
- name: Install Dependencies For Unreleased Python Versions (Linux)
if: >
startsWith( matrix.os, 'ubuntu' ) && (
matrix.python-version == '3.13' ||
matrix.python-version == '3.14.0-alpha.0')
run: |
#libgit2-dev is too old on Ubuntu 22.04. Leads to error about missing git2/sys/errors.h
#sudo apt-get -y install libgit2-dev
sudo apt-get -y install cmake
git clone --branch v1.8.1 --depth 1 https://github.com/libgit2/libgit2.git
( cd libgit2 && mkdir build && cd build && cmake .. && cmake --build . && sudo cmake --build . -- install )
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib" >> "$GITHUB_ENV"
# Expects exactly libgit2 1.8.x! Therefore install it here instead via the non-pinned ratarmount dependencies.
python3 -m pip install pygit2==1.15
- name: Install Dependencies (MacOS)
if: startsWith( matrix.os, 'macos' )
run: |
# coreutils is required for the tests written in shell, e.g., for the 'realpath' command
# unar is required for rar tests with passwords. By default, bsdtar is installed but that is the only
# one of the three supported tools (the third is unrar) that does not support passwords.
# And the error message is atrocious:
# cmdline.extend(args)
# TypeError: 'NoneType' object is not iterable
brew install macfuse coreutils pixz pbzip2 zstd unar libarchive lrzip lzop lzo
# Add brew installation binary folder to PATH so that command line tools like zstd can be found
echo PATH="$PATH:/usr/local/bin" >> "$GITHUB_ENV"
- name: Install Dependencies For Unreleased Python Versions (MacOS)
if: >
startsWith( matrix.os, 'macos' ) && (
matrix.python-version == '3.13' ||
matrix.python-version == '3.14.0-alpha.0')
run: |
brew install [email protected]
brew link [email protected] --force
# Expects exactly libgit2 1.8.x! Therefore install it here instead via the non-pinned ratarmount dependencies.
python3 -m pip install pygit2==1.15
- name: Install pip Dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade wheel
python3 -m pip install --upgrade setuptools
python3 -m pip install --upgrade-strategy eager --upgrade twine build fusepy cffi
- name: Test Startup With Only One Compression Dependency
run: |
for module in indexed_gzip indexed_zstd lzmaffi python-xz; do
python3 -m pip install --upgrade "$module"
# Segfaults (139) are not allowed but other exit codes are valid!
# indexed_zstd=1.2.0 did segfault here!
python3 ratarmount.py README.md || [ $? != 139 ]
python3 -m pip uninstall --yes "$module"
done
python3 -m pip install --upgrade 'git+https://github.com/mxmlnkn/indexed_bzip2.git@master#egginfo=rapidgzip&subdirectory=python/rapidgzip'
- name: Test ratarmountcore Installation From Tarball
working-directory: core
run: |
python3 -m build
twine check dist/*
python3 -m pip install "$( find dist -name '*.tar.gz' | head -1 )"[full]
- name: Test Installation From Tarball
run: |
python3 -m build
# Around commit 08ddc8fb3679faacd6e54eb5c54104995b045dc4, I had some very weird twine check failures
# because .tar.gz tarballs were wrongly recognized as ZIP files by CPython's zipfile.is_zipfile.
# Therefore, try recompressing the tarballs with different compression levels until it does not randomly
# look like a ZIP anymore. It is an ugly hack, but so is zipfile.is_zipfile.
tarball=$( find dist -name '*.tar.gz' )
if python3 -c 'import sys, zipfile; sys.exit(0 if zipfile.is_zipfile(sys.argv[1]) else 1)' "$tarball"; then
gzip -c -d "$tarball" > "$tarball.tar"
for (( i=9; i>0; --i )); do
cat "$tarball.tar" | gzip -$i > "$tarball"
if ! python3 -c 'import sys, zipfile; sys.exit(0 if zipfile.is_zipfile(sys.argv[1]) else 1)' "$tarball"
then break; fi
done
fi
twine check dist/*
python3 -m pip install "$( find dist -name '*.tar.gz' | head -1 )"[full]
- name: Test Installation From Source
run: |
python3 -m pip install .[full]
- name: Test Simple Startup
run: |
ratarmount --help
ratarmount --version
- name: Test Simple Mount
# macOS 11+ is too uptight about "security" and is not able to fully load the macfuse kernel extension.
# https://github.com/actions/runner-images/issues/4731
if: ${{ !startsWith( matrix.os, 'macos' ) }}
run: |
ratarmount tests/single-file.tar mimi
ls -la mimi
sleep 1s
# MacOS does not have fusermount!
ratarmount -u mimi
- name: Test Startup Without Compression Dependencies
if: ${{ !startsWith( matrix.os, 'macos' ) }}
run: |
# Segfaults (139) are not allowed but other exit codes are valid!
python3 ratarmount.py tests/simple.bz2 || [ $? != 139 ]
- name: Unit Tests
run: |
python3 -m pip install pytest pytest-xdist pandas
for file in core/tests/test_*.py tests/test_*.py; do
case "$file" in
"tests/test_cli.py")
if ! uname | 'grep' -q -i darwin; then
# First off, n=auto seems to use the physical cores and ignores virtual ones.
# Secondly, these tests scale much better than the others because most time is spent waiting for
# the FUSE mount point to appear or disappear, which doesn't seem to be bottlenecked by CPU usage.
python3 -X dev -W ignore::DeprecationWarning:fuse -u \
-c "import pytest, re, sys; sys.exit(pytest.console_main())" \
-n 16 --disable-warnings "$testFile"
fi
;;
"core/tests/test_AutoMountLayer.py"\
|"core/tests/test_BlockParallelReaders.py"\
|"core/tests/test_LibarchiveMountSource.py"\
|"core/tests/test_SQLiteIndexedTar.py")
echo "$file" # pytest-xdist seems to omit the test file name
pytest -n auto --disable-warnings "$file"
;;
*)
# Fusepy warns about usage of use_ns because the implicit behavior is deprecated.
# But there has been no development to fusepy for 4 years, so I think it should be fine to ignore.
pytest --disable-warnings "$file"
esac
done
python3 tests/tests.py
- name: Install pip Test Dependencies
run: |
python3 -m pip install -r tests/requirements-tests.txt
- name: Install Test Dependencies (Linux)
if: ${{ !startsWith( matrix.os, 'macos' ) }}
run: |
sudo bash tests/install-smbd.sh
- name: Regression Tests (FUSE 3)
if: ${{ !startsWith( matrix.os, 'macos' ) }}
env:
DROPBOX_TOKEN: ${{ secrets.DROPBOX_TOKEN }}
run: |
export FUSE_LIBRARY_PATH=$( dpkg -L libfuse3-3 | 'grep' -F .so | head -1 )
ratarmount --version
bash tests/runtests.sh
- name: Regression Tests (FUSE 2)
if: ${{ !startsWith( matrix.os, 'macos' ) }}
env:
DROPBOX_TOKEN: ${{ secrets.DROPBOX_TOKEN }}
run: |
bash tests/runtests.sh
python3 -c 'import pygit2'
- name: Module tests without fusepy
run: |
python3 -m pip uninstall -y fusepy
python3 tests/tests.py