sbuild (Debian sbuild) 0.86.3~bpo12+1 (03 November 2024) on debusine-worker-amd64-hades-05.freexian.com
+==============================================================================+
| locust 2.24.0-1 (amd64) Fri, 15 Nov 2024 11:54:23 +0000 |
+==============================================================================+
Package: locust
Version: 2.24.0-1
Source Version: 2.24.0-1
Distribution: sid
Machine Architecture: amd64
Host Architecture: amd64
Build Architecture: amd64
Build Type: binary
I: No tarballs found in /var/lib/debusine/worker/.cache/sbuild
Unpacking /var/lib/debusine/worker/system-images/957754/system.tar.xz to /tmp/tmp.sbuild.cm7kK6VO1O...
I: NOTICE: Log filtering will replace 'sbuild-unshare-dummy-location' with '<<CHROOT>>'
+------------------------------------------------------------------------------+
| Chroot Setup Commands |
+------------------------------------------------------------------------------+
rm -f /etc/resolv.conf
----------------------
I: Finished running 'rm -f /etc/resolv.conf'.
Finished processing commands.
--------------------------------------------------------------------------------
Copying /tmp/debusine-fetch-exec-upload-006vdbx6/dpkg-dbgsym_1.22.12~1.gbp82cafd_arm64.deb to /<<CHROOT>>...
Copying /tmp/debusine-fetch-exec-upload-006vdbx6/dpkg_1.22.12~1.gbp82cafd_arm64.deb to /<<CHROOT>>...
Copying /tmp/debusine-fetch-exec-upload-006vdbx6/dselect-dbgsym_1.22.12~1.gbp82cafd_arm64.deb to /<<CHROOT>>...
Copying /tmp/debusine-fetch-exec-upload-006vdbx6/dselect_1.22.12~1.gbp82cafd_arm64.deb to /<<CHROOT>>...
Copying /tmp/debusine-fetch-exec-upload-006vdbx6/libdpkg-dev_1.22.12~1.gbp82cafd_arm64.deb to /<<CHROOT>>...
Copying /tmp/debusine-fetch-exec-upload-006vdbx6/dpkg-dev_1.22.12~1.gbp82cafd_all.deb to /<<CHROOT>>...
Copying /tmp/debusine-fetch-exec-upload-006vdbx6/libdpkg-perl_1.22.12~1.gbp82cafd_all.deb to /<<CHROOT>>...
I: NOTICE: Log filtering will replace 'build/locust-cyH7lt/resolver-hLKVYs' with '<<RESOLVERDIR>>'
+------------------------------------------------------------------------------+
| Update chroot |
+------------------------------------------------------------------------------+
Get:1 file:/build/locust-cyH7lt/resolver-OsCGsh/apt_archive ./ InRelease
Ign:1 file:/build/locust-cyH7lt/resolver-OsCGsh/apt_archive ./ InRelease
Get:2 file:/build/locust-cyH7lt/resolver-OsCGsh/apt_archive ./ Release [606 B]
Get:2 file:/build/locust-cyH7lt/resolver-OsCGsh/apt_archive ./ Release [606 B]
Get:3 file:/build/locust-cyH7lt/resolver-OsCGsh/apt_archive ./ Release.gpg
Ign:3 file:/build/locust-cyH7lt/resolver-OsCGsh/apt_archive ./ Release.gpg
Get:4 file:/build/locust-cyH7lt/resolver-OsCGsh/apt_archive ./ Packages [9246 B]
Get:5 http://deb.debian.org/debian sid InRelease [202 kB]
Get:6 http://deb.debian.org/debian sid/main amd64 Packages [10.0 MB]
Get:7 http://deb.debian.org/debian sid/main amd64 Components [4979 kB]
Fetched 15.2 MB in 2s (9490 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
The following packages will be upgraded:
apt bsdextrautils bsdutils dpkg-dev libapt-pkg6.0t64 libaudit-common
libaudit1 libblkid1 libbrotli1 libcap-ng0 libdpkg-perl libglib2.0-0t64
libmount1 libpcre2-8-0 libseccomp2 libselinux1 libsemanage2 libsmartcols1
libuuid1 libxml2 login mount util-linux
23 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 7670 kB/9654 kB of archives.
After this operation, 366 kB disk space will be freed.
Get:1 file:/build/locust-cyH7lt/resolver-OsCGsh/apt_archive ./ dpkg-dev 1.22.12~1.gbp82cafd [1337 kB]
Get:2 file:/build/locust-cyH7lt/resolver-OsCGsh/apt_archive ./ libdpkg-perl 1.22.12~1.gbp82cafd [647 kB]
Get:3 http://deb.debian.org/debian sid/main amd64 bsdutils amd64 1:2.40.2-11 [105 kB]
Get:4 http://deb.debian.org/debian sid/main amd64 bsdextrautils amd64 2.40.2-11 [91.5 kB]
Get:5 http://deb.debian.org/debian sid/main amd64 libblkid1 amd64 2.40.2-11 [168 kB]
Get:6 http://deb.debian.org/debian sid/main amd64 libmount1 amd64 2.40.2-11 [199 kB]
Get:7 http://deb.debian.org/debian sid/main amd64 libsmartcols1 amd64 2.40.2-11 [139 kB]
Get:8 http://deb.debian.org/debian sid/main amd64 mount amd64 2.40.2-11 [155 kB]
Get:9 http://deb.debian.org/debian sid/main amd64 libuuid1 amd64 2.40.2-11 [35.9 kB]
Get:10 http://deb.debian.org/debian sid/main amd64 util-linux amd64 2.40.2-11 [1213 kB]
Get:11 http://deb.debian.org/debian sid/main amd64 libpcre2-8-0 amd64 10.44-2 [275 kB]
Get:12 http://deb.debian.org/debian sid/main amd64 libselinux1 amd64 3.7-3+b1 [77.0 kB]
Get:13 http://deb.debian.org/debian sid/main amd64 libapt-pkg6.0t64 amd64 2.9.11 [1043 kB]
Get:14 http://deb.debian.org/debian sid/main amd64 libseccomp2 amd64 2.5.5-1+b3 [47.4 kB]
Get:15 http://deb.debian.org/debian sid/main amd64 apt amd64 2.9.11 [1362 kB]
Get:16 http://deb.debian.org/debian sid/main amd64 libaudit-common all 1:4.0.2-2 [12.7 kB]
Get:17 http://deb.debian.org/debian sid/main amd64 libcap-ng0 amd64 0.8.5-3+b1 [17.5 kB]
Get:18 http://deb.debian.org/debian sid/main amd64 libaudit1 amd64 1:4.0.2-2 [54.9 kB]
Get:19 http://deb.debian.org/debian sid/main amd64 login amd64 1:4.16.0-2+really2.40.2-11 [81.5 kB]
Get:20 http://deb.debian.org/debian sid/main amd64 libbrotli1 amd64 1.1.0-2+b6 [302 kB]
Get:21 http://deb.debian.org/debian sid/main amd64 libglib2.0-0t64 amd64 2.82.2-3 [1501 kB]
Get:22 http://deb.debian.org/debian sid/main amd64 libsemanage2 amd64 3.7-2+b1 [91.2 kB]
Get:23 http://deb.debian.org/debian sid/main amd64 libxml2 amd64 2.12.7+dfsg+really2.9.14-0.2+b1 [699 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 7670 kB in 0s (58.9 MB/s)
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16880 files and directories currently installed.)
Preparing to unpack .../bsdutils_1%3a2.40.2-11_amd64.deb ...
Unpacking bsdutils (1:2.40.2-11) over (1:2.40.2-10) ...
Setting up bsdutils (1:2.40.2-11) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16880 files and directories currently installed.)
Preparing to unpack .../bsdextrautils_2.40.2-11_amd64.deb ...
Unpacking bsdextrautils (2.40.2-11) over (2.40.2-10) ...
Preparing to unpack .../libblkid1_2.40.2-11_amd64.deb ...
Unpacking libblkid1:amd64 (2.40.2-11) over (2.40.2-10) ...
Setting up libblkid1:amd64 (2.40.2-11) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16876 files and directories currently installed.)
Preparing to unpack .../libmount1_2.40.2-11_amd64.deb ...
Unpacking libmount1:amd64 (2.40.2-11) over (2.40.2-10) ...
Setting up libmount1:amd64 (2.40.2-11) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16876 files and directories currently installed.)
Preparing to unpack .../libsmartcols1_2.40.2-11_amd64.deb ...
Unpacking libsmartcols1:amd64 (2.40.2-11) over (2.40.2-10) ...
Setting up libsmartcols1:amd64 (2.40.2-11) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16876 files and directories currently installed.)
Preparing to unpack .../mount_2.40.2-11_amd64.deb ...
Unpacking mount (2.40.2-11) over (2.40.2-10) ...
Preparing to unpack .../libuuid1_2.40.2-11_amd64.deb ...
Unpacking libuuid1:amd64 (2.40.2-11) over (2.40.2-10) ...
Setting up libuuid1:amd64 (2.40.2-11) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16876 files and directories currently installed.)
Preparing to unpack .../util-linux_2.40.2-11_amd64.deb ...
Unpacking util-linux (2.40.2-11) over (2.40.2-10) ...
Setting up util-linux (2.40.2-11) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16873 files and directories currently installed.)
Preparing to unpack .../libpcre2-8-0_10.44-2_amd64.deb ...
Unpacking libpcre2-8-0:amd64 (10.44-2) over (10.42-4+b2) ...
Setting up libpcre2-8-0:amd64 (10.44-2) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16872 files and directories currently installed.)
Preparing to unpack .../libselinux1_3.7-3+b1_amd64.deb ...
Unpacking libselinux1:amd64 (3.7-3+b1) over (3.7-3) ...
Setting up libselinux1:amd64 (3.7-3+b1) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16873 files and directories currently installed.)
Preparing to unpack .../libapt-pkg6.0t64_2.9.11_amd64.deb ...
Unpacking libapt-pkg6.0t64:amd64 (2.9.11) over (2.9.10) ...
Setting up libapt-pkg6.0t64:amd64 (2.9.11) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16873 files and directories currently installed.)
Preparing to unpack .../libseccomp2_2.5.5-1+b3_amd64.deb ...
Unpacking libseccomp2:amd64 (2.5.5-1+b3) over (2.5.5-1+b2) ...
Setting up libseccomp2:amd64 (2.5.5-1+b3) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16873 files and directories currently installed.)
Preparing to unpack .../archives/apt_2.9.11_amd64.deb ...
Unpacking apt (2.9.11) over (2.9.10) ...
Setting up apt (2.9.11) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16870 files and directories currently installed.)
Preparing to unpack .../libaudit-common_1%3a4.0.2-2_all.deb ...
Unpacking libaudit-common (1:4.0.2-2) over (1:4.0.1-3) ...
Setting up libaudit-common (1:4.0.2-2) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16870 files and directories currently installed.)
Preparing to unpack .../libcap-ng0_0.8.5-3+b1_amd64.deb ...
Unpacking libcap-ng0:amd64 (0.8.5-3+b1) over (0.8.5-3) ...
Setting up libcap-ng0:amd64 (0.8.5-3+b1) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16871 files and directories currently installed.)
Preparing to unpack .../libaudit1_1%3a4.0.2-2_amd64.deb ...
Unpacking libaudit1:amd64 (1:4.0.2-2) over (1:4.0.1-3) ...
Setting up libaudit1:amd64 (1:4.0.2-2) ...
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 16871 files and directories currently installed.)
Preparing to unpack .../0-login_1%3a4.16.0-2+really2.40.2-11_amd64.deb ...
Unpacking login (1:4.16.0-2+really2.40.2-11) over (1:4.16.0-2+really2.40.2-10) ...
Preparing to unpack .../1-dpkg-dev_1.22.12~1.gbp82cafd_all.deb ...
Unpacking dpkg-dev (1.22.12~1.gbp82cafd) over (1.22.11) ...
Preparing to unpack .../2-libdpkg-perl_1.22.12~1.gbp82cafd_all.deb ...
Unpacking libdpkg-perl (1.22.12~1.gbp82cafd) over (1.22.11) ...
Preparing to unpack .../3-libbrotli1_1.1.0-2+b6_amd64.deb ...
Unpacking libbrotli1:amd64 (1.1.0-2+b6) over (1.1.0-2+b5) ...
Preparing to unpack .../4-libglib2.0-0t64_2.82.2-3_amd64.deb ...
Unpacking libglib2.0-0t64:amd64 (2.82.2-3) over (2.82.2-2) ...
Preparing to unpack .../5-libsemanage2_3.7-2+b1_amd64.deb ...
Unpacking libsemanage2:amd64 (3.7-2+b1) over (3.7-2) ...
Preparing to unpack .../6-libxml2_2.12.7+dfsg+really2.9.14-0.2+b1_amd64.deb ...
Unpacking libxml2:amd64 (2.12.7+dfsg+really2.9.14-0.2+b1) over (2.12.7+dfsg+really2.9.14-0.1) ...
Setting up bsdextrautils (2.40.2-11) ...
Setting up libbrotli1:amd64 (1.1.0-2+b6) ...
Setting up libglib2.0-0t64:amd64 (2.82.2-3) ...
No schema files found: doing nothing.
Setting up libdpkg-perl (1.22.12~1.gbp82cafd) ...
Setting up mount (2.40.2-11) ...
Setting up libsemanage2:amd64 (3.7-2+b1) ...
Setting up libxml2:amd64 (2.12.7+dfsg+really2.9.14-0.2+b1) ...
Setting up login (1:4.16.0-2+really2.40.2-11) ...
Setting up dpkg-dev (1.22.12~1.gbp82cafd) ...
Processing triggers for man-db (2.13.0-1) ...
Processing triggers for libc-bin (2.40-3) ...
+------------------------------------------------------------------------------+
| Fetch source files |
+------------------------------------------------------------------------------+
Local sources
-------------
/tmp/debusine-fetch-exec-upload-006vdbx6/locust_2.24.0-1.dsc exists in /tmp/debusine-fetch-exec-upload-006vdbx6; copying to chroot
I: NOTICE: Log filtering will replace 'build/locust-cyH7lt/locust-2.24.0' with '<<PKGBUILDDIR>>'
I: NOTICE: Log filtering will replace 'build/locust-cyH7lt' with '<<BUILDDIR>>'
+------------------------------------------------------------------------------+
| Install package build dependencies |
+------------------------------------------------------------------------------+
Setup apt archive
-----------------
Merged Build-Depends: debhelper-compat (= 13), pybuild-plugin-pyproject, python3-all, python3-configargparse (>= 1.5.5), python3-cryptography, python3-flask-cors, python3-flask-login (>= 0.6.3), python3-geventhttpclient (>= 2.0.8), python3-msgpack (>= 0.6.2), python3-psutil (>= 5.6.7), python3-pyquery (>= 1.4.3), python3-pytest, python3-requests (>= 2.9.1), python3-retry, python3-roundrobin, python3-setuptools, python3-typing-extensions, python3-zmq (>= 16.0.2), build-essential, fakeroot
Filtered Build-Depends: debhelper-compat (= 13), pybuild-plugin-pyproject, python3-all, python3-configargparse (>= 1.5.5), python3-cryptography, python3-flask-cors, python3-flask-login (>= 0.6.3), python3-geventhttpclient (>= 2.0.8), python3-msgpack (>= 0.6.2), python3-psutil (>= 5.6.7), python3-pyquery (>= 1.4.3), python3-pytest, python3-requests (>= 2.9.1), python3-retry, python3-roundrobin, python3-setuptools, python3-typing-extensions, python3-zmq (>= 16.0.2), build-essential, fakeroot
dpkg-deb: building package 'sbuild-build-depends-main-dummy' in '/<<RESOLVERDIR>>/apt_archive/sbuild-build-depends-main-dummy.deb'.
Ign:1 copy:/<<RESOLVERDIR>>/apt_archive ./ InRelease
Get:2 copy:/<<RESOLVERDIR>>/apt_archive ./ Release [615 B]
Ign:3 copy:/<<RESOLVERDIR>>/apt_archive ./ Release.gpg
Get:4 copy:/<<RESOLVERDIR>>/apt_archive ./ Sources [1191 B]
Get:5 copy:/<<RESOLVERDIR>>/apt_archive ./ Packages [1070 B]
Fetched 2876 B in 0s (0 B/s)
Reading package lists...
Get:1 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ InRelease
Ign:1 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ InRelease
Get:2 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ Release [606 B]
Get:2 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ Release [606 B]
Get:3 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ Release.gpg
Ign:3 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ Release.gpg
Reading package lists...
Reading package lists...
Install main build dependencies (apt-based resolver)
----------------------------------------------------
Installing build dependencies
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
autoconf automake autopoint autotools-dev build-essential cpp cpp-14
cpp-14-x86-64-linux-gnu cpp-x86-64-linux-gnu debhelper dh-autoreconf
dh-python dh-strip-nondeterminism dwz fakeroot fonts-font-awesome fonts-lato
g++ g++-14 g++-14-x86-64-linux-gnu g++-x86-64-linux-gnu gcc gcc-14
gcc-14-x86-64-linux-gnu gcc-x86-64-linux-gnu libasan8 libc-dev-bin libc6-dev
libcares2 libcc1-0 libcrypt-dev libdebhelper-perl libelf1t64 libev4t64
libexpat1 libfakeroot libfile-stripnondeterminism-perl libgcc-14-dev
libhwasan0 libisl23 libitm1 libjs-jquery libjs-sphinxdoc libjs-underscore
liblsan0 libmpc3 libmpfr6 libncursesw6 libnorm1t64 libnsl2 libpgm-5.3-0t64
libpython3-stdlib libpython3.12-minimal libpython3.12-stdlib
libpython3.13-minimal libpython3.13-stdlib libquadmath0 libsodium23
libstdc++-14-dev libtirpc-common libtirpc3t64 libtool libtsan2 libubsan1
libxslt1.1 libzmq5 linux-libc-dev m4 media-types po-debconf
pybuild-plugin-pyproject python3 python3-all python3-autocommand
python3-bcrypt python3-blinker python3-brotli python3-build python3-certifi
python3-cffi-backend python3-chardet python3-charset-normalizer
python3-click python3-colorama python3-configargparse python3-cryptography
python3-cssselect python3-decorator python3-flask python3-flask-cors
python3-flask-login python3-gevent python3-geventhttpclient python3-greenlet
python3-idna python3-inflect python3-iniconfig python3-installer
python3-itsdangerous python3-jaraco.context python3-jaraco.functools
python3-jaraco.text python3-jinja2 python3-lxml python3-markupsafe
python3-minimal python3-more-itertools python3-msgpack python3-packaging
python3-pkg-resources python3-pluggy python3-psutil python3-py
python3-pyproject-hooks python3-pyquery python3-pytest python3-requests
python3-retry python3-roundrobin python3-setuptools python3-six python3-toml
python3-typeguard python3-typing-extensions python3-urllib3 python3-webob
python3-werkzeug python3-wheel python3-zipp python3-zmq python3-zope.event
python3-zope.interface python3.12 python3.12-minimal python3.13
python3.13-minimal rpcsvc-proto sphinx-rtd-theme-common
Suggested packages:
autoconf-archive gnu-standards autoconf-doc cpp-doc gcc-14-locales
cpp-14-doc dh-make flit g++-multilib g++-14-multilib gcc-14-doc gcc-multilib
manpages-dev flex bison gdb gcc-doc gcc-14-multilib gdb-x86-64-linux-gnu
libc-devtools glibc-doc libstdc++-14-doc libtool-doc gfortran
| fortran95-compiler gcj-jdk m4-doc libmail-box-perl python3-doc python3-tk
python3-venv python-blinker-doc python3-pip python-build-doc
python-charset-normalizer-doc python-cryptography-doc
python3-cryptography-vectors python-flask-doc python-flask-login-doc
python-gevent-doc python3-openssl python-greenlet-dev python-greenlet-doc
python-installer-doc python-jinja2-doc python-lxml-doc subversion
python3-socks python-requests-doc python-setuptools-doc python-webob-doc
ipython3 python-werkzeug-doc python3-watchdog python3.12-venv python3.12-doc
binfmt-support python3.13-venv python3.13-doc
Recommended packages:
manpages manpages-dev libarchive-cpio-perl javascript-common libgpm2
libltdl-dev libmail-sendmail-perl python3-asgiref python3-dotenv
python3-simplejson python3-babel python3-bs4 python3-html5lib
python3-pygments python3-openssl python3-pyinotify
The following NEW packages will be installed:
autoconf automake autopoint autotools-dev build-essential cpp cpp-14
cpp-14-x86-64-linux-gnu cpp-x86-64-linux-gnu debhelper dh-autoreconf
dh-python dh-strip-nondeterminism dwz fakeroot fonts-font-awesome fonts-lato
g++ g++-14 g++-14-x86-64-linux-gnu g++-x86-64-linux-gnu gcc gcc-14
gcc-14-x86-64-linux-gnu gcc-x86-64-linux-gnu libasan8 libc-dev-bin libc6-dev
libcares2 libcc1-0 libcrypt-dev libdebhelper-perl libelf1t64 libev4t64
libexpat1 libfakeroot libfile-stripnondeterminism-perl libgcc-14-dev
libhwasan0 libisl23 libitm1 libjs-jquery libjs-sphinxdoc libjs-underscore
liblsan0 libmpc3 libmpfr6 libncursesw6 libnorm1t64 libnsl2 libpgm-5.3-0t64
libpython3-stdlib libpython3.12-minimal libpython3.12-stdlib
libpython3.13-minimal libpython3.13-stdlib libquadmath0 libsodium23
libstdc++-14-dev libtirpc-common libtirpc3t64 libtool libtsan2 libubsan1
libxslt1.1 libzmq5 linux-libc-dev m4 media-types po-debconf
pybuild-plugin-pyproject python3 python3-all python3-autocommand
python3-bcrypt python3-blinker python3-brotli python3-build python3-certifi
python3-cffi-backend python3-chardet python3-charset-normalizer
python3-click python3-colorama python3-configargparse python3-cryptography
python3-cssselect python3-decorator python3-flask python3-flask-cors
python3-flask-login python3-gevent python3-geventhttpclient python3-greenlet
python3-idna python3-inflect python3-iniconfig python3-installer
python3-itsdangerous python3-jaraco.context python3-jaraco.functools
python3-jaraco.text python3-jinja2 python3-lxml python3-markupsafe
python3-minimal python3-more-itertools python3-msgpack python3-packaging
python3-pkg-resources python3-pluggy python3-psutil python3-py
python3-pyproject-hooks python3-pyquery python3-pytest python3-requests
python3-retry python3-roundrobin python3-setuptools python3-six python3-toml
python3-typeguard python3-typing-extensions python3-urllib3 python3-webob
python3-werkzeug python3-wheel python3-zipp python3-zmq python3-zope.event
python3-zope.interface python3.12 python3.12-minimal python3.13
python3.13-minimal rpcsvc-proto sbuild-build-depends-main-dummy
sphinx-rtd-theme-common
0 upgraded, 139 newly installed, 0 to remove and 0 not upgraded.
Need to get 96.0 MB of archives.
After this operation, 362 MB of additional disk space will be used.
Get:1 copy:/<<RESOLVERDIR>>/apt_archive ./ sbuild-build-depends-main-dummy 0.invalid.0 [1064 B]
Get:2 http://deb.debian.org/debian sid/main amd64 fonts-lato all 2.015-1 [2780 kB]
Get:3 http://deb.debian.org/debian sid/main amd64 libpython3.12-minimal amd64 3.12.7-3 [815 kB]
Get:4 http://deb.debian.org/debian sid/main amd64 libexpat1 amd64 2.6.4-1 [106 kB]
Get:5 http://deb.debian.org/debian sid/main amd64 python3.12-minimal amd64 3.12.7-3 [2162 kB]
Get:6 http://deb.debian.org/debian sid/main amd64 python3-minimal amd64 3.12.7-1 [26.8 kB]
Get:7 http://deb.debian.org/debian sid/main amd64 media-types all 10.1.0 [26.9 kB]
Get:8 http://deb.debian.org/debian sid/main amd64 libncursesw6 amd64 6.5-2+b1 [136 kB]
Get:9 http://deb.debian.org/debian sid/main amd64 libtirpc-common all 1.3.4+ds-1.3 [10.9 kB]
Get:10 http://deb.debian.org/debian sid/main amd64 libtirpc3t64 amd64 1.3.4+ds-1.3+b1 [83.1 kB]
Get:11 http://deb.debian.org/debian sid/main amd64 libnsl2 amd64 1.3.0-3+b3 [40.6 kB]
Get:12 http://deb.debian.org/debian sid/main amd64 libpython3.12-stdlib amd64 3.12.7-3 [1966 kB]
Get:13 http://deb.debian.org/debian sid/main amd64 python3.12 amd64 3.12.7-3 [671 kB]
Get:14 http://deb.debian.org/debian sid/main amd64 libpython3-stdlib amd64 3.12.7-1 [9712 B]
Get:15 http://deb.debian.org/debian sid/main amd64 python3 amd64 3.12.7-1 [27.8 kB]
Get:16 http://deb.debian.org/debian sid/main amd64 libpython3.13-minimal amd64 3.13.0-2 [856 kB]
Get:17 http://deb.debian.org/debian sid/main amd64 python3.13-minimal amd64 3.13.0-2 [2038 kB]
Get:18 http://deb.debian.org/debian sid/main amd64 m4 amd64 1.4.19-4 [287 kB]
Get:19 http://deb.debian.org/debian sid/main amd64 autoconf all 2.72-3 [493 kB]
Get:20 http://deb.debian.org/debian sid/main amd64 autotools-dev all 20220109.1 [51.6 kB]
Get:21 http://deb.debian.org/debian sid/main amd64 automake all 1:1.16.5-1.3 [823 kB]
Get:22 http://deb.debian.org/debian sid/main amd64 autopoint all 0.22.5-2 [723 kB]
Get:23 http://deb.debian.org/debian sid/main amd64 libc-dev-bin amd64 2.40-3 [51.8 kB]
Get:24 http://deb.debian.org/debian sid/main amd64 linux-libc-dev all 6.11.7-1 [2454 kB]
Get:25 http://deb.debian.org/debian sid/main amd64 libcrypt-dev amd64 1:4.4.36-5 [118 kB]
Get:26 http://deb.debian.org/debian sid/main amd64 rpcsvc-proto amd64 1.4.3-1 [63.3 kB]
Get:27 http://deb.debian.org/debian sid/main amd64 libc6-dev amd64 2.40-3 [1956 kB]
Get:28 http://deb.debian.org/debian sid/main amd64 libisl23 amd64 0.27-1 [659 kB]
Get:29 http://deb.debian.org/debian sid/main amd64 libmpfr6 amd64 4.2.1-1+b2 [724 kB]
Get:30 http://deb.debian.org/debian sid/main amd64 libmpc3 amd64 1.3.1-1+b3 [52.2 kB]
Get:31 http://deb.debian.org/debian sid/main amd64 cpp-14-x86-64-linux-gnu amd64 14.2.0-8 [11.1 MB]
Get:32 http://deb.debian.org/debian sid/main amd64 cpp-14 amd64 14.2.0-8 [1276 B]
Get:33 http://deb.debian.org/debian sid/main amd64 cpp-x86-64-linux-gnu amd64 4:14.2.0-1 [4840 B]
Get:34 http://deb.debian.org/debian sid/main amd64 cpp amd64 4:14.2.0-1 [1568 B]
Get:35 http://deb.debian.org/debian sid/main amd64 libcc1-0 amd64 14.2.0-8 [42.8 kB]
Get:36 http://deb.debian.org/debian sid/main amd64 libitm1 amd64 14.2.0-8 [25.9 kB]
Get:37 http://deb.debian.org/debian sid/main amd64 libasan8 amd64 14.2.0-8 [2729 kB]
Get:38 http://deb.debian.org/debian sid/main amd64 liblsan0 amd64 14.2.0-8 [1205 kB]
Get:39 http://deb.debian.org/debian sid/main amd64 libtsan2 amd64 14.2.0-8 [2461 kB]
Get:40 http://deb.debian.org/debian sid/main amd64 libubsan1 amd64 14.2.0-8 [1075 kB]
Get:41 http://deb.debian.org/debian sid/main amd64 libhwasan0 amd64 14.2.0-8 [1489 kB]
Get:42 http://deb.debian.org/debian sid/main amd64 libquadmath0 amd64 14.2.0-8 [145 kB]
Get:43 http://deb.debian.org/debian sid/main amd64 libgcc-14-dev amd64 14.2.0-8 [2674 kB]
Get:44 http://deb.debian.org/debian sid/main amd64 gcc-14-x86-64-linux-gnu amd64 14.2.0-8 [21.4 MB]
Get:45 http://deb.debian.org/debian sid/main amd64 gcc-14 amd64 14.2.0-8 [530 kB]
Get:46 http://deb.debian.org/debian sid/main amd64 gcc-x86-64-linux-gnu amd64 4:14.2.0-1 [1436 B]
Get:47 http://deb.debian.org/debian sid/main amd64 gcc amd64 4:14.2.0-1 [5136 B]
Get:48 http://deb.debian.org/debian sid/main amd64 libstdc++-14-dev amd64 14.2.0-8 [2369 kB]
Get:49 http://deb.debian.org/debian sid/main amd64 g++-14-x86-64-linux-gnu amd64 14.2.0-8 [12.1 MB]
Get:50 http://deb.debian.org/debian sid/main amd64 g++-14 amd64 14.2.0-8 [20.2 kB]
Get:51 http://deb.debian.org/debian sid/main amd64 g++-x86-64-linux-gnu amd64 4:14.2.0-1 [1200 B]
Get:52 http://deb.debian.org/debian sid/main amd64 g++ amd64 4:14.2.0-1 [1344 B]
Get:53 http://deb.debian.org/debian sid/main amd64 build-essential amd64 12.12 [4624 B]
Get:54 http://deb.debian.org/debian sid/main amd64 libdebhelper-perl all 13.20 [89.7 kB]
Get:55 http://deb.debian.org/debian sid/main amd64 libtool all 2.4.7-8 [517 kB]
Get:56 http://deb.debian.org/debian sid/main amd64 dh-autoreconf all 20 [17.1 kB]
Get:57 http://deb.debian.org/debian sid/main amd64 libfile-stripnondeterminism-perl all 1.14.0-1 [19.5 kB]
Get:58 http://deb.debian.org/debian sid/main amd64 dh-strip-nondeterminism all 1.14.0-1 [8448 B]
Get:59 http://deb.debian.org/debian sid/main amd64 libelf1t64 amd64 0.192-4 [189 kB]
Get:60 http://deb.debian.org/debian sid/main amd64 dwz amd64 0.15-1+b1 [110 kB]
Get:61 http://deb.debian.org/debian sid/main amd64 po-debconf all 1.0.21+nmu1 [248 kB]
Get:62 http://deb.debian.org/debian sid/main amd64 debhelper all 13.20 [915 kB]
Get:63 http://deb.debian.org/debian sid/main amd64 python3-autocommand all 2.2.2-3 [13.6 kB]
Get:64 http://deb.debian.org/debian sid/main amd64 python3-more-itertools all 10.5.0-1 [63.8 kB]
Get:65 http://deb.debian.org/debian sid/main amd64 python3-typing-extensions all 4.12.2-2 [73.0 kB]
Get:66 http://deb.debian.org/debian sid/main amd64 python3-typeguard all 4.4.1-1 [37.0 kB]
Get:67 http://deb.debian.org/debian sid/main amd64 python3-inflect all 7.3.1-2 [32.4 kB]
Get:68 http://deb.debian.org/debian sid/main amd64 python3-jaraco.context all 6.0.0-1 [7984 B]
Get:69 http://deb.debian.org/debian sid/main amd64 python3-jaraco.functools all 4.1.0-1 [12.0 kB]
Get:70 http://deb.debian.org/debian sid/main amd64 python3-pkg-resources all 75.2.0-1 [213 kB]
Get:71 http://deb.debian.org/debian sid/main amd64 python3-jaraco.text all 4.0.0-1 [11.4 kB]
Get:72 http://deb.debian.org/debian sid/main amd64 python3-zipp all 3.21.0-1 [10.6 kB]
Get:73 http://deb.debian.org/debian sid/main amd64 python3-setuptools all 75.2.0-1 [731 kB]
Get:74 http://deb.debian.org/debian sid/main amd64 dh-python all 6.20241024 [109 kB]
Get:75 http://deb.debian.org/debian sid/main amd64 libfakeroot amd64 1.36-1 [29.1 kB]
Get:76 http://deb.debian.org/debian sid/main amd64 fakeroot amd64 1.36-1 [75.1 kB]
Get:77 http://deb.debian.org/debian sid/main amd64 fonts-font-awesome all 5.0.10+really4.7.0~dfsg-4.1 [517 kB]
Get:78 http://deb.debian.org/debian sid/main amd64 libcares2 amd64 1.34.2-1 [92.7 kB]
Get:79 http://deb.debian.org/debian sid/main amd64 libev4t64 amd64 1:4.33-2.1+b1 [42.4 kB]
Get:80 http://deb.debian.org/debian sid/main amd64 libjs-jquery all 3.6.1+dfsg+~3.5.14-1 [326 kB]
Get:81 http://deb.debian.org/debian sid/main amd64 libjs-underscore all 1.13.4~dfsg+~1.11.4-3 [116 kB]
Get:82 http://deb.debian.org/debian sid/main amd64 libjs-sphinxdoc all 7.4.7-4 [158 kB]
Get:83 http://deb.debian.org/debian sid/main amd64 libnorm1t64 amd64 1.5.9+dfsg-3.1+b1 [221 kB]
Get:84 http://deb.debian.org/debian sid/main amd64 libpgm-5.3-0t64 amd64 5.3.128~dfsg-2.1+b1 [162 kB]
Get:85 http://deb.debian.org/debian sid/main amd64 libpython3.13-stdlib amd64 3.13.0-2 [1992 kB]
Get:86 http://deb.debian.org/debian sid/main amd64 libsodium23 amd64 1.0.18-1+b2 [165 kB]
Get:87 http://deb.debian.org/debian sid/main amd64 libxslt1.1 amd64 1.1.35-1.1+b1 [233 kB]
Get:88 http://deb.debian.org/debian sid/main amd64 libzmq5 amd64 4.3.5-1+b3 [283 kB]
Get:89 http://deb.debian.org/debian sid/main amd64 python3-packaging all 24.1-1 [45.8 kB]
Get:90 http://deb.debian.org/debian sid/main amd64 python3-pyproject-hooks all 1.2.0-1 [11.7 kB]
Get:91 http://deb.debian.org/debian sid/main amd64 python3-toml all 0.10.2-1 [16.2 kB]
Get:92 http://deb.debian.org/debian sid/main amd64 python3-wheel all 0.44.0-2 [53.4 kB]
Get:93 http://deb.debian.org/debian sid/main amd64 python3-build all 1.2.2-1 [36.0 kB]
Get:94 http://deb.debian.org/debian sid/main amd64 python3-installer all 0.7.0+dfsg1-3 [18.6 kB]
Get:95 http://deb.debian.org/debian sid/main amd64 pybuild-plugin-pyproject all 6.20241024 [11.4 kB]
Get:96 http://deb.debian.org/debian sid/main amd64 python3.13 amd64 3.13.0-2 [730 kB]
Get:97 http://deb.debian.org/debian sid/main amd64 python3-all amd64 3.12.7-1 [1052 B]
Get:98 http://deb.debian.org/debian sid/main amd64 python3-bcrypt amd64 4.2.0-2 [210 kB]
Get:99 http://deb.debian.org/debian sid/main amd64 python3-blinker all 1.8.2-1 [13.1 kB]
Get:100 http://deb.debian.org/debian sid/main amd64 python3-brotli amd64 1.1.0-2+b6 [321 kB]
Get:101 http://deb.debian.org/debian sid/main amd64 python3-certifi all 2024.8.30+dfsg-1 [9576 B]
Get:102 http://deb.debian.org/debian sid/main amd64 python3-cffi-backend amd64 1.17.1-2+b1 [96.2 kB]
Get:103 http://deb.debian.org/debian sid/main amd64 python3-chardet all 5.2.0+dfsg-1 [107 kB]
Get:104 http://deb.debian.org/debian sid/main amd64 python3-charset-normalizer amd64 3.4.0-1+b1 [140 kB]
Get:105 http://deb.debian.org/debian sid/main amd64 python3-colorama all 0.4.6-4 [36.2 kB]
Get:106 http://deb.debian.org/debian sid/main amd64 python3-click all 8.1.7-2 [94.3 kB]
Get:107 http://deb.debian.org/debian sid/main amd64 python3-configargparse all 1.7-2 [31.4 kB]
Get:108 http://deb.debian.org/debian sid/main amd64 python3-cryptography amd64 43.0.0-1 [935 kB]
Get:109 http://deb.debian.org/debian sid/main amd64 python3-cssselect all 1.2.0-4 [21.7 kB]
Get:110 http://deb.debian.org/debian sid/main amd64 python3-decorator all 5.1.1-5 [15.1 kB]
Get:111 http://deb.debian.org/debian sid/main amd64 python3-itsdangerous all 2.2.0-1 [18.0 kB]
Get:112 http://deb.debian.org/debian sid/main amd64 python3-markupsafe amd64 2.1.5-1+b2 [13.9 kB]
Get:113 http://deb.debian.org/debian sid/main amd64 python3-jinja2 all 3.1.3-1 [119 kB]
Get:114 http://deb.debian.org/debian sid/main amd64 python3-werkzeug all 3.0.4-1 [207 kB]
Get:115 http://deb.debian.org/debian sid/main amd64 python3-flask all 3.0.3-1 [104 kB]
Get:116 http://deb.debian.org/debian sid/main amd64 sphinx-rtd-theme-common all 3.0.1+dfsg-1 [1022 kB]
Get:117 http://deb.debian.org/debian sid/main amd64 python3-flask-cors all 5.0.0-1 [46.3 kB]
Get:118 http://deb.debian.org/debian sid/main amd64 python3-flask-login all 0.6.3-2 [22.8 kB]
Get:119 http://deb.debian.org/debian sid/main amd64 python3-greenlet amd64 3.1.0-1+b1 [179 kB]
Get:120 http://deb.debian.org/debian sid/main amd64 python3-zope.event all 5.0-0.1 [8164 B]
Get:121 http://deb.debian.org/debian sid/main amd64 python3-zope.interface amd64 7.1.1-1+b1 [151 kB]
Get:122 http://deb.debian.org/debian sid/main amd64 python3-gevent amd64 24.2.1-1 [763 kB]
Get:123 http://deb.debian.org/debian sid/main amd64 python3-six all 1.16.0-7 [16.4 kB]
Get:124 http://deb.debian.org/debian sid/main amd64 python3-geventhttpclient amd64 2.0.11-2+b1 [38.9 kB]
Get:125 http://deb.debian.org/debian sid/main amd64 python3-idna all 3.8-2 [41.6 kB]
Get:126 http://deb.debian.org/debian sid/main amd64 python3-iniconfig all 1.1.1-2 [6396 B]
Get:127 http://deb.debian.org/debian sid/main amd64 python3-lxml amd64 5.3.0-1+b1 [1676 kB]
Get:128 http://deb.debian.org/debian sid/main amd64 python3-msgpack amd64 1.0.3-3+b2 [80.4 kB]
Get:129 http://deb.debian.org/debian sid/main amd64 python3-pluggy all 1.5.0-1 [26.9 kB]
Get:130 http://deb.debian.org/debian sid/main amd64 python3-psutil amd64 5.9.8-2 [225 kB]
Get:131 http://deb.debian.org/debian sid/main amd64 python3-py all 1.11.0-2 [88.7 kB]
Get:132 http://deb.debian.org/debian sid/main amd64 python3-webob all 1:1.8.7-1 [88.2 kB]
Get:133 http://deb.debian.org/debian sid/main amd64 python3-pyquery all 1.4.3-1 [23.1 kB]
Get:134 http://deb.debian.org/debian sid/main amd64 python3-pytest all 8.3.3-1 [249 kB]
Get:135 http://deb.debian.org/debian sid/main amd64 python3-urllib3 all 2.0.7-2 [111 kB]
Get:136 http://deb.debian.org/debian sid/main amd64 python3-requests all 2.32.3+dfsg-1 [71.9 kB]
Get:137 http://deb.debian.org/debian sid/main amd64 python3-retry all 0.9.2-3 [7088 B]
Get:138 http://deb.debian.org/debian sid/main amd64 python3-roundrobin all 0.0.4-3 [4364 B]
Get:139 http://deb.debian.org/debian sid/main amd64 python3-zmq amd64 24.0.1-5+b2 [269 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 96.0 MB in 1s (90.1 MB/s)
Selecting previously unselected package fonts-lato.
(Reading database ... 16873 files and directories currently installed.)
Preparing to unpack .../fonts-lato_2.015-1_all.deb ...
Unpacking fonts-lato (2.015-1) ...
Selecting previously unselected package libpython3.12-minimal:amd64.
Preparing to unpack .../libpython3.12-minimal_3.12.7-3_amd64.deb ...
Unpacking libpython3.12-minimal:amd64 (3.12.7-3) ...
Selecting previously unselected package libexpat1:amd64.
Preparing to unpack .../libexpat1_2.6.4-1_amd64.deb ...
Unpacking libexpat1:amd64 (2.6.4-1) ...
Selecting previously unselected package python3.12-minimal.
Preparing to unpack .../python3.12-minimal_3.12.7-3_amd64.deb ...
Unpacking python3.12-minimal (3.12.7-3) ...
Setting up libpython3.12-minimal:amd64 (3.12.7-3) ...
Setting up libexpat1:amd64 (2.6.4-1) ...
Setting up python3.12-minimal (3.12.7-3) ...
Selecting previously unselected package python3-minimal.
(Reading database ... 17218 files and directories currently installed.)
Preparing to unpack .../0-python3-minimal_3.12.7-1_amd64.deb ...
Unpacking python3-minimal (3.12.7-1) ...
Selecting previously unselected package media-types.
Preparing to unpack .../1-media-types_10.1.0_all.deb ...
Unpacking media-types (10.1.0) ...
Selecting previously unselected package libncursesw6:amd64.
Preparing to unpack .../2-libncursesw6_6.5-2+b1_amd64.deb ...
Unpacking libncursesw6:amd64 (6.5-2+b1) ...
Selecting previously unselected package libtirpc-common.
Preparing to unpack .../3-libtirpc-common_1.3.4+ds-1.3_all.deb ...
Unpacking libtirpc-common (1.3.4+ds-1.3) ...
Selecting previously unselected package libtirpc3t64:amd64.
Preparing to unpack .../4-libtirpc3t64_1.3.4+ds-1.3+b1_amd64.deb ...
Adding 'diversion of /lib/x86_64-linux-gnu/libtirpc.so.3 to /lib/x86_64-linux-gnu/libtirpc.so.3.usr-is-merged by libtirpc3t64'
Adding 'diversion of /lib/x86_64-linux-gnu/libtirpc.so.3.0.0 to /lib/x86_64-linux-gnu/libtirpc.so.3.0.0.usr-is-merged by libtirpc3t64'
Unpacking libtirpc3t64:amd64 (1.3.4+ds-1.3+b1) ...
Selecting previously unselected package libnsl2:amd64.
Preparing to unpack .../5-libnsl2_1.3.0-3+b3_amd64.deb ...
Unpacking libnsl2:amd64 (1.3.0-3+b3) ...
Selecting previously unselected package libpython3.12-stdlib:amd64.
Preparing to unpack .../6-libpython3.12-stdlib_3.12.7-3_amd64.deb ...
Unpacking libpython3.12-stdlib:amd64 (3.12.7-3) ...
Selecting previously unselected package python3.12.
Preparing to unpack .../7-python3.12_3.12.7-3_amd64.deb ...
Unpacking python3.12 (3.12.7-3) ...
Selecting previously unselected package libpython3-stdlib:amd64.
Preparing to unpack .../8-libpython3-stdlib_3.12.7-1_amd64.deb ...
Unpacking libpython3-stdlib:amd64 (3.12.7-1) ...
Setting up python3-minimal (3.12.7-1) ...
Selecting previously unselected package python3.
(Reading database ... 17691 files and directories currently installed.)
Preparing to unpack .../000-python3_3.12.7-1_amd64.deb ...
Unpacking python3 (3.12.7-1) ...
Selecting previously unselected package libpython3.13-minimal:amd64.
Preparing to unpack .../001-libpython3.13-minimal_3.13.0-2_amd64.deb ...
Unpacking libpython3.13-minimal:amd64 (3.13.0-2) ...
Selecting previously unselected package python3.13-minimal.
Preparing to unpack .../002-python3.13-minimal_3.13.0-2_amd64.deb ...
Unpacking python3.13-minimal (3.13.0-2) ...
Selecting previously unselected package m4.
Preparing to unpack .../003-m4_1.4.19-4_amd64.deb ...
Unpacking m4 (1.4.19-4) ...
Selecting previously unselected package autoconf.
Preparing to unpack .../004-autoconf_2.72-3_all.deb ...
Unpacking autoconf (2.72-3) ...
Selecting previously unselected package autotools-dev.
Preparing to unpack .../005-autotools-dev_20220109.1_all.deb ...
Unpacking autotools-dev (20220109.1) ...
Selecting previously unselected package automake.
Preparing to unpack .../006-automake_1%3a1.16.5-1.3_all.deb ...
Unpacking automake (1:1.16.5-1.3) ...
Selecting previously unselected package autopoint.
Preparing to unpack .../007-autopoint_0.22.5-2_all.deb ...
Unpacking autopoint (0.22.5-2) ...
Selecting previously unselected package libc-dev-bin.
Preparing to unpack .../008-libc-dev-bin_2.40-3_amd64.deb ...
Unpacking libc-dev-bin (2.40-3) ...
Selecting previously unselected package linux-libc-dev.
Preparing to unpack .../009-linux-libc-dev_6.11.7-1_all.deb ...
Unpacking linux-libc-dev (6.11.7-1) ...
Selecting previously unselected package libcrypt-dev:amd64.
Preparing to unpack .../010-libcrypt-dev_1%3a4.4.36-5_amd64.deb ...
Unpacking libcrypt-dev:amd64 (1:4.4.36-5) ...
Selecting previously unselected package rpcsvc-proto.
Preparing to unpack .../011-rpcsvc-proto_1.4.3-1_amd64.deb ...
Unpacking rpcsvc-proto (1.4.3-1) ...
Selecting previously unselected package libc6-dev:amd64.
Preparing to unpack .../012-libc6-dev_2.40-3_amd64.deb ...
Unpacking libc6-dev:amd64 (2.40-3) ...
Selecting previously unselected package libisl23:amd64.
Preparing to unpack .../013-libisl23_0.27-1_amd64.deb ...
Unpacking libisl23:amd64 (0.27-1) ...
Selecting previously unselected package libmpfr6:amd64.
Preparing to unpack .../014-libmpfr6_4.2.1-1+b2_amd64.deb ...
Unpacking libmpfr6:amd64 (4.2.1-1+b2) ...
Selecting previously unselected package libmpc3:amd64.
Preparing to unpack .../015-libmpc3_1.3.1-1+b3_amd64.deb ...
Unpacking libmpc3:amd64 (1.3.1-1+b3) ...
Selecting previously unselected package cpp-14-x86-64-linux-gnu.
Preparing to unpack .../016-cpp-14-x86-64-linux-gnu_14.2.0-8_amd64.deb ...
Unpacking cpp-14-x86-64-linux-gnu (14.2.0-8) ...
Selecting previously unselected package cpp-14.
Preparing to unpack .../017-cpp-14_14.2.0-8_amd64.deb ...
Unpacking cpp-14 (14.2.0-8) ...
Selecting previously unselected package cpp-x86-64-linux-gnu.
Preparing to unpack .../018-cpp-x86-64-linux-gnu_4%3a14.2.0-1_amd64.deb ...
Unpacking cpp-x86-64-linux-gnu (4:14.2.0-1) ...
Selecting previously unselected package cpp.
Preparing to unpack .../019-cpp_4%3a14.2.0-1_amd64.deb ...
Unpacking cpp (4:14.2.0-1) ...
Selecting previously unselected package libcc1-0:amd64.
Preparing to unpack .../020-libcc1-0_14.2.0-8_amd64.deb ...
Unpacking libcc1-0:amd64 (14.2.0-8) ...
Selecting previously unselected package libitm1:amd64.
Preparing to unpack .../021-libitm1_14.2.0-8_amd64.deb ...
Unpacking libitm1:amd64 (14.2.0-8) ...
Selecting previously unselected package libasan8:amd64.
Preparing to unpack .../022-libasan8_14.2.0-8_amd64.deb ...
Unpacking libasan8:amd64 (14.2.0-8) ...
Selecting previously unselected package liblsan0:amd64.
Preparing to unpack .../023-liblsan0_14.2.0-8_amd64.deb ...
Unpacking liblsan0:amd64 (14.2.0-8) ...
Selecting previously unselected package libtsan2:amd64.
Preparing to unpack .../024-libtsan2_14.2.0-8_amd64.deb ...
Unpacking libtsan2:amd64 (14.2.0-8) ...
Selecting previously unselected package libubsan1:amd64.
Preparing to unpack .../025-libubsan1_14.2.0-8_amd64.deb ...
Unpacking libubsan1:amd64 (14.2.0-8) ...
Selecting previously unselected package libhwasan0:amd64.
Preparing to unpack .../026-libhwasan0_14.2.0-8_amd64.deb ...
Unpacking libhwasan0:amd64 (14.2.0-8) ...
Selecting previously unselected package libquadmath0:amd64.
Preparing to unpack .../027-libquadmath0_14.2.0-8_amd64.deb ...
Unpacking libquadmath0:amd64 (14.2.0-8) ...
Selecting previously unselected package libgcc-14-dev:amd64.
Preparing to unpack .../028-libgcc-14-dev_14.2.0-8_amd64.deb ...
Unpacking libgcc-14-dev:amd64 (14.2.0-8) ...
Selecting previously unselected package gcc-14-x86-64-linux-gnu.
Preparing to unpack .../029-gcc-14-x86-64-linux-gnu_14.2.0-8_amd64.deb ...
Unpacking gcc-14-x86-64-linux-gnu (14.2.0-8) ...
Selecting previously unselected package gcc-14.
Preparing to unpack .../030-gcc-14_14.2.0-8_amd64.deb ...
Unpacking gcc-14 (14.2.0-8) ...
Selecting previously unselected package gcc-x86-64-linux-gnu.
Preparing to unpack .../031-gcc-x86-64-linux-gnu_4%3a14.2.0-1_amd64.deb ...
Unpacking gcc-x86-64-linux-gnu (4:14.2.0-1) ...
Selecting previously unselected package gcc.
Preparing to unpack .../032-gcc_4%3a14.2.0-1_amd64.deb ...
Unpacking gcc (4:14.2.0-1) ...
Selecting previously unselected package libstdc++-14-dev:amd64.
Preparing to unpack .../033-libstdc++-14-dev_14.2.0-8_amd64.deb ...
Unpacking libstdc++-14-dev:amd64 (14.2.0-8) ...
Selecting previously unselected package g++-14-x86-64-linux-gnu.
Preparing to unpack .../034-g++-14-x86-64-linux-gnu_14.2.0-8_amd64.deb ...
Unpacking g++-14-x86-64-linux-gnu (14.2.0-8) ...
Selecting previously unselected package g++-14.
Preparing to unpack .../035-g++-14_14.2.0-8_amd64.deb ...
Unpacking g++-14 (14.2.0-8) ...
Selecting previously unselected package g++-x86-64-linux-gnu.
Preparing to unpack .../036-g++-x86-64-linux-gnu_4%3a14.2.0-1_amd64.deb ...
Unpacking g++-x86-64-linux-gnu (4:14.2.0-1) ...
Selecting previously unselected package g++.
Preparing to unpack .../037-g++_4%3a14.2.0-1_amd64.deb ...
Unpacking g++ (4:14.2.0-1) ...
Selecting previously unselected package build-essential.
Preparing to unpack .../038-build-essential_12.12_amd64.deb ...
Unpacking build-essential (12.12) ...
Selecting previously unselected package libdebhelper-perl.
Preparing to unpack .../039-libdebhelper-perl_13.20_all.deb ...
Unpacking libdebhelper-perl (13.20) ...
Selecting previously unselected package libtool.
Preparing to unpack .../040-libtool_2.4.7-8_all.deb ...
Unpacking libtool (2.4.7-8) ...
Selecting previously unselected package dh-autoreconf.
Preparing to unpack .../041-dh-autoreconf_20_all.deb ...
Unpacking dh-autoreconf (20) ...
Selecting previously unselected package libfile-stripnondeterminism-perl.
Preparing to unpack .../042-libfile-stripnondeterminism-perl_1.14.0-1_all.deb ...
Unpacking libfile-stripnondeterminism-perl (1.14.0-1) ...
Selecting previously unselected package dh-strip-nondeterminism.
Preparing to unpack .../043-dh-strip-nondeterminism_1.14.0-1_all.deb ...
Unpacking dh-strip-nondeterminism (1.14.0-1) ...
Selecting previously unselected package libelf1t64:amd64.
Preparing to unpack .../044-libelf1t64_0.192-4_amd64.deb ...
Unpacking libelf1t64:amd64 (0.192-4) ...
Selecting previously unselected package dwz.
Preparing to unpack .../045-dwz_0.15-1+b1_amd64.deb ...
Unpacking dwz (0.15-1+b1) ...
Selecting previously unselected package po-debconf.
Preparing to unpack .../046-po-debconf_1.0.21+nmu1_all.deb ...
Unpacking po-debconf (1.0.21+nmu1) ...
Selecting previously unselected package debhelper.
Preparing to unpack .../047-debhelper_13.20_all.deb ...
Unpacking debhelper (13.20) ...
Selecting previously unselected package python3-autocommand.
Preparing to unpack .../048-python3-autocommand_2.2.2-3_all.deb ...
Unpacking python3-autocommand (2.2.2-3) ...
Selecting previously unselected package python3-more-itertools.
Preparing to unpack .../049-python3-more-itertools_10.5.0-1_all.deb ...
Unpacking python3-more-itertools (10.5.0-1) ...
Selecting previously unselected package python3-typing-extensions.
Preparing to unpack .../050-python3-typing-extensions_4.12.2-2_all.deb ...
Unpacking python3-typing-extensions (4.12.2-2) ...
Selecting previously unselected package python3-typeguard.
Preparing to unpack .../051-python3-typeguard_4.4.1-1_all.deb ...
Unpacking python3-typeguard (4.4.1-1) ...
Selecting previously unselected package python3-inflect.
Preparing to unpack .../052-python3-inflect_7.3.1-2_all.deb ...
Unpacking python3-inflect (7.3.1-2) ...
Selecting previously unselected package python3-jaraco.context.
Preparing to unpack .../053-python3-jaraco.context_6.0.0-1_all.deb ...
Unpacking python3-jaraco.context (6.0.0-1) ...
Selecting previously unselected package python3-jaraco.functools.
Preparing to unpack .../054-python3-jaraco.functools_4.1.0-1_all.deb ...
Unpacking python3-jaraco.functools (4.1.0-1) ...
Selecting previously unselected package python3-pkg-resources.
Preparing to unpack .../055-python3-pkg-resources_75.2.0-1_all.deb ...
Unpacking python3-pkg-resources (75.2.0-1) ...
Selecting previously unselected package python3-jaraco.text.
Preparing to unpack .../056-python3-jaraco.text_4.0.0-1_all.deb ...
Unpacking python3-jaraco.text (4.0.0-1) ...
Selecting previously unselected package python3-zipp.
Preparing to unpack .../057-python3-zipp_3.21.0-1_all.deb ...
Unpacking python3-zipp (3.21.0-1) ...
Selecting previously unselected package python3-setuptools.
Preparing to unpack .../058-python3-setuptools_75.2.0-1_all.deb ...
Unpacking python3-setuptools (75.2.0-1) ...
Selecting previously unselected package dh-python.
Preparing to unpack .../059-dh-python_6.20241024_all.deb ...
Unpacking dh-python (6.20241024) ...
Selecting previously unselected package libfakeroot:amd64.
Preparing to unpack .../060-libfakeroot_1.36-1_amd64.deb ...
Unpacking libfakeroot:amd64 (1.36-1) ...
Selecting previously unselected package fakeroot.
Preparing to unpack .../061-fakeroot_1.36-1_amd64.deb ...
Unpacking fakeroot (1.36-1) ...
Selecting previously unselected package fonts-font-awesome.
Preparing to unpack .../062-fonts-font-awesome_5.0.10+really4.7.0~dfsg-4.1_all.deb ...
Unpacking fonts-font-awesome (5.0.10+really4.7.0~dfsg-4.1) ...
Selecting previously unselected package libcares2:amd64.
Preparing to unpack .../063-libcares2_1.34.2-1_amd64.deb ...
Unpacking libcares2:amd64 (1.34.2-1) ...
Selecting previously unselected package libev4t64:amd64.
Preparing to unpack .../064-libev4t64_1%3a4.33-2.1+b1_amd64.deb ...
Unpacking libev4t64:amd64 (1:4.33-2.1+b1) ...
Selecting previously unselected package libjs-jquery.
Preparing to unpack .../065-libjs-jquery_3.6.1+dfsg+~3.5.14-1_all.deb ...
Unpacking libjs-jquery (3.6.1+dfsg+~3.5.14-1) ...
Selecting previously unselected package libjs-underscore.
Preparing to unpack .../066-libjs-underscore_1.13.4~dfsg+~1.11.4-3_all.deb ...
Unpacking libjs-underscore (1.13.4~dfsg+~1.11.4-3) ...
Selecting previously unselected package libjs-sphinxdoc.
Preparing to unpack .../067-libjs-sphinxdoc_7.4.7-4_all.deb ...
Unpacking libjs-sphinxdoc (7.4.7-4) ...
Selecting previously unselected package libnorm1t64:amd64.
Preparing to unpack .../068-libnorm1t64_1.5.9+dfsg-3.1+b1_amd64.deb ...
Unpacking libnorm1t64:amd64 (1.5.9+dfsg-3.1+b1) ...
Selecting previously unselected package libpgm-5.3-0t64:amd64.
Preparing to unpack .../069-libpgm-5.3-0t64_5.3.128~dfsg-2.1+b1_amd64.deb ...
Unpacking libpgm-5.3-0t64:amd64 (5.3.128~dfsg-2.1+b1) ...
Selecting previously unselected package libpython3.13-stdlib:amd64.
Preparing to unpack .../070-libpython3.13-stdlib_3.13.0-2_amd64.deb ...
Unpacking libpython3.13-stdlib:amd64 (3.13.0-2) ...
Selecting previously unselected package libsodium23:amd64.
Preparing to unpack .../071-libsodium23_1.0.18-1+b2_amd64.deb ...
Unpacking libsodium23:amd64 (1.0.18-1+b2) ...
Selecting previously unselected package libxslt1.1:amd64.
Preparing to unpack .../072-libxslt1.1_1.1.35-1.1+b1_amd64.deb ...
Unpacking libxslt1.1:amd64 (1.1.35-1.1+b1) ...
Selecting previously unselected package libzmq5:amd64.
Preparing to unpack .../073-libzmq5_4.3.5-1+b3_amd64.deb ...
Unpacking libzmq5:amd64 (4.3.5-1+b3) ...
Selecting previously unselected package python3-packaging.
Preparing to unpack .../074-python3-packaging_24.1-1_all.deb ...
Unpacking python3-packaging (24.1-1) ...
Selecting previously unselected package python3-pyproject-hooks.
Preparing to unpack .../075-python3-pyproject-hooks_1.2.0-1_all.deb ...
Unpacking python3-pyproject-hooks (1.2.0-1) ...
Selecting previously unselected package python3-toml.
Preparing to unpack .../076-python3-toml_0.10.2-1_all.deb ...
Unpacking python3-toml (0.10.2-1) ...
Selecting previously unselected package python3-wheel.
Preparing to unpack .../077-python3-wheel_0.44.0-2_all.deb ...
Unpacking python3-wheel (0.44.0-2) ...
Selecting previously unselected package python3-build.
Preparing to unpack .../078-python3-build_1.2.2-1_all.deb ...
Unpacking python3-build (1.2.2-1) ...
Selecting previously unselected package python3-installer.
Preparing to unpack .../079-python3-installer_0.7.0+dfsg1-3_all.deb ...
Unpacking python3-installer (0.7.0+dfsg1-3) ...
Selecting previously unselected package pybuild-plugin-pyproject.
Preparing to unpack .../080-pybuild-plugin-pyproject_6.20241024_all.deb ...
Unpacking pybuild-plugin-pyproject (6.20241024) ...
Selecting previously unselected package python3.13.
Preparing to unpack .../081-python3.13_3.13.0-2_amd64.deb ...
Unpacking python3.13 (3.13.0-2) ...
Selecting previously unselected package python3-all.
Preparing to unpack .../082-python3-all_3.12.7-1_amd64.deb ...
Unpacking python3-all (3.12.7-1) ...
Selecting previously unselected package python3-bcrypt.
Preparing to unpack .../083-python3-bcrypt_4.2.0-2_amd64.deb ...
Unpacking python3-bcrypt (4.2.0-2) ...
Selecting previously unselected package python3-blinker.
Preparing to unpack .../084-python3-blinker_1.8.2-1_all.deb ...
Unpacking python3-blinker (1.8.2-1) ...
Selecting previously unselected package python3-brotli.
Preparing to unpack .../085-python3-brotli_1.1.0-2+b6_amd64.deb ...
Unpacking python3-brotli (1.1.0-2+b6) ...
Selecting previously unselected package python3-certifi.
Preparing to unpack .../086-python3-certifi_2024.8.30+dfsg-1_all.deb ...
Unpacking python3-certifi (2024.8.30+dfsg-1) ...
Selecting previously unselected package python3-cffi-backend:amd64.
Preparing to unpack .../087-python3-cffi-backend_1.17.1-2+b1_amd64.deb ...
Unpacking python3-cffi-backend:amd64 (1.17.1-2+b1) ...
Selecting previously unselected package python3-chardet.
Preparing to unpack .../088-python3-chardet_5.2.0+dfsg-1_all.deb ...
Unpacking python3-chardet (5.2.0+dfsg-1) ...
Selecting previously unselected package python3-charset-normalizer.
Preparing to unpack .../089-python3-charset-normalizer_3.4.0-1+b1_amd64.deb ...
Unpacking python3-charset-normalizer (3.4.0-1+b1) ...
Selecting previously unselected package python3-colorama.
Preparing to unpack .../090-python3-colorama_0.4.6-4_all.deb ...
Unpacking python3-colorama (0.4.6-4) ...
Selecting previously unselected package python3-click.
Preparing to unpack .../091-python3-click_8.1.7-2_all.deb ...
Unpacking python3-click (8.1.7-2) ...
Selecting previously unselected package python3-configargparse.
Preparing to unpack .../092-python3-configargparse_1.7-2_all.deb ...
Unpacking python3-configargparse (1.7-2) ...
Selecting previously unselected package python3-cryptography.
Preparing to unpack .../093-python3-cryptography_43.0.0-1_amd64.deb ...
Unpacking python3-cryptography (43.0.0-1) ...
Selecting previously unselected package python3-cssselect.
Preparing to unpack .../094-python3-cssselect_1.2.0-4_all.deb ...
Unpacking python3-cssselect (1.2.0-4) ...
Selecting previously unselected package python3-decorator.
Preparing to unpack .../095-python3-decorator_5.1.1-5_all.deb ...
Unpacking python3-decorator (5.1.1-5) ...
Selecting previously unselected package python3-itsdangerous.
Preparing to unpack .../096-python3-itsdangerous_2.2.0-1_all.deb ...
Unpacking python3-itsdangerous (2.2.0-1) ...
Selecting previously unselected package python3-markupsafe.
Preparing to unpack .../097-python3-markupsafe_2.1.5-1+b2_amd64.deb ...
Unpacking python3-markupsafe (2.1.5-1+b2) ...
Selecting previously unselected package python3-jinja2.
Preparing to unpack .../098-python3-jinja2_3.1.3-1_all.deb ...
Unpacking python3-jinja2 (3.1.3-1) ...
Selecting previously unselected package python3-werkzeug.
Preparing to unpack .../099-python3-werkzeug_3.0.4-1_all.deb ...
Unpacking python3-werkzeug (3.0.4-1) ...
Selecting previously unselected package python3-flask.
Preparing to unpack .../100-python3-flask_3.0.3-1_all.deb ...
Unpacking python3-flask (3.0.3-1) ...
Selecting previously unselected package sphinx-rtd-theme-common.
Preparing to unpack .../101-sphinx-rtd-theme-common_3.0.1+dfsg-1_all.deb ...
Unpacking sphinx-rtd-theme-common (3.0.1+dfsg-1) ...
Selecting previously unselected package python3-flask-cors.
Preparing to unpack .../102-python3-flask-cors_5.0.0-1_all.deb ...
Unpacking python3-flask-cors (5.0.0-1) ...
Selecting previously unselected package python3-flask-login.
Preparing to unpack .../103-python3-flask-login_0.6.3-2_all.deb ...
Unpacking python3-flask-login (0.6.3-2) ...
Selecting previously unselected package python3-greenlet.
Preparing to unpack .../104-python3-greenlet_3.1.0-1+b1_amd64.deb ...
Unpacking python3-greenlet (3.1.0-1+b1) ...
Selecting previously unselected package python3-zope.event.
Preparing to unpack .../105-python3-zope.event_5.0-0.1_all.deb ...
Unpacking python3-zope.event (5.0-0.1) ...
Selecting previously unselected package python3-zope.interface.
Preparing to unpack .../106-python3-zope.interface_7.1.1-1+b1_amd64.deb ...
Unpacking python3-zope.interface (7.1.1-1+b1) ...
Selecting previously unselected package python3-gevent.
Preparing to unpack .../107-python3-gevent_24.2.1-1_amd64.deb ...
Unpacking python3-gevent (24.2.1-1) ...
Selecting previously unselected package python3-six.
Preparing to unpack .../108-python3-six_1.16.0-7_all.deb ...
Unpacking python3-six (1.16.0-7) ...
Selecting previously unselected package python3-geventhttpclient.
Preparing to unpack .../109-python3-geventhttpclient_2.0.11-2+b1_amd64.deb ...
Unpacking python3-geventhttpclient (2.0.11-2+b1) ...
Selecting previously unselected package python3-idna.
Preparing to unpack .../110-python3-idna_3.8-2_all.deb ...
Unpacking python3-idna (3.8-2) ...
Selecting previously unselected package python3-iniconfig.
Preparing to unpack .../111-python3-iniconfig_1.1.1-2_all.deb ...
Unpacking python3-iniconfig (1.1.1-2) ...
Selecting previously unselected package python3-lxml:amd64.
Preparing to unpack .../112-python3-lxml_5.3.0-1+b1_amd64.deb ...
Unpacking python3-lxml:amd64 (5.3.0-1+b1) ...
Selecting previously unselected package python3-msgpack.
Preparing to unpack .../113-python3-msgpack_1.0.3-3+b2_amd64.deb ...
Unpacking python3-msgpack (1.0.3-3+b2) ...
Selecting previously unselected package python3-pluggy.
Preparing to unpack .../114-python3-pluggy_1.5.0-1_all.deb ...
Unpacking python3-pluggy (1.5.0-1) ...
Selecting previously unselected package python3-psutil.
Preparing to unpack .../115-python3-psutil_5.9.8-2_amd64.deb ...
Unpacking python3-psutil (5.9.8-2) ...
Selecting previously unselected package python3-py.
Preparing to unpack .../116-python3-py_1.11.0-2_all.deb ...
Unpacking python3-py (1.11.0-2) ...
Selecting previously unselected package python3-webob.
Preparing to unpack .../117-python3-webob_1%3a1.8.7-1_all.deb ...
Unpacking python3-webob (1:1.8.7-1) ...
Selecting previously unselected package python3-pyquery.
Preparing to unpack .../118-python3-pyquery_1.4.3-1_all.deb ...
Unpacking python3-pyquery (1.4.3-1) ...
Selecting previously unselected package python3-pytest.
Preparing to unpack .../119-python3-pytest_8.3.3-1_all.deb ...
Unpacking python3-pytest (8.3.3-1) ...
Selecting previously unselected package python3-urllib3.
Preparing to unpack .../120-python3-urllib3_2.0.7-2_all.deb ...
Unpacking python3-urllib3 (2.0.7-2) ...
Selecting previously unselected package python3-requests.
Preparing to unpack .../121-python3-requests_2.32.3+dfsg-1_all.deb ...
Unpacking python3-requests (2.32.3+dfsg-1) ...
Selecting previously unselected package python3-retry.
Preparing to unpack .../122-python3-retry_0.9.2-3_all.deb ...
Unpacking python3-retry (0.9.2-3) ...
Selecting previously unselected package python3-roundrobin.
Preparing to unpack .../123-python3-roundrobin_0.0.4-3_all.deb ...
Unpacking python3-roundrobin (0.0.4-3) ...
Selecting previously unselected package python3-zmq.
Preparing to unpack .../124-python3-zmq_24.0.1-5+b2_amd64.deb ...
Unpacking python3-zmq (24.0.1-5+b2) ...
Selecting previously unselected package sbuild-build-depends-main-dummy.
Preparing to unpack .../125-sbuild-build-depends-main-dummy_0.invalid.0_amd64.deb ...
Unpacking sbuild-build-depends-main-dummy (0.invalid.0) ...
Setting up media-types (10.1.0) ...
Setting up libfile-stripnondeterminism-perl (1.14.0-1) ...
Setting up libev4t64:amd64 (1:4.33-2.1+b1) ...
Setting up libnorm1t64:amd64 (1.5.9+dfsg-3.1+b1) ...
Setting up fonts-lato (2.015-1) ...
Setting up libsodium23:amd64 (1.0.18-1+b2) ...
Setting up libtirpc-common (1.3.4+ds-1.3) ...
Setting up po-debconf (1.0.21+nmu1) ...
Setting up libdebhelper-perl (13.20) ...
Setting up linux-libc-dev (6.11.7-1) ...
Setting up m4 (1.4.19-4) ...
Setting up libfakeroot:amd64 (1.36-1) ...
Setting up libelf1t64:amd64 (0.192-4) ...
Setting up fakeroot (1.36-1) ...
update-alternatives: using /usr/bin/fakeroot-sysv to provide /usr/bin/fakeroot (fakeroot) in auto mode
Setting up libpython3.13-minimal:amd64 (3.13.0-2) ...
Setting up libpgm-5.3-0t64:amd64 (5.3.128~dfsg-2.1+b1) ...
Setting up autotools-dev (20220109.1) ...
Setting up rpcsvc-proto (1.4.3-1) ...
Setting up libmpfr6:amd64 (4.2.1-1+b2) ...
Setting up libquadmath0:amd64 (14.2.0-8) ...
Setting up libcares2:amd64 (1.34.2-1) ...
Setting up libmpc3:amd64 (1.3.1-1+b3) ...
Setting up autopoint (0.22.5-2) ...
Setting up libncursesw6:amd64 (6.5-2+b1) ...
Setting up autoconf (2.72-3) ...
Setting up libubsan1:amd64 (14.2.0-8) ...
Setting up dh-strip-nondeterminism (1.14.0-1) ...
Setting up dwz (0.15-1+b1) ...
Setting up libhwasan0:amd64 (14.2.0-8) ...
Setting up libcrypt-dev:amd64 (1:4.4.36-5) ...
Setting up libasan8:amd64 (14.2.0-8) ...
Setting up libxslt1.1:amd64 (1.1.35-1.1+b1) ...
Setting up python3.13-minimal (3.13.0-2) ...
Setting up libtsan2:amd64 (14.2.0-8) ...
Setting up libjs-jquery (3.6.1+dfsg+~3.5.14-1) ...
Setting up libisl23:amd64 (0.27-1) ...
Setting up libc-dev-bin (2.40-3) ...
Setting up libpython3.13-stdlib:amd64 (3.13.0-2) ...
Setting up fonts-font-awesome (5.0.10+really4.7.0~dfsg-4.1) ...
Setting up sphinx-rtd-theme-common (3.0.1+dfsg-1) ...
Setting up libcc1-0:amd64 (14.2.0-8) ...
Setting up liblsan0:amd64 (14.2.0-8) ...
Setting up libitm1:amd64 (14.2.0-8) ...
Setting up libjs-underscore (1.13.4~dfsg+~1.11.4-3) ...
Setting up automake (1:1.16.5-1.3) ...
update-alternatives: using /usr/bin/automake-1.16 to provide /usr/bin/automake (automake) in auto mode
Setting up libzmq5:amd64 (4.3.5-1+b3) ...
Setting up libtirpc3t64:amd64 (1.3.4+ds-1.3+b1) ...
Setting up python3.13 (3.13.0-2) ...
Setting up cpp-14-x86-64-linux-gnu (14.2.0-8) ...
Setting up libjs-sphinxdoc (7.4.7-4) ...
Setting up cpp-14 (14.2.0-8) ...
Setting up libnsl2:amd64 (1.3.0-3+b3) ...
Setting up libc6-dev:amd64 (2.40-3) ...
Setting up libgcc-14-dev:amd64 (14.2.0-8) ...
Setting up libstdc++-14-dev:amd64 (14.2.0-8) ...
Setting up cpp-x86-64-linux-gnu (4:14.2.0-1) ...
Setting up libpython3.12-stdlib:amd64 (3.12.7-3) ...
Setting up python3.12 (3.12.7-3) ...
Setting up cpp (4:14.2.0-1) ...
Setting up gcc-14-x86-64-linux-gnu (14.2.0-8) ...
Setting up libpython3-stdlib:amd64 (3.12.7-1) ...
Setting up gcc-x86-64-linux-gnu (4:14.2.0-1) ...
Setting up python3 (3.12.7-1) ...
Setting up python3-roundrobin (0.0.4-3) ...
Setting up python3-zipp (3.21.0-1) ...
Setting up python3-autocommand (2.2.2-3) ...
Setting up python3-markupsafe (2.1.5-1+b2) ...
Setting up python3-wheel (0.44.0-2) ...
Setting up python3-psutil (5.9.8-2) ...
Setting up gcc-14 (14.2.0-8) ...
Setting up python3-six (1.16.0-7) ...
Setting up python3-decorator (5.1.1-5) ...
Setting up python3-jinja2 (3.1.3-1) ...
Setting up python3-packaging (24.1-1) ...
Setting up python3-pyproject-hooks (1.2.0-1) ...
Setting up python3-certifi (2024.8.30+dfsg-1) ...
Setting up python3-werkzeug (3.0.4-1) ...
Setting up python3-brotli (1.1.0-2+b6) ...
Setting up python3-greenlet (3.1.0-1+b1) ...
Setting up python3-idna (3.8-2) ...
Setting up python3-typing-extensions (4.12.2-2) ...
Setting up python3-toml (0.10.2-1) ...
Setting up python3-installer (0.7.0+dfsg1-3) ...
Setting up python3-urllib3 (2.0.7-2) ...
Setting up python3-pluggy (1.5.0-1) ...
Setting up g++-14-x86-64-linux-gnu (14.2.0-8) ...
Setting up python3-lxml:amd64 (5.3.0-1+b1) ...
Setting up g++-x86-64-linux-gnu (4:14.2.0-1) ...
Setting up python3-msgpack (1.0.3-3+b2) ...
Setting up g++-14 (14.2.0-8) ...
Setting up python3-build (1.2.2-1) ...
Setting up python3-cssselect (1.2.0-4) ...
Setting up python3-cffi-backend:amd64 (1.17.1-2+b1) ...
Setting up python3-webob (1:1.8.7-1) ...
Setting up python3-blinker (1.8.2-1) ...
Setting up python3-more-itertools (10.5.0-1) ...
Setting up python3-configargparse (1.7-2) ...
Setting up python3-iniconfig (1.1.1-2) ...
Setting up python3-jaraco.functools (4.1.0-1) ...
Setting up python3-jaraco.context (6.0.0-1) ...
Setting up libtool (2.4.7-8) ...
Setting up python3-colorama (0.4.6-4) ...
Setting up python3-pyquery (1.4.3-1) ...
Setting up python3-charset-normalizer (3.4.0-1+b1) ...
Setting up python3-pytest (8.3.3-1) ...
Setting up python3-bcrypt (4.2.0-2) ...
Setting up python3-typeguard (4.4.1-1) ...
Setting up python3-itsdangerous (2.2.0-1) ...
Setting up python3-all (3.12.7-1) ...
Setting up python3-click (8.1.7-2) ...
Setting up gcc (4:14.2.0-1) ...
Setting up dh-autoreconf (20) ...
Setting up python3-inflect (7.3.1-2) ...
Setting up python3-jaraco.text (4.0.0-1) ...
Setting up python3-cryptography (43.0.0-1) ...
Setting up g++ (4:14.2.0-1) ...
update-alternatives: using /usr/bin/g++ to provide /usr/bin/c++ (c++) in auto mode
Setting up build-essential (12.12) ...
Setting up python3-pkg-resources (75.2.0-1) ...
Setting up python3-setuptools (75.2.0-1) ...
Setting up python3-py (1.11.0-2) ...
Setting up python3-zope.event (5.0-0.1) ...
Setting up python3-zope.interface (7.1.1-1+b1) ...
Setting up python3-flask (3.0.3-1) ...
Setting up debhelper (13.20) ...
Setting up python3-gevent (24.2.1-1) ...
Setting up python3-flask-cors (5.0.0-1) ...
Setting up python3-chardet (5.2.0+dfsg-1) ...
Setting up python3-zmq (24.0.1-5+b2) ...
Setting up python3-requests (2.32.3+dfsg-1) ...
Setting up python3-retry (0.9.2-3) ...
Setting up python3-geventhttpclient (2.0.11-2+b1) ...
Setting up dh-python (6.20241024) ...
Setting up python3-flask-login (0.6.3-2) ...
Setting up pybuild-plugin-pyproject (6.20241024) ...
Setting up sbuild-build-depends-main-dummy (0.invalid.0) ...
Processing triggers for man-db (2.13.0-1) ...
Processing triggers for libc-bin (2.40-3) ...
+------------------------------------------------------------------------------+
| Check architectures |
+------------------------------------------------------------------------------+
W: Extra package /tmp/debusine-fetch-exec-upload-006vdbx6/dpkg-dbgsym_1.22.12~1.gbp82cafd_arm64.deb of architecture arm64 cannot be installed in the chroot
W: Extra package /tmp/debusine-fetch-exec-upload-006vdbx6/dpkg_1.22.12~1.gbp82cafd_arm64.deb of architecture arm64 cannot be installed in the chroot
W: Extra package /tmp/debusine-fetch-exec-upload-006vdbx6/dselect-dbgsym_1.22.12~1.gbp82cafd_arm64.deb of architecture arm64 cannot be installed in the chroot
W: Extra package /tmp/debusine-fetch-exec-upload-006vdbx6/dselect_1.22.12~1.gbp82cafd_arm64.deb of architecture arm64 cannot be installed in the chroot
W: Extra package /tmp/debusine-fetch-exec-upload-006vdbx6/libdpkg-dev_1.22.12~1.gbp82cafd_arm64.deb of architecture arm64 cannot be installed in the chroot
Arch check ok (amd64 included in all)
+------------------------------------------------------------------------------+
| Build environment |
+------------------------------------------------------------------------------+
Kernel: Linux 6.1.0-27-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.115-1 (2024-11-01) amd64 (x86_64)
Toolchain package versions: binutils_2.43.1-5 dpkg-dev_1.22.12~1.gbp82cafd g++-14_14.2.0-8 gcc-14_14.2.0-8 libc6-dev_2.40-3 libstdc++-14-dev_14.2.0-8 libstdc++6_14.2.0-8 linux-libc-dev_6.11.7-1
Package versions: appstream_1.0.3-1+b1 apt_2.9.11 autoconf_2.72-3 automake_1:1.16.5-1.3 autopoint_0.22.5-2 autotools-dev_20220109.1 base-files_13.5 base-passwd_3.6.5 bash_5.2.32-1+b2 binutils_2.43.1-5 binutils-common_2.43.1-5 binutils-x86-64-linux-gnu_2.43.1-5 bsdextrautils_2.40.2-11 bsdutils_1:2.40.2-11 build-essential_12.12 bzip2_1.0.8-6 ca-certificates_20240203 coreutils_9.5-1+b1 cpp_4:14.2.0-1 cpp-14_14.2.0-8 cpp-14-x86-64-linux-gnu_14.2.0-8 cpp-x86-64-linux-gnu_4:14.2.0-1 dash_0.5.12-9 debconf_1.5.87 debhelper_13.20 debian-archive-keyring_2023.4 debianutils_5.20 dh-autoreconf_20 dh-python_6.20241024 dh-strip-nondeterminism_1.14.0-1 diffstat_1.66-1 diffutils_1:3.10-1 dpkg_1.22.11 dpkg-dev_1.22.12~1.gbp82cafd dwz_0.15-1+b1 e2fsprogs_1.47.1-1+b1 fakeroot_1.36-1 file_1:5.45-3+b1 findutils_4.10.0-3 fonts-font-awesome_5.0.10+really4.7.0~dfsg-4.1 fonts-lato_2.015-1 g++_4:14.2.0-1 g++-14_14.2.0-8 g++-14-x86-64-linux-gnu_14.2.0-8 g++-x86-64-linux-gnu_4:14.2.0-1 gcc_4:14.2.0-1 gcc-14_14.2.0-8 gcc-14-base_14.2.0-8 gcc-14-x86-64-linux-gnu_14.2.0-8 gcc-x86-64-linux-gnu_4:14.2.0-1 gettext_0.22.5-2 gettext-base_0.22.5-2 gpg_2.2.45-2 gpgconf_2.2.45-2 gpgv_2.2.45-2 grep_3.11-4 groff-base_1.23.0-5 gzip_1.12-1.1 hostname_3.25 init-system-helpers_1.67 intltool-debian_0.35.0+20060710.6 iso-codes_4.17.0-1 libacl1_2.3.2-2+b1 libaliased-perl_0.34-3 libappstream5_1.0.3-1+b1 libapt-pkg-perl_0.1.40+b6 libapt-pkg6.0t64_2.9.11 libarchive-zip-perl_1.68-1 libasan8_14.2.0-8 libassuan9_3.0.1-2 libatomic1_14.2.0-8 libattr1_1:2.5.2-2 libaudit-common_1:4.0.2-2 libaudit1_1:4.0.2-2 libb-hooks-endofscope-perl_0.28-1 libb-hooks-op-check-perl_0.22-3+b2 libberkeleydb-perl_0.66-1 libbinutils_2.43.1-5 libblkid1_2.40.2-11 libbrotli1_1.1.0-2+b6 libbsd0_0.12.2-2 libbz2-1.0_1.0.8-6 libc-bin_2.40-3 libc-dev-bin_2.40-3 libc6_2.40-3 libc6-dev_2.40-3 libcap-ng0_0.8.5-3+b1 libcap2_1:2.66-5+b1 libcapture-tiny-perl_0.48-2 libcares2_1.34.2-1 libcc1-0_14.2.0-8 libcgi-pm-perl_4.66-1 libclass-data-inheritable-perl_0.10-1 libclass-inspector-perl_1.36-3 libclass-method-modifiers-perl_2.15-1 libclass-xsaccessor-perl_1.19-4+b4 libclone-perl_0.47-1+b1 libcom-err2_1.47.1-1+b1 libconfig-tiny-perl_2.30-1 libconst-fast-perl_0.014-2 libcpanel-json-xs-perl_4.38-1+b1 libcrypt-dev_1:4.4.36-5 libcrypt1_1:4.4.36-5 libctf-nobfd0_2.43.1-5 libctf0_2.43.1-5 libcurl3t64-gnutls_8.11.0-1 libdata-dpath-perl_0.60-1 libdata-messagepack-perl_1.02-1+b4 libdata-optlist-perl_0.114-1 libdata-validate-domain-perl_0.15-1 libdata-validate-ip-perl_0.31-1 libdata-validate-uri-perl_0.07-3 libdb5.3t64_5.3.28+dfsg2-9 libdebconfclient0_0.273 libdebhelper-perl_13.20 libdevel-callchecker-perl_0.009-1+b1 libdevel-size-perl_0.84-1+b1 libdevel-stacktrace-perl_2.0500-1 libdpkg-perl_1.22.12~1.gbp82cafd libdynaloader-functions-perl_0.004-1 libelf1t64_0.192-4 libemail-address-xs-perl_1.05-1+b4 libencode-locale-perl_1.05-3 libev4t64_1:4.33-2.1+b1 libexception-class-perl_1.45-1 libexpat1_2.6.4-1 libext2fs2t64_1.47.1-1+b1 libfakeroot_1.36-1 libffi8_3.4.6-1 libfile-basedir-perl_0.09-2 libfile-find-rule-perl_0.34-3 libfile-listing-perl_6.16-1 libfile-sharedir-perl_1.118-3 libfile-stripnondeterminism-perl_1.14.0-1 libfont-ttf-perl_1.06-2 libgcc-14-dev_14.2.0-8 libgcc-s1_14.2.0-8 libgcrypt20_1.11.0-6 libgdbm-compat4t64_1.24-2 libgdbm6t64_1.24-2 libglib2.0-0t64_2.82.2-3 libgmp10_2:6.3.0+dfsg-2+b2 libgnutls30t64_3.8.8-2 libgomp1_14.2.0-8 libgpg-error0_1.50-4 libgprofng0_2.43.1-5 libgssapi-krb5-2_1.21.3-3 libhogweed6t64_3.10-1+b1 libhtml-form-perl_6.12-1 libhtml-html5-entities-perl_0.004-3 libhtml-parser-perl_3.83-1+b1 libhtml-tagset-perl_3.24-1 libhtml-tokeparser-simple-perl_3.16-4 libhtml-tree-perl_5.07-3 libhttp-cookies-perl_6.11-1 libhttp-date-perl_6.06-1 libhttp-message-perl_7.00-2 libhttp-negotiate-perl_6.01-2 libhwasan0_14.2.0-8 libicu72_72.1-5+b1 libidn2-0_2.3.7-2+b1 libimport-into-perl_1.002005-2 libio-html-perl_1.004-3 libio-interactive-perl_1.025-1 libio-socket-ssl-perl_2.089-1 libio-string-perl_1.08-4 libipc-run3-perl_0.049-1 libipc-system-simple-perl_1.30-2 libisl23_0.27-1 libiterator-perl_0.03+ds1-2 libiterator-util-perl_0.02+ds1-2 libitm1_14.2.0-8 libjansson4_2.14-2+b3 libjs-jquery_3.6.1+dfsg+~3.5.14-1 libjs-sphinxdoc_7.4.7-4 libjs-underscore_1.13.4~dfsg+~1.11.4-3 libjson-maybexs-perl_1.004008-1 libk5crypto3_1.21.3-3 libkeyutils1_1.6.3-4 libkrb5-3_1.21.3-3 libkrb5support0_1.21.3-3 libldap-2.5-0_2.5.18+dfsg-3+b1 liblist-compare-perl_0.55-2 liblist-someutils-perl_0.59-1 liblist-utilsby-perl_0.12-2 liblsan0_14.2.0-8 liblwp-mediatypes-perl_6.04-2 liblwp-protocol-https-perl_6.14-1 liblz1_1.15~pre2-1 liblz4-1_1.9.4-3+b1 liblzma5_5.6.3-1+b1 liblzo2-2_2.10-3+b1 libmagic-mgc_1:5.45-3+b1 libmagic1t64_1:5.45-3+b1 libmarkdown2_2.2.7-2+b1 libmd0_1.1.0-2+b1 libmldbm-perl_2.05-4 libmodule-implementation-perl_0.09-2 libmodule-runtime-perl_0.016-2 libmoo-perl_2.005005-1 libmoox-aliases-perl_0.001006-2 libmount1_2.40.2-11 libmouse-perl_2.5.11-1+b1 libmpc3_1.3.1-1+b3 libmpfr6_4.2.1-1+b2 libnamespace-clean-perl_0.27-2 libncursesw6_6.5-2+b1 libnet-domain-tld-perl_1.75-4 libnet-http-perl_6.23-1 libnet-ipv6addr-perl_1.02-1 libnet-netmask-perl_2.0002-2 libnet-ssleay-perl_1.94-2 libnetaddr-ip-perl_4.079+dfsg-2+b4 libnettle8t64_3.10-1+b1 libnghttp2-14_1.64.0-1 libnghttp3-9_1.4.0-1+b1 libngtcp2-16_1.6.0-1 libngtcp2-crypto-gnutls8_1.6.0-1 libnorm1t64_1.5.9+dfsg-3.1+b1 libnsl2_1.3.0-3+b3 libnumber-compare-perl_0.03-3 libp11-kit0_0.25.5-2+b1 libpackage-stash-perl_0.40-1 libpam-modules_1.5.3-7+b1 libpam-modules-bin_1.5.3-7+b1 libpam-runtime_1.5.3-7 libpam0g_1.5.3-7+b1 libparams-classify-perl_0.015-2+b4 libparams-util-perl_1.102-3+b1 libpath-tiny-perl_0.146-1 libpcre2-8-0_10.44-2 libperl5.40_5.40.0-7 libperlio-gzip-perl_0.20-1+b4 libperlio-utf8-strict-perl_0.010-1+b3 libpgm-5.3-0t64_5.3.128~dfsg-2.1+b1 libpipeline1_1.5.8-1 libproc-processtable-perl_0.636-1+b3 libpsl5t64_0.21.2-1.1+b1 libpython3-stdlib_3.12.7-1 libpython3.12-minimal_3.12.7-3 libpython3.12-stdlib_3.12.7-3 libpython3.13-minimal_3.13.0-2 libpython3.13-stdlib_3.13.0-2 libquadmath0_14.2.0-8 libreadline8t64_8.2-5 libregexp-wildcards-perl_1.05-3 librole-tiny-perl_2.002004-1 librtmp1_2.4+20151223.gitfa8646d.1-2+b5 libsasl2-2_2.1.28+dfsg1-8 libsasl2-modules-db_2.1.28+dfsg1-8 libseccomp2_2.5.5-1+b3 libselinux1_3.7-3+b1 libsemanage-common_3.7-2 libsemanage2_3.7-2+b1 libsepol2_3.7-1 libsereal-decoder-perl_5.004+ds-1+b3 libsereal-encoder-perl_5.004+ds-1+b3 libsframe1_2.43.1-5 libsmartcols1_2.40.2-11 libsodium23_1.0.18-1+b2 libsort-versions-perl_1.62-3 libsqlite3-0_3.46.1-1 libss2_1.47.1-1+b1 libssh2-1t64_1.11.1-1 libssl3t64_3.3.2-2 libstdc++-14-dev_14.2.0-8 libstdc++6_14.2.0-8 libstemmer0d_2.2.0-4+b2 libstrictures-perl_2.000006-1 libsub-exporter-perl_0.990-1 libsub-exporter-progressive-perl_0.001013-3 libsub-identify-perl_0.14-3+b3 libsub-install-perl_0.929-1 libsub-name-perl_0.27-1+b3 libsub-quote-perl_2.006008-1 libsyntax-keyword-try-perl_0.30-1+b1 libsystemd0_257~rc1-4 libtasn1-6_4.19.0-3+b3 libterm-readkey-perl_2.38-2+b4 libtext-glob-perl_0.11-3 libtext-levenshteinxs-perl_0.03-5+b4 libtext-markdown-discount-perl_0.16-1+b3 libtext-xslate-perl_3.5.9-2+b1 libtime-duration-perl_1.21-2 libtime-moment-perl_0.44-2+b4 libtimedate-perl_2.3300-2 libtinfo6_6.5-2+b1 libtirpc-common_1.3.4+ds-1.3 libtirpc3t64_1.3.4+ds-1.3+b1 libtool_2.4.7-8 libtry-tiny-perl_0.32-1 libtsan2_14.2.0-8 libubsan1_14.2.0-8 libuchardet0_0.0.8-1+b2 libudev1_257~rc1-4 libunicode-utf8-perl_0.62-2+b3 libunistring5_1.2-1+b1 liburi-perl_5.30-1 libuuid1_2.40.2-11 libvariable-magic-perl_0.64-1+b1 libwww-mechanize-perl_2.19-1 libwww-perl_6.77-1 libwww-robotrules-perl_6.02-1 libxml-libxml-perl_2.0207+dfsg+really+2.0134-5+b1 libxml-namespacesupport-perl_1.12-2 libxml-sax-base-perl_1.09-3 libxml-sax-perl_1.02+dfsg-3 libxml2_2.12.7+dfsg+really2.9.14-0.2+b1 libxmlb2_0.3.21-1 libxs-parse-keyword-perl_0.46-1+b1 libxslt1.1_1.1.35-1.1+b1 libxxhash0_0.8.2-2+b2 libyaml-0-2_0.2.5-1+b2 libyaml-libyaml-perl_0.902.0+ds-2+b1 libzmq5_4.3.5-1+b3 libzstd1_1.5.6+dfsg-1+b1 lintian_2.120.0 linux-libc-dev_6.11.7-1 login_1:4.16.0-2+really2.40.2-11 login.defs_1:4.16.0-4 logsave_1.47.1-1+b1 lzop_1.04-2 m4_1.4.19-4 make_4.3-4.1 man-db_2.13.0-1 mawk_1.3.4.20240905-1 media-types_10.1.0 mount_2.40.2-11 ncurses-base_6.5-2 ncurses-bin_6.5-2+b1 netbase_6.4 openssl_3.3.2-2 openssl-provider-legacy_3.3.2-2 passwd_1:4.16.0-4 patch_2.7.6-7 patchutils_0.4.2-1 perl_5.40.0-7 perl-base_5.40.0-7 perl-modules-5.40_5.40.0-7 perl-openssl-defaults_7+b2 plzip_1.11-2 po-debconf_1.0.21+nmu1 pybuild-plugin-pyproject_6.20241024 python3_3.12.7-1 python3-all_3.12.7-1 python3-autocommand_2.2.2-3 python3-bcrypt_4.2.0-2 python3-blinker_1.8.2-1 python3-brotli_1.1.0-2+b6 python3-build_1.2.2-1 python3-certifi_2024.8.30+dfsg-1 python3-cffi-backend_1.17.1-2+b1 python3-chardet_5.2.0+dfsg-1 python3-charset-normalizer_3.4.0-1+b1 python3-click_8.1.7-2 python3-colorama_0.4.6-4 python3-configargparse_1.7-2 python3-cryptography_43.0.0-1 python3-cssselect_1.2.0-4 python3-decorator_5.1.1-5 python3-flask_3.0.3-1 python3-flask-cors_5.0.0-1 python3-flask-login_0.6.3-2 python3-gevent_24.2.1-1 python3-geventhttpclient_2.0.11-2+b1 python3-greenlet_3.1.0-1+b1 python3-idna_3.8-2 python3-inflect_7.3.1-2 python3-iniconfig_1.1.1-2 python3-installer_0.7.0+dfsg1-3 python3-itsdangerous_2.2.0-1 python3-jaraco.context_6.0.0-1 python3-jaraco.functools_4.1.0-1 python3-jaraco.text_4.0.0-1 python3-jinja2_3.1.3-1 python3-lxml_5.3.0-1+b1 python3-markupsafe_2.1.5-1+b2 python3-minimal_3.12.7-1 python3-more-itertools_10.5.0-1 python3-msgpack_1.0.3-3+b2 python3-packaging_24.1-1 python3-pkg-resources_75.2.0-1 python3-pluggy_1.5.0-1 python3-psutil_5.9.8-2 python3-py_1.11.0-2 python3-pyproject-hooks_1.2.0-1 python3-pyquery_1.4.3-1 python3-pytest_8.3.3-1 python3-requests_2.32.3+dfsg-1 python3-retry_0.9.2-3 python3-roundrobin_0.0.4-3 python3-setuptools_75.2.0-1 python3-six_1.16.0-7 python3-toml_0.10.2-1 python3-typeguard_4.4.1-1 python3-typing-extensions_4.12.2-2 python3-urllib3_2.0.7-2 python3-webob_1:1.8.7-1 python3-werkzeug_3.0.4-1 python3-wheel_0.44.0-2 python3-zipp_3.21.0-1 python3-zmq_24.0.1-5+b2 python3-zope.event_5.0-0.1 python3-zope.interface_7.1.1-1+b1 python3.12_3.12.7-3 python3.12-minimal_3.12.7-3 python3.13_3.13.0-2 python3.13-minimal_3.13.0-2 readline-common_8.2-5 rpcsvc-proto_1.4.3-1 sbuild-build-depends-main-dummy_0.invalid.0 sed_4.9-2 sensible-utils_0.0.24 shared-mime-info_2.4-5+b1 sphinx-rtd-theme-common_3.0.1+dfsg-1 sysvinit-utils_3.11-1 t1utils_1.41-4 tar_1.35+dfsg-3 tzdata_2024b-3 ucf_3.0043+nmu1 unzip_6.0-28 util-linux_2.40.2-11 xz-utils_5.6.3-1+b1 zlib1g_1:1.3.dfsg+really1.3.1-1+b1
+------------------------------------------------------------------------------+
| Build |
+------------------------------------------------------------------------------+
Unpack source
-------------
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Format: 3.0 (quilt)
Source: locust
Binary: python3-locust
Architecture: all
Version: 2.24.0-1
Maintainer: Sandro Tosi <morph@debian.org>
Homepage: https://locust.io/
Standards-Version: 4.6.2.0
Vcs-Browser: https://salsa.debian.org/morph/locust
Vcs-Git: https://salsa.debian.org/morph/locust.git
Build-Depends: debhelper-compat (= 13), pybuild-plugin-pyproject, python3-all, python3-configargparse (>= 1.5.5) <!nocheck>, python3-cryptography <!nocheck>, python3-flask-cors <!nocheck>, python3-flask-login (>= 0.6.3) <!nocheck>, python3-geventhttpclient (>= 2.0.8) <!nocheck>, python3-msgpack (>= 0.6.2) <!nocheck>, python3-psutil (>= 5.6.7) <!nocheck>, python3-pyquery (>= 1.4.3) <!nocheck>, python3-pytest <!nocheck>, python3-requests (>= 2.9.1) <!nocheck>, python3-retry <!nocheck>, python3-roundrobin <!nocheck>, python3-setuptools, python3-typing-extensions <!nocheck>, python3-zmq (>= 16.0.2) <!nocheck>
Package-List:
python3-locust deb python optional arch=all
Checksums-Sha1:
40d88b864ac9598d59a9c1690098634cb4111921 1661668 locust_2.24.0.orig.tar.xz
8409da5c973155eb9fda8e5fc1bf5b3f07591368 333540 locust_2.24.0-1.debian.tar.xz
Checksums-Sha256:
e5a2ed3998bb59cbb639e8f0c9523ae093fedc92670fc80d93b11f0cbbfb7cc6 1661668 locust_2.24.0.orig.tar.xz
e2cb7412a26f081e366f40c21f7ac1b000b63f4cc977aa9c983aabcc3e9588aa 333540 locust_2.24.0-1.debian.tar.xz
Files:
fa97f526df990e592546c6f94d16f92f 1661668 locust_2.24.0.orig.tar.xz
c75c25dc66bbe70dca3f93c64d01d2d8 333540 locust_2.24.0-1.debian.tar.xz
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEufrTGSrz5KUwnZ05h588mTgBqU8FAmXxLqcACgkQh588mTgB
qU9l1Q//UobeGUveeGALV6fQJfT4UdUUsAN/HyhiCZmgW5UoNxublTBbR3htV+GW
xsIZaED648mBpBl2fBkPg9wQDs2uJFdpLWtDtQKPF7btgtF/lzoJm1osaF2raoJ7
d+TNOIB3C03D8pgSvBdDmpcUi3TYebegD+o8PcwovEb4er5/png2Ib5TL9BPcBkv
pgOrLj/AR+HC13l43rlw9TPt9hS4Xl6nqA+mefYElZh9BRMTDP6fv3axKw3/XCUN
fEHX/MPGfjSeRInxAj3eMZwER7YXxwUNNkss/Vt5U0kiarHiIskUOBBKyPDJJXOb
31tkEu8sVisPrBy5D0eJi9Yn/nm6dOLfSABJvHNMB3SBBnlEjaV3Vbxh7u/XKrMS
wIOx1RhK7ZZSJCjxFXR/qxNOCqCpzGwGslr1IAGctt9L4TPyw7TeNTLBHTOFoS8q
3a8IHKQcHJKqGSq3btGSLVc1lNynAUbg11zwUkXPJzUl39vp9ZbZ018jQCJmSQWY
3fYavYCDnkxBrVBEPnFu2ywqOP6PPr++s5r5WsGvRAJG86DDlUcedtrSX0aixVEN
ZzjoxUih9VwqrOOhM6D644MMIwZ5ZIeXXdoNaVH8l+wmpQ9ygkwEe9pDZ8jdopVh
qPn3w7TEOJt/ZYEX0Yyb3Wp5i5V/NzZdIlekLKmon1qGUVPNQKI=
=H/Fn
-----END PGP SIGNATURE-----
gpgv: Signature made Wed Mar 13 04:42:15 2024 UTC
gpgv: using RSA key B9FAD3192AF3E4A5309D9D39879F3C993801A94F
gpgv: Can't check signature: No public key
dpkg-source: warning: cannot verify inline signature for ./locust_2.24.0-1.dsc: no acceptable signature found
dpkg-source: info: extracting locust in /<<PKGBUILDDIR>>
dpkg-source: info: unpacking locust_2.24.0.orig.tar.xz
dpkg-source: info: unpacking locust_2.24.0-1.debian.tar.xz
Check disk space
----------------
Sufficient free space for build
User Environment
----------------
APT_CONFIG=/var/lib/sbuild/apt.conf
HOME=/sbuild-nonexistent
LANG=en_US.UTF-8
LC_ALL=C.UTF-8
LOGNAME=debusine-worker
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
SHELL=/bin/sh
USER=debusine-worker
dpkg-buildpackage
-----------------
Command: dpkg-buildpackage --sanitize-env -us -uc -b -rfakeroot
dpkg-buildpackage: info: source package locust
dpkg-buildpackage: info: source version 2.24.0-1
dpkg-buildpackage: info: source distribution unstable
dpkg-buildpackage: info: source changed by Sandro Tosi <morph@debian.org>
dpkg-source --before-build .
dpkg-buildpackage: info: host architecture amd64
dpkg-source: info: using options from locust-2.24.0/debian/source/options: --extend-diff-ignore=^[^/]+.egg-info/
debian/rules clean
dh clean --with python3 --buildsystem=pybuild
dh_auto_clean -O--buildsystem=pybuild
dh_autoreconf_clean -O--buildsystem=pybuild
debian/rules override_dh_clean
make[1]: Entering directory '/<<PKGBUILDDIR>>'
rm -f locust/_version.py
dh_clean
make[1]: Leaving directory '/<<PKGBUILDDIR>>'
debian/rules binary
dh binary --with python3 --buildsystem=pybuild
dh_update_autotools_config -O--buildsystem=pybuild
dh_autoreconf -O--buildsystem=pybuild
dh_auto_configure -O--buildsystem=pybuild
debian/rules execute_before_dh_auto_build
make[1]: Entering directory '/<<PKGBUILDDIR>>'
echo "version = ''" > locust/_version.py
make[1]: Leaving directory '/<<PKGBUILDDIR>>'
dh_auto_build -O--buildsystem=pybuild
I: pybuild plugin_pyproject:129: Building wheel for python3.13 with "build" module
I: pybuild base:311: python3.13 -m build --skip-dependency-check --no-isolation --wheel --outdir /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_locust
* Building wheel...
running bdist_wheel
running build
running build_py
creating build/lib/locust
copying locust/env.py -> build/lib/locust
copying locust/event.py -> build/lib/locust
copying locust/runners.py -> build/lib/locust
copying locust/debug.py -> build/lib/locust
copying locust/_version.py -> build/lib/locust
copying locust/__main__.py -> build/lib/locust
copying locust/__init__.py -> build/lib/locust
copying locust/html.py -> build/lib/locust
copying locust/main.py -> build/lib/locust
copying locust/stats.py -> build/lib/locust
copying locust/shape.py -> build/lib/locust
copying locust/input_events.py -> build/lib/locust
copying locust/web.py -> build/lib/locust
copying locust/exception.py -> build/lib/locust
copying locust/dispatch.py -> build/lib/locust
copying locust/argument_parser.py -> build/lib/locust
copying locust/clients.py -> build/lib/locust
copying locust/log.py -> build/lib/locust
creating build/lib/locust/rpc
copying locust/rpc/__init__.py -> build/lib/locust/rpc
copying locust/rpc/protocol.py -> build/lib/locust/rpc
copying locust/rpc/zmqrpc.py -> build/lib/locust/rpc
creating build/lib/locust/user
copying locust/user/sequential_taskset.py -> build/lib/locust/user
copying locust/user/__init__.py -> build/lib/locust/user
copying locust/user/inspectuser.py -> build/lib/locust/user
copying locust/user/wait_time.py -> build/lib/locust/user
copying locust/user/task.py -> build/lib/locust/user
copying locust/user/users.py -> build/lib/locust/user
creating build/lib/locust/test
copying locust/test/test_runners.py -> build/lib/locust/test
copying locust/test/test_old_wait_api.py -> build/lib/locust/test
copying locust/test/fake_module2_for_env_test.py -> build/lib/locust/test
copying locust/test/test_sequential_taskset.py -> build/lib/locust/test
copying locust/test/mock_logging.py -> build/lib/locust/test
copying locust/test/__init__.py -> build/lib/locust/test
copying locust/test/test_stats.py -> build/lib/locust/test
copying locust/test/mock_locustfile.py -> build/lib/locust/test
copying locust/test/test_taskratio.py -> build/lib/locust/test
copying locust/test/test_fasthttp.py -> build/lib/locust/test
copying locust/test/test_log.py -> build/lib/locust/test
copying locust/test/test_users.py -> build/lib/locust/test
copying locust/test/test_web.py -> build/lib/locust/test
copying locust/test/test_wait_time.py -> build/lib/locust/test
copying locust/test/util.py -> build/lib/locust/test
copying locust/test/test_zmqrpc.py -> build/lib/locust/test
copying locust/test/test_env.py -> build/lib/locust/test
copying locust/test/test_debugging.py -> build/lib/locust/test
copying locust/test/testcases.py -> build/lib/locust/test
copying locust/test/test_main.py -> build/lib/locust/test
copying locust/test/test_parser.py -> build/lib/locust/test
copying locust/test/test_dispatch.py -> build/lib/locust/test
copying locust/test/test_tags.py -> build/lib/locust/test
copying locust/test/test_locust_class.py -> build/lib/locust/test
copying locust/test/fake_module1_for_env_test.py -> build/lib/locust/test
copying locust/test/test_http.py -> build/lib/locust/test
copying locust/test/test_interruptable_task.py -> build/lib/locust/test
copying locust/test/test_load_locustfile.py -> build/lib/locust/test
copying locust/test/test_util.py -> build/lib/locust/test
creating build/lib/locust/util
copying locust/util/cache.py -> build/lib/locust/util
copying locust/util/__init__.py -> build/lib/locust/util
copying locust/util/timespan.py -> build/lib/locust/util
copying locust/util/load_locustfile.py -> build/lib/locust/util
copying locust/util/deprecation.py -> build/lib/locust/util
copying locust/util/rounding.py -> build/lib/locust/util
copying locust/util/exception_handler.py -> build/lib/locust/util
creating build/lib/locust/contrib
copying locust/contrib/__init__.py -> build/lib/locust/contrib
copying locust/contrib/fasthttp.py -> build/lib/locust/contrib
copying locust/py.typed -> build/lib/locust
creating build/lib/locust/static
copying locust/static/jquery-1.11.3.min.js -> build/lib/locust/static
copying locust/static/chart.js -> build/lib/locust/static
copying locust/static/jquery.jqote2.min.js -> build/lib/locust/static
copying locust/static/locust.js -> build/lib/locust/static
copying locust/static/echarts.common.min.js -> build/lib/locust/static
copying locust/static/jquery.tools.min.js -> build/lib/locust/static
copying locust/static/tasks.js -> build/lib/locust/static
copying locust/static/vintage.js -> build/lib/locust/static
creating build/lib/locust/static/sass
copying locust/static/sass/application.sass -> build/lib/locust/static/sass
copying locust/static/sass/_base.sass -> build/lib/locust/static/sass
copying locust/static/sass/_mixins.sass -> build/lib/locust/static/sass
copying locust/static/sass/tables.sass -> build/lib/locust/static/sass
creating build/lib/locust/static/css
copying locust/static/css/application.css.map -> build/lib/locust/static/css
copying locust/static/css/tables.css.map -> build/lib/locust/static/css
copying locust/static/css/application.css -> build/lib/locust/static/css
copying locust/static/css/tables.css -> build/lib/locust/static/css
creating build/lib/locust/static/img
copying locust/static/img/ui-screenshot-start-test.png -> build/lib/locust/static/img
copying locust/static/img/ui-screenshot-stats.png -> build/lib/locust/static/img
copying locust/static/img/ui-screenshot-charts.png -> build/lib/locust/static/img
copying locust/static/img/logo.png -> build/lib/locust/static/img
copying locust/static/img/favicon.ico -> build/lib/locust/static/img
copying locust/static/img/ui-screenshot-workers.png -> build/lib/locust/static/img
creating build/lib/locust/templates
copying locust/templates/stats_data.html -> build/lib/locust/templates
copying locust/templates/report.html -> build/lib/locust/templates
copying locust/templates/index.html -> build/lib/locust/templates
creating build/lib/locust/webui/dist
copying locust/webui/dist/auth.html -> build/lib/locust/webui/dist
copying locust/webui/dist/report.html -> build/lib/locust/webui/dist
copying locust/webui/dist/index.html -> build/lib/locust/webui/dist
creating build/lib/locust/webui/dist/assets
copying locust/webui/dist/assets/index-0d6d578a.js -> build/lib/locust/webui/dist/assets
copying locust/webui/dist/assets/logo.png -> build/lib/locust/webui/dist/assets
copying locust/webui/dist/assets/favicon.ico -> build/lib/locust/webui/dist/assets
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64/wheel
creating build/bdist.linux-x86_64/wheel/locust
copying build/lib/locust/env.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/event.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/runners.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/rpc
copying build/lib/locust/rpc/__init__.py -> build/bdist.linux-x86_64/wheel/./locust/rpc
copying build/lib/locust/rpc/protocol.py -> build/bdist.linux-x86_64/wheel/./locust/rpc
copying build/lib/locust/rpc/zmqrpc.py -> build/bdist.linux-x86_64/wheel/./locust/rpc
creating build/bdist.linux-x86_64/wheel/locust/user
copying build/lib/locust/user/sequential_taskset.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/user/__init__.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/user/inspectuser.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/user/wait_time.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/user/task.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/user/users.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/debug.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/_version.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/__main__.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/test
copying build/lib/locust/test/test_runners.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_old_wait_api.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/fake_module2_for_env_test.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_sequential_taskset.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/mock_logging.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/__init__.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_stats.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/mock_locustfile.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_taskratio.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_fasthttp.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_log.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_users.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_web.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_wait_time.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/util.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_zmqrpc.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_env.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_debugging.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/testcases.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_main.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_parser.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_dispatch.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_tags.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_locust_class.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/fake_module1_for_env_test.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_http.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_interruptable_task.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_load_locustfile.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_util.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/__init__.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/static
creating build/bdist.linux-x86_64/wheel/locust/static/sass
copying build/lib/locust/static/sass/application.sass -> build/bdist.linux-x86_64/wheel/./locust/static/sass
copying build/lib/locust/static/sass/_base.sass -> build/bdist.linux-x86_64/wheel/./locust/static/sass
copying build/lib/locust/static/sass/_mixins.sass -> build/bdist.linux-x86_64/wheel/./locust/static/sass
copying build/lib/locust/static/sass/tables.sass -> build/bdist.linux-x86_64/wheel/./locust/static/sass
copying build/lib/locust/static/jquery-1.11.3.min.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/static/chart.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/static/jquery.jqote2.min.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/static/locust.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/static/echarts.common.min.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/static/jquery.tools.min.js -> build/bdist.linux-x86_64/wheel/./locust/static
creating build/bdist.linux-x86_64/wheel/locust/static/css
copying build/lib/locust/static/css/application.css.map -> build/bdist.linux-x86_64/wheel/./locust/static/css
copying build/lib/locust/static/css/tables.css.map -> build/bdist.linux-x86_64/wheel/./locust/static/css
copying build/lib/locust/static/css/application.css -> build/bdist.linux-x86_64/wheel/./locust/static/css
copying build/lib/locust/static/css/tables.css -> build/bdist.linux-x86_64/wheel/./locust/static/css
copying build/lib/locust/static/tasks.js -> build/bdist.linux-x86_64/wheel/./locust/static
creating build/bdist.linux-x86_64/wheel/locust/static/img
copying build/lib/locust/static/img/ui-screenshot-start-test.png -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/img/ui-screenshot-stats.png -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/img/ui-screenshot-charts.png -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/img/logo.png -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/img/favicon.ico -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/img/ui-screenshot-workers.png -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/vintage.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/html.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/main.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/stats.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/webui
creating build/bdist.linux-x86_64/wheel/locust/webui/dist
creating build/bdist.linux-x86_64/wheel/locust/webui/dist/assets
copying build/lib/locust/webui/dist/assets/index-0d6d578a.js -> build/bdist.linux-x86_64/wheel/./locust/webui/dist/assets
copying build/lib/locust/webui/dist/assets/logo.png -> build/bdist.linux-x86_64/wheel/./locust/webui/dist/assets
copying build/lib/locust/webui/dist/assets/favicon.ico -> build/bdist.linux-x86_64/wheel/./locust/webui/dist/assets
copying build/lib/locust/webui/dist/auth.html -> build/bdist.linux-x86_64/wheel/./locust/webui/dist
copying build/lib/locust/webui/dist/report.html -> build/bdist.linux-x86_64/wheel/./locust/webui/dist
copying build/lib/locust/webui/dist/index.html -> build/bdist.linux-x86_64/wheel/./locust/webui/dist
copying build/lib/locust/shape.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/input_events.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/web.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/exception.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/dispatch.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/util
copying build/lib/locust/util/cache.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/__init__.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/timespan.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/load_locustfile.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/deprecation.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/rounding.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/exception_handler.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/argument_parser.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/templates
copying build/lib/locust/templates/stats_data.html -> build/bdist.linux-x86_64/wheel/./locust/templates
copying build/lib/locust/templates/report.html -> build/bdist.linux-x86_64/wheel/./locust/templates
copying build/lib/locust/templates/index.html -> build/bdist.linux-x86_64/wheel/./locust/templates
copying build/lib/locust/py.typed -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/clients.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/log.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/contrib
copying build/lib/locust/contrib/__init__.py -> build/bdist.linux-x86_64/wheel/./locust/contrib
copying build/lib/locust/contrib/fasthttp.py -> build/bdist.linux-x86_64/wheel/./locust/contrib
running install_egg_info
running egg_info
creating locust.egg-info
writing locust.egg-info/PKG-INFO
writing dependency_links to locust.egg-info/dependency_links.txt
writing entry points to locust.egg-info/entry_points.txt
writing requirements to locust.egg-info/requires.txt
writing top-level names to locust.egg-info/top_level.txt
writing manifest file 'locust.egg-info/SOURCES.txt'
reading manifest file 'locust.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
adding license file 'LICENSE'
writing manifest file 'locust.egg-info/SOURCES.txt'
Copying locust.egg-info to build/bdist.linux-x86_64/wheel/./locust-0.0.0.egg-info
running install_scripts
creating build/bdist.linux-x86_64/wheel/locust-0.0.0.dist-info/WHEEL
creating '/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_locust/.tmp-2xr1g088/locust-0.0.0-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
adding 'locust/__init__.py'
adding 'locust/__main__.py'
adding 'locust/_version.py'
adding 'locust/argument_parser.py'
adding 'locust/clients.py'
adding 'locust/debug.py'
adding 'locust/dispatch.py'
adding 'locust/env.py'
adding 'locust/event.py'
adding 'locust/exception.py'
adding 'locust/html.py'
adding 'locust/input_events.py'
adding 'locust/log.py'
adding 'locust/main.py'
adding 'locust/py.typed'
adding 'locust/runners.py'
adding 'locust/shape.py'
adding 'locust/stats.py'
adding 'locust/web.py'
adding 'locust/contrib/__init__.py'
adding 'locust/contrib/fasthttp.py'
adding 'locust/rpc/__init__.py'
adding 'locust/rpc/protocol.py'
adding 'locust/rpc/zmqrpc.py'
adding 'locust/static/chart.js'
adding 'locust/static/echarts.common.min.js'
adding 'locust/static/jquery-1.11.3.min.js'
adding 'locust/static/jquery.jqote2.min.js'
adding 'locust/static/jquery.tools.min.js'
adding 'locust/static/locust.js'
adding 'locust/static/tasks.js'
adding 'locust/static/vintage.js'
adding 'locust/static/css/application.css'
adding 'locust/static/css/application.css.map'
adding 'locust/static/css/tables.css'
adding 'locust/static/css/tables.css.map'
adding 'locust/static/img/favicon.ico'
adding 'locust/static/img/logo.png'
adding 'locust/static/img/ui-screenshot-charts.png'
adding 'locust/static/img/ui-screenshot-start-test.png'
adding 'locust/static/img/ui-screenshot-stats.png'
adding 'locust/static/img/ui-screenshot-workers.png'
adding 'locust/static/sass/_base.sass'
adding 'locust/static/sass/_mixins.sass'
adding 'locust/static/sass/application.sass'
adding 'locust/static/sass/tables.sass'
adding 'locust/templates/index.html'
adding 'locust/templates/report.html'
adding 'locust/templates/stats_data.html'
adding 'locust/test/__init__.py'
adding 'locust/test/fake_module1_for_env_test.py'
adding 'locust/test/fake_module2_for_env_test.py'
adding 'locust/test/mock_locustfile.py'
adding 'locust/test/mock_logging.py'
adding 'locust/test/test_debugging.py'
adding 'locust/test/test_dispatch.py'
adding 'locust/test/test_env.py'
adding 'locust/test/test_fasthttp.py'
adding 'locust/test/test_http.py'
adding 'locust/test/test_interruptable_task.py'
adding 'locust/test/test_load_locustfile.py'
adding 'locust/test/test_locust_class.py'
adding 'locust/test/test_log.py'
adding 'locust/test/test_main.py'
adding 'locust/test/test_old_wait_api.py'
adding 'locust/test/test_parser.py'
adding 'locust/test/test_runners.py'
adding 'locust/test/test_sequential_taskset.py'
adding 'locust/test/test_stats.py'
adding 'locust/test/test_tags.py'
adding 'locust/test/test_taskratio.py'
adding 'locust/test/test_users.py'
adding 'locust/test/test_util.py'
adding 'locust/test/test_wait_time.py'
adding 'locust/test/test_web.py'
adding 'locust/test/test_zmqrpc.py'
adding 'locust/test/testcases.py'
adding 'locust/test/util.py'
adding 'locust/user/__init__.py'
adding 'locust/user/inspectuser.py'
adding 'locust/user/sequential_taskset.py'
adding 'locust/user/task.py'
adding 'locust/user/users.py'
adding 'locust/user/wait_time.py'
adding 'locust/util/__init__.py'
adding 'locust/util/cache.py'
adding 'locust/util/deprecation.py'
adding 'locust/util/exception_handler.py'
adding 'locust/util/load_locustfile.py'
adding 'locust/util/rounding.py'
adding 'locust/util/timespan.py'
adding 'locust/webui/dist/auth.html'
adding 'locust/webui/dist/index.html'
adding 'locust/webui/dist/report.html'
adding 'locust/webui/dist/assets/favicon.ico'
adding 'locust/webui/dist/assets/index-0d6d578a.js'
adding 'locust/webui/dist/assets/logo.png'
adding 'locust-0.0.0.dist-info/LICENSE'
adding 'locust-0.0.0.dist-info/METADATA'
adding 'locust-0.0.0.dist-info/WHEEL'
adding 'locust-0.0.0.dist-info/entry_points.txt'
adding 'locust-0.0.0.dist-info/top_level.txt'
adding 'locust-0.0.0.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel
Successfully built locust-0.0.0-py3-none-any.whl
I: pybuild plugin_pyproject:144: Unpacking wheel built for python3.13 with "installer" module
I: pybuild plugin_pyproject:129: Building wheel for python3.12 with "build" module
I: pybuild base:311: python3.12 -m build --skip-dependency-check --no-isolation --wheel --outdir /<<PKGBUILDDIR>>/.pybuild/cpython3_3.12_locust
* Building wheel...
running bdist_wheel
running build
running build_py
copying locust/_version.py -> build/lib/locust
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64/wheel
creating build/bdist.linux-x86_64/wheel/locust
copying build/lib/locust/env.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/event.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/runners.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/rpc
copying build/lib/locust/rpc/__init__.py -> build/bdist.linux-x86_64/wheel/./locust/rpc
copying build/lib/locust/rpc/protocol.py -> build/bdist.linux-x86_64/wheel/./locust/rpc
copying build/lib/locust/rpc/zmqrpc.py -> build/bdist.linux-x86_64/wheel/./locust/rpc
creating build/bdist.linux-x86_64/wheel/locust/user
copying build/lib/locust/user/sequential_taskset.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/user/__init__.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/user/inspectuser.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/user/wait_time.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/user/task.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/user/users.py -> build/bdist.linux-x86_64/wheel/./locust/user
copying build/lib/locust/debug.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/_version.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/__main__.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/test
copying build/lib/locust/test/test_runners.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_old_wait_api.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/fake_module2_for_env_test.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_sequential_taskset.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/mock_logging.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/__init__.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_stats.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/mock_locustfile.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_taskratio.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_fasthttp.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_log.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_users.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_web.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_wait_time.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/util.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_zmqrpc.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_env.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_debugging.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/testcases.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_main.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_parser.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_dispatch.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_tags.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_locust_class.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/fake_module1_for_env_test.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_http.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_interruptable_task.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_load_locustfile.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/test/test_util.py -> build/bdist.linux-x86_64/wheel/./locust/test
copying build/lib/locust/__init__.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/static
creating build/bdist.linux-x86_64/wheel/locust/static/sass
copying build/lib/locust/static/sass/application.sass -> build/bdist.linux-x86_64/wheel/./locust/static/sass
copying build/lib/locust/static/sass/_base.sass -> build/bdist.linux-x86_64/wheel/./locust/static/sass
copying build/lib/locust/static/sass/_mixins.sass -> build/bdist.linux-x86_64/wheel/./locust/static/sass
copying build/lib/locust/static/sass/tables.sass -> build/bdist.linux-x86_64/wheel/./locust/static/sass
copying build/lib/locust/static/jquery-1.11.3.min.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/static/chart.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/static/jquery.jqote2.min.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/static/locust.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/static/echarts.common.min.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/static/jquery.tools.min.js -> build/bdist.linux-x86_64/wheel/./locust/static
creating build/bdist.linux-x86_64/wheel/locust/static/css
copying build/lib/locust/static/css/application.css.map -> build/bdist.linux-x86_64/wheel/./locust/static/css
copying build/lib/locust/static/css/tables.css.map -> build/bdist.linux-x86_64/wheel/./locust/static/css
copying build/lib/locust/static/css/application.css -> build/bdist.linux-x86_64/wheel/./locust/static/css
copying build/lib/locust/static/css/tables.css -> build/bdist.linux-x86_64/wheel/./locust/static/css
copying build/lib/locust/static/tasks.js -> build/bdist.linux-x86_64/wheel/./locust/static
creating build/bdist.linux-x86_64/wheel/locust/static/img
copying build/lib/locust/static/img/ui-screenshot-start-test.png -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/img/ui-screenshot-stats.png -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/img/ui-screenshot-charts.png -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/img/logo.png -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/img/favicon.ico -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/img/ui-screenshot-workers.png -> build/bdist.linux-x86_64/wheel/./locust/static/img
copying build/lib/locust/static/vintage.js -> build/bdist.linux-x86_64/wheel/./locust/static
copying build/lib/locust/html.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/main.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/stats.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/webui
creating build/bdist.linux-x86_64/wheel/locust/webui/dist
creating build/bdist.linux-x86_64/wheel/locust/webui/dist/assets
copying build/lib/locust/webui/dist/assets/index-0d6d578a.js -> build/bdist.linux-x86_64/wheel/./locust/webui/dist/assets
copying build/lib/locust/webui/dist/assets/logo.png -> build/bdist.linux-x86_64/wheel/./locust/webui/dist/assets
copying build/lib/locust/webui/dist/assets/favicon.ico -> build/bdist.linux-x86_64/wheel/./locust/webui/dist/assets
copying build/lib/locust/webui/dist/auth.html -> build/bdist.linux-x86_64/wheel/./locust/webui/dist
copying build/lib/locust/webui/dist/report.html -> build/bdist.linux-x86_64/wheel/./locust/webui/dist
copying build/lib/locust/webui/dist/index.html -> build/bdist.linux-x86_64/wheel/./locust/webui/dist
copying build/lib/locust/shape.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/input_events.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/web.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/exception.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/dispatch.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/util
copying build/lib/locust/util/cache.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/__init__.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/timespan.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/load_locustfile.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/deprecation.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/rounding.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/util/exception_handler.py -> build/bdist.linux-x86_64/wheel/./locust/util
copying build/lib/locust/argument_parser.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/templates
copying build/lib/locust/templates/stats_data.html -> build/bdist.linux-x86_64/wheel/./locust/templates
copying build/lib/locust/templates/report.html -> build/bdist.linux-x86_64/wheel/./locust/templates
copying build/lib/locust/templates/index.html -> build/bdist.linux-x86_64/wheel/./locust/templates
copying build/lib/locust/py.typed -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/clients.py -> build/bdist.linux-x86_64/wheel/./locust
copying build/lib/locust/log.py -> build/bdist.linux-x86_64/wheel/./locust
creating build/bdist.linux-x86_64/wheel/locust/contrib
copying build/lib/locust/contrib/__init__.py -> build/bdist.linux-x86_64/wheel/./locust/contrib
copying build/lib/locust/contrib/fasthttp.py -> build/bdist.linux-x86_64/wheel/./locust/contrib
running install_egg_info
running egg_info
writing locust.egg-info/PKG-INFO
writing dependency_links to locust.egg-info/dependency_links.txt
writing entry points to locust.egg-info/entry_points.txt
writing requirements to locust.egg-info/requires.txt
writing top-level names to locust.egg-info/top_level.txt
reading manifest file 'locust.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
adding license file 'LICENSE'
writing manifest file 'locust.egg-info/SOURCES.txt'
Copying locust.egg-info to build/bdist.linux-x86_64/wheel/./locust-0.0.0.egg-info
running install_scripts
creating build/bdist.linux-x86_64/wheel/locust-0.0.0.dist-info/WHEEL
creating '/<<PKGBUILDDIR>>/.pybuild/cpython3_3.12_locust/.tmp-pno4_hga/locust-0.0.0-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
adding 'locust/__init__.py'
adding 'locust/__main__.py'
adding 'locust/_version.py'
adding 'locust/argument_parser.py'
adding 'locust/clients.py'
adding 'locust/debug.py'
adding 'locust/dispatch.py'
adding 'locust/env.py'
adding 'locust/event.py'
adding 'locust/exception.py'
adding 'locust/html.py'
adding 'locust/input_events.py'
adding 'locust/log.py'
adding 'locust/main.py'
adding 'locust/py.typed'
adding 'locust/runners.py'
adding 'locust/shape.py'
adding 'locust/stats.py'
adding 'locust/web.py'
adding 'locust/contrib/__init__.py'
adding 'locust/contrib/fasthttp.py'
adding 'locust/rpc/__init__.py'
adding 'locust/rpc/protocol.py'
adding 'locust/rpc/zmqrpc.py'
adding 'locust/static/chart.js'
adding 'locust/static/echarts.common.min.js'
adding 'locust/static/jquery-1.11.3.min.js'
adding 'locust/static/jquery.jqote2.min.js'
adding 'locust/static/jquery.tools.min.js'
adding 'locust/static/locust.js'
adding 'locust/static/tasks.js'
adding 'locust/static/vintage.js'
adding 'locust/static/css/application.css'
adding 'locust/static/css/application.css.map'
adding 'locust/static/css/tables.css'
adding 'locust/static/css/tables.css.map'
adding 'locust/static/img/favicon.ico'
adding 'locust/static/img/logo.png'
adding 'locust/static/img/ui-screenshot-charts.png'
adding 'locust/static/img/ui-screenshot-start-test.png'
adding 'locust/static/img/ui-screenshot-stats.png'
adding 'locust/static/img/ui-screenshot-workers.png'
adding 'locust/static/sass/_base.sass'
adding 'locust/static/sass/_mixins.sass'
adding 'locust/static/sass/application.sass'
adding 'locust/static/sass/tables.sass'
adding 'locust/templates/index.html'
adding 'locust/templates/report.html'
adding 'locust/templates/stats_data.html'
adding 'locust/test/__init__.py'
adding 'locust/test/fake_module1_for_env_test.py'
adding 'locust/test/fake_module2_for_env_test.py'
adding 'locust/test/mock_locustfile.py'
adding 'locust/test/mock_logging.py'
adding 'locust/test/test_debugging.py'
adding 'locust/test/test_dispatch.py'
adding 'locust/test/test_env.py'
adding 'locust/test/test_fasthttp.py'
adding 'locust/test/test_http.py'
adding 'locust/test/test_interruptable_task.py'
adding 'locust/test/test_load_locustfile.py'
adding 'locust/test/test_locust_class.py'
adding 'locust/test/test_log.py'
adding 'locust/test/test_main.py'
adding 'locust/test/test_old_wait_api.py'
adding 'locust/test/test_parser.py'
adding 'locust/test/test_runners.py'
adding 'locust/test/test_sequential_taskset.py'
adding 'locust/test/test_stats.py'
adding 'locust/test/test_tags.py'
adding 'locust/test/test_taskratio.py'
adding 'locust/test/test_users.py'
adding 'locust/test/test_util.py'
adding 'locust/test/test_wait_time.py'
adding 'locust/test/test_web.py'
adding 'locust/test/test_zmqrpc.py'
adding 'locust/test/testcases.py'
adding 'locust/test/util.py'
adding 'locust/user/__init__.py'
adding 'locust/user/inspectuser.py'
adding 'locust/user/sequential_taskset.py'
adding 'locust/user/task.py'
adding 'locust/user/users.py'
adding 'locust/user/wait_time.py'
adding 'locust/util/__init__.py'
adding 'locust/util/cache.py'
adding 'locust/util/deprecation.py'
adding 'locust/util/exception_handler.py'
adding 'locust/util/load_locustfile.py'
adding 'locust/util/rounding.py'
adding 'locust/util/timespan.py'
adding 'locust/webui/dist/auth.html'
adding 'locust/webui/dist/index.html'
adding 'locust/webui/dist/report.html'
adding 'locust/webui/dist/assets/favicon.ico'
adding 'locust/webui/dist/assets/index-0d6d578a.js'
adding 'locust/webui/dist/assets/logo.png'
adding 'locust-0.0.0.dist-info/LICENSE'
adding 'locust-0.0.0.dist-info/METADATA'
adding 'locust-0.0.0.dist-info/WHEEL'
adding 'locust-0.0.0.dist-info/entry_points.txt'
adding 'locust-0.0.0.dist-info/top_level.txt'
adding 'locust-0.0.0.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel
Successfully built locust-0.0.0-py3-none-any.whl
I: pybuild plugin_pyproject:144: Unpacking wheel built for python3.12 with "installer" module
debian/rules override_dh_auto_test
make[1]: Entering directory '/<<PKGBUILDDIR>>'
# examples/test_data_management.py - attempted network access during pytest collection phase
# TestMasterWorkerRunners times out after a long time
http_proxy= https_proxy= PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/<<PKGBUILDDIR>>/debian PYBUILD_SYSTEM=custom PYBUILD_TEST_ARGS="PYTHONPATH={build_dir} {interpreter} -m pytest -v --ignore=examples/test_data_management.py -k 'not TestMasterWorkerRunners'" dh_auto_test
I: pybuild base:311: PYTHONPATH=/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_locust/build python3.13 -m pytest -v --ignore=examples/test_data_management.py -k 'not TestMasterWorkerRunners'
============================= test session starts ==============================
platform linux -- Python 3.13.0, pytest-8.3.3, pluggy-1.5.0 -- /usr/bin/python3.13
cachedir: .pytest_cache
rootdir: /<<PKGBUILDDIR>>
configfile: pyproject.toml
plugins: typeguard-4.4.1
collecting ... collected 0 items / 26 errors
==================================== ERRORS ====================================
____________ ERROR collecting examples/browse_docs_sequence_test.py ____________
ImportError while importing test module '/<<PKGBUILDDIR>>/examples/browse_docs_sequence_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
examples/browse_docs_sequence_test.py:4: in <module>
from locust import HttpUser, SequentialTaskSet, between, task
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
________________ ERROR collecting examples/browse_docs_test.py _________________
ImportError while importing test module '/<<PKGBUILDDIR>>/examples/browse_docs_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
examples/browse_docs_test.py:4: in <module>
from locust import HttpUser, TaskSet, between, task
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
__________ ERROR collecting locust/test/fake_module1_for_env_test.py ___________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/fake_module1_for_env_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
__________ ERROR collecting locust/test/fake_module2_for_env_test.py ___________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/fake_module2_for_env_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
________________ ERROR collecting locust/test/test_debugging.py ________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_debugging.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
________________ ERROR collecting locust/test/test_dispatch.py _________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_dispatch.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
___________________ ERROR collecting locust/test/test_env.py ___________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_env.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
________________ ERROR collecting locust/test/test_fasthttp.py _________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_fasthttp.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
__________________ ERROR collecting locust/test/test_http.py ___________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_http.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
___________ ERROR collecting locust/test/test_interruptable_task.py ____________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_interruptable_task.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
_____________ ERROR collecting locust/test/test_load_locustfile.py _____________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_load_locustfile.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
______________ ERROR collecting locust/test/test_locust_class.py _______________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_locust_class.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
___________________ ERROR collecting locust/test/test_log.py ___________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_log.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
__________________ ERROR collecting locust/test/test_main.py ___________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_main.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
______________ ERROR collecting locust/test/test_old_wait_api.py _______________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_old_wait_api.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
_________________ ERROR collecting locust/test/test_parser.py __________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_parser.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
_________________ ERROR collecting locust/test/test_runners.py _________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_runners.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
___________ ERROR collecting locust/test/test_sequential_taskset.py ____________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_sequential_taskset.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
__________________ ERROR collecting locust/test/test_stats.py __________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_stats.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
__________________ ERROR collecting locust/test/test_tags.py ___________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_tags.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
________________ ERROR collecting locust/test/test_taskratio.py ________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_taskratio.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
__________________ ERROR collecting locust/test/test_users.py __________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_users.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
__________________ ERROR collecting locust/test/test_util.py ___________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_util.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
________________ ERROR collecting locust/test/test_wait_time.py ________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_wait_time.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
___________________ ERROR collecting locust/test/test_web.py ___________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_web.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
_________________ ERROR collecting locust/test/test_zmqrpc.py __________________
ImportError while importing test module '/<<PKGBUILDDIR>>/locust/test/test_zmqrpc.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
locust/__init__.py:13: in <module>
from gevent import monkey
/usr/lib/python3/dist-packages/gevent/__init__.py:72: in <module>
from gevent._hub_local import get_hub
/usr/lib/python3/dist-packages/gevent/_hub_local.py:150: in <module>
import_c_accel(globals(), 'gevent.__hub_local')
/usr/lib/python3/dist-packages/gevent/_util.py:148: in import_c_accel
mod = importlib.import_module(cname)
/usr/lib/python3.13/importlib/__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
E ModuleNotFoundError: No module named 'gevent._gevent_c_hub_local'
=========================== short test summary info ============================
ERROR examples/browse_docs_sequence_test.py
ERROR examples/browse_docs_test.py
ERROR locust/test/fake_module1_for_env_test.py
ERROR locust/test/fake_module2_for_env_test.py
ERROR locust/test/test_debugging.py
ERROR locust/test/test_dispatch.py
ERROR locust/test/test_env.py
ERROR locust/test/test_fasthttp.py
ERROR locust/test/test_http.py
ERROR locust/test/test_interruptable_task.py
ERROR locust/test/test_load_locustfile.py
ERROR locust/test/test_locust_class.py
ERROR locust/test/test_log.py
ERROR locust/test/test_main.py
ERROR locust/test/test_old_wait_api.py
ERROR locust/test/test_parser.py
ERROR locust/test/test_runners.py
ERROR locust/test/test_sequential_taskset.py
ERROR locust/test/test_stats.py
ERROR locust/test/test_tags.py
ERROR locust/test/test_taskratio.py
ERROR locust/test/test_users.py
ERROR locust/test/test_util.py
ERROR locust/test/test_wait_time.py
ERROR locust/test/test_web.py
ERROR locust/test/test_zmqrpc.py
!!!!!!!!!!!!!!!!!!! Interrupted: 26 errors during collection !!!!!!!!!!!!!!!!!!!
============================== 26 errors in 0.26s ==============================
E: pybuild pybuild:389: test: plugin custom failed with: exit code=2: PYTHONPATH=/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_locust/build python3.13 -m pytest -v --ignore=examples/test_data_management.py -k 'not TestMasterWorkerRunners'
I: pybuild base:311: PYTHONPATH=/<<PKGBUILDDIR>>/.pybuild/cpython3_3.12_locust/build python3.12 -m pytest -v --ignore=examples/test_data_management.py -k 'not TestMasterWorkerRunners'
============================= test session starts ==============================
platform linux -- Python 3.12.7, pytest-8.3.3, pluggy-1.5.0 -- /usr/bin/python3.12
cachedir: .pytest_cache
rootdir: /<<PKGBUILDDIR>>
configfile: pyproject.toml
plugins: typeguard-4.4.1
collecting ... collected 564 items / 15 deselected / 549 selected
locust/test/test_debugging.py::TestDebugging::test_run_single_user_pass_host_to_user_classes PASSED [ 0%]
locust/test/test_dispatch.py::TestRampUpUsersFromZero::test_ramp_up_users_to_3_workers_with_spawn_rate_of_0_5 PASSED [ 0%]
locust/test/test_dispatch.py::TestRampUpUsersFromZero::test_ramp_up_users_to_3_workers_with_spawn_rate_of_1 PASSED [ 0%]
locust/test/test_dispatch.py::TestRampUpUsersFromZero::test_ramp_up_users_to_3_workers_with_spawn_rate_of_2 PASSED [ 0%]
locust/test/test_dispatch.py::TestRampUpUsersFromZero::test_ramp_up_users_to_3_workers_with_spawn_rate_of_2_4 PASSED [ 0%]
locust/test/test_dispatch.py::TestRampUpUsersFromZero::test_ramp_up_users_to_3_workers_with_spawn_rate_of_3 PASSED [ 1%]
locust/test/test_dispatch.py::TestRampUpUsersFromZero::test_ramp_up_users_to_3_workers_with_spawn_rate_of_4 PASSED [ 1%]
locust/test/test_dispatch.py::TestRampUpUsersFromZero::test_ramp_up_users_to_3_workers_with_spawn_rate_of_9 PASSED [ 1%]
locust/test/test_dispatch.py::TestRampUpUsersFromZero::test_ramp_up_users_to_4_workers_with_spawn_rate_of_1 PASSED [ 1%]
locust/test/test_dispatch.py::TestRampUpUsersFromZero::test_users_are_distributed_evenly_across_hosts PASSED [ 1%]
locust/test/test_dispatch.py::TestWaitBetweenDispatch::test_wait_between_dispatch PASSED [ 2%]
locust/test/test_dispatch.py::TestRampDownUsersToZero::test_ramp_down_users_to_3_workers_with_spawn_rate_of_0_5 PASSED [ 2%]
locust/test/test_dispatch.py::TestRampDownUsersToZero::test_ramp_down_users_to_3_workers_with_spawn_rate_of_1 PASSED [ 2%]
locust/test/test_dispatch.py::TestRampDownUsersToZero::test_ramp_down_users_to_3_workers_with_spawn_rate_of_2 PASSED [ 2%]
locust/test/test_dispatch.py::TestRampDownUsersToZero::test_ramp_down_users_to_3_workers_with_spawn_rate_of_2_4 PASSED [ 2%]
locust/test/test_dispatch.py::TestRampDownUsersToZero::test_ramp_down_users_to_3_workers_with_spawn_rate_of_3 PASSED [ 2%]
locust/test/test_dispatch.py::TestRampDownUsersToZero::test_ramp_down_users_to_3_workers_with_spawn_rate_of_4 PASSED [ 3%]
locust/test/test_dispatch.py::TestRampDownUsersToZero::test_ramp_down_users_to_3_workers_with_spawn_rate_of_9 PASSED [ 3%]
locust/test/test_dispatch.py::TestRampDownUsersToZero::test_ramp_down_users_to_4_workers_with_spawn_rate_of_1 PASSED [ 3%]
locust/test/test_dispatch.py::TestRampUpThenDownThenUp::test_ramp_up_then_down_then_up SKIPPED [ 3%]
locust/test/test_dispatch.py::TestDispatchUsersToWorkersHavingTheSameUsersAsTheTarget::test_dispatch_users_to_3_workers PASSED [ 3%]
locust/test/test_dispatch.py::TestDistributionIsRespectedDuringDispatch::test_dispatch_75_users_to_4_workers_with_spawn_rate_of_5 PASSED [ 4%]
locust/test/test_dispatch.py::TestLargeScale::test_distribute_users PASSED [ 4%]
locust/test/test_dispatch.py::TestLargeScale::test_ramp_down_from_100_000_to_0_users_with_50_user_classes_and_1000_workers_and_5000_spawn_rate PASSED [ 4%]
locust/test/test_dispatch.py::TestLargeScale::test_ramp_up_from_0_to_100_000_users_with_50_user_classes_and_1000_workers_and_5000_spawn_rate PASSED [ 4%]
locust/test/test_dispatch.py::TestSmallConsecutiveRamping::test_consecutive_ramp_up_and_ramp_down PASSED [ 4%]
locust/test/test_dispatch.py::TestRampingMiscellaneous::test_spawn_rate_greater_than_target_user_count PASSED [ 4%]
locust/test/test_dispatch.py::TestRemoveWorker::test_remove_last_worker PASSED [ 5%]
locust/test/test_dispatch.py::TestRemoveWorker::test_remove_two_workers_between_two_ramp_ups PASSED [ 5%]
locust/test/test_dispatch.py::TestRemoveWorker::test_remove_two_workers_during_ramp_down PASSED [ 5%]
locust/test/test_dispatch.py::TestRemoveWorker::test_remove_two_workers_during_ramp_up PASSED [ 5%]
locust/test/test_dispatch.py::TestRemoveWorker::test_remove_worker_between_two_ramp_ups PASSED [ 5%]
locust/test/test_dispatch.py::TestRemoveWorker::test_remove_worker_during_ramp_down PASSED [ 6%]
locust/test/test_dispatch.py::TestRemoveWorker::test_remove_worker_during_ramp_up PASSED [ 6%]
locust/test/test_dispatch.py::TestRemoveWorker::test_remove_worker_during_ramp_up_with_fixed_user PASSED [ 6%]
locust/test/test_dispatch.py::TestAddWorker::test_add_two_workers_between_two_ramp_ups PASSED [ 6%]
locust/test/test_dispatch.py::TestAddWorker::test_add_two_workers_during_ramp_down PASSED [ 6%]
locust/test/test_dispatch.py::TestAddWorker::test_add_two_workers_during_ramp_up PASSED [ 6%]
locust/test/test_dispatch.py::TestAddWorker::test_add_worker_between_two_ramp_ups PASSED [ 7%]
locust/test/test_dispatch.py::TestAddWorker::test_add_worker_during_ramp_down PASSED [ 7%]
locust/test/test_dispatch.py::TestAddWorker::test_add_worker_during_ramp_up PASSED [ 7%]
locust/test/test_dispatch.py::TestAddWorker::test_add_worker_during_ramp_up_with_fixed_user PASSED [ 7%]
locust/test/test_dispatch.py::TestRampUpUsersFromZeroWithFixed::test_ramp_up_2_weigted_user_with_1_fixed_user PASSED [ 7%]
locust/test/test_dispatch.py::TestRampUpUsersFromZeroWithFixed::test_ramp_up_only_fixed_users PASSED [ 8%]
locust/test/test_dispatch.py::TestRampUpUsersFromZeroWithFixed::test_ramp_up_partially_ramp_down_and_rump_up_to_target PASSED [ 8%]
locust/test/test_dispatch.py::TestRampUpUsersFromZeroWithFixed::test_ramp_up_ramp_down_and_ramp_up_again PASSED [ 8%]
locust/test/test_dispatch.py::TestRampUpUsersFromZeroWithFixed::test_ramp_up_ramp_down_and_ramp_up_again_single_fixed_class PASSED [ 8%]
locust/test/test_dispatch.py::TestRampUpUsersFromZeroWithFixed::test_ramp_up_various_count_weigted_and_fixed_users PASSED [ 8%]
locust/test/test_dispatch.py::TestRampUpDifferentUsers::test_add_worker_during_ramp_up_custom_classes PASSED [ 8%]
locust/test/test_dispatch.py::TestRampUpDifferentUsers::test_ramp_down_custom_user_classes_respect_weighting PASSED [ 9%]
locust/test/test_dispatch.py::TestRampUpDifferentUsers::test_ramp_up_different_users_each_dispatch_multiple_worker PASSED [ 9%]
locust/test/test_dispatch.py::TestRampUpDifferentUsers::test_ramp_up_different_users_for_each_dispatch PASSED [ 9%]
locust/test/test_dispatch.py::TestRampUpDifferentUsers::test_ramp_up_first_half_user1_second_half_user2 PASSED [ 9%]
locust/test/test_dispatch.py::TestRampUpDifferentUsers::test_ramp_up_first_one_user_then_all_classes PASSED [ 9%]
locust/test/test_dispatch.py::TestRampUpDifferentUsers::test_ramp_up_one_user_class_multiple_worker PASSED [ 10%]
locust/test/test_dispatch.py::TestRampUpDifferentUsers::test_ramp_up_only_one_kind_of_user PASSED [ 10%]
locust/test/test_dispatch.py::TestRampUpDifferentUsers::test_remove_worker_during_ramp_up_custom_classes PASSED [ 10%]
locust/test/test_env.py::TestEnvironment::test_all_user_classes_with_zero_weight_raises_exception PASSED [ 10%]
locust/test/test_env.py::TestEnvironment::test_assign_equal_weights PASSED [ 10%]
locust/test/test_env.py::TestEnvironment::test_dispatcher_class_attribute PASSED [ 10%]
locust/test/test_env.py::TestEnvironment::test_shape_class_attribute PASSED [ 11%]
locust/test/test_env.py::TestEnvironment::test_update_user_class PASSED [ 11%]
locust/test/test_env.py::TestEnvironment::test_user_classes_count PASSED [ 11%]
locust/test/test_env.py::TestEnvironment::test_user_classes_with_same_name_is_error PASSED [ 11%]
locust/test/test_env.py::TestEnvironment::test_user_classes_with_zero_weight_are_removed PASSED [ 11%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_204 PASSED [ 12%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_404 PASSED [ 12%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_catch_response_default_fail PASSED [ 12%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_catch_response_default_success PASSED [ 12%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_catch_response_fail_successful_request PASSED [ 12%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_catch_response_multiple_failure_and_success PASSED [ 12%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_catch_response_pass_failed_request PASSED [ 13%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_catch_response_pass_failed_request_with_other_exception_within_block PASSED [ 13%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_connection_error PASSED [ 13%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_cookie PASSED [ 13%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_custom_ssl_context_fail_with_bad_context PASSED [ 13%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_custom_ssl_context_passed_correct_to_client_pool PASSED [ 14%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_delete PASSED [ 14%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_error_message_with_name_replacement PASSED [ 14%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_get PASSED [ 14%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_head PASSED [ 14%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_json_payload PASSED [ 14%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_options PASSED [ 15%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_patch PASSED [ 15%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_post_redirect PASSED [ 15%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_slow_redirect PASSED [ 15%]
locust/test/test_fasthttp.py::TestFastHttpSession::test_streaming_response PASSED [ 15%]
locust/test/test_fasthttp.py::TestRequestStatsWithWebserver::test_request_connection_error PASSED [ 16%]
locust/test/test_fasthttp.py::TestRequestStatsWithWebserver::test_request_stats_content_length PASSED [ 16%]
locust/test/test_fasthttp.py::TestRequestStatsWithWebserver::test_request_stats_named_endpoint PASSED [ 16%]
locust/test/test_fasthttp.py::TestRequestStatsWithWebserver::test_request_stats_no_content_length PASSED [ 16%]
locust/test/test_fasthttp.py::TestRequestStatsWithWebserver::test_request_stats_no_content_length_streaming PASSED [ 16%]
locust/test/test_fasthttp.py::TestRequestStatsWithWebserver::test_request_stats_put PASSED [ 16%]
locust/test/test_fasthttp.py::TestRequestStatsWithWebserver::test_request_stats_query_variables PASSED [ 17%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_allow_redirects_override PASSED [ 17%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_class_context PASSED [ 17%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_client_basic_auth PASSED [ 17%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_client_delete PASSED [ 17%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_client_get PASSED [ 18%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_client_get_absolute_url PASSED [ 18%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_client_head PASSED [ 18%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_client_pool_concurrency PASSED [ 18%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_client_pool_per_user_instance PASSED [ 18%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_client_post PASSED [ 18%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_client_put PASSED [ 19%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_client_request_headers PASSED [ 19%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_complex_content_type PASSED [ 19%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_get_request PASSED [ 19%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_is_abstract PASSED [ 19%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_log_request_name_argument PASSED [ 20%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_max_redirect_setting PASSED [ 20%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_network_timeout_setting PASSED [ 20%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_redirect_url_original_path_as_name PASSED [ 20%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_shared_client_pool PASSED [ 20%]
locust/test/test_fasthttp.py::TestFastHttpUserClass::test_slow_redirect PASSED [ 20%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_catch_response PASSED [ 21%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_catch_response_allow_404 PASSED [ 21%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_catch_response_connection_error_fail PASSED [ 21%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_catch_response_connection_error_success PASSED [ 21%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_catch_response_http_fail PASSED [ 21%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_catch_response_http_manual_fail PASSED [ 22%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_catch_response_http_manual_success PASSED [ 22%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_catch_response_missing_with_block PASSED [ 22%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_interrupt_taskset_with_catch_response PASSED [ 22%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_missing_catch_response_true PASSED [ 22%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_rest_fail PASSED [ 22%]
locust/test/test_fasthttp.py::TestFastHttpCatchResponse::test_rest_success PASSED [ 23%]
locust/test/test_fasthttp.py::TestFastHttpSsl::test_ssl_request_insecure PASSED [ 23%]
locust/test/test_http.py::TestHttpSession::test_catch_response_default_fail PASSED [ 23%]
locust/test/test_http.py::TestHttpSession::test_catch_response_default_success PASSED [ 23%]
locust/test/test_http.py::TestHttpSession::test_catch_response_fail_successful_request PASSED [ 23%]
locust/test/test_http.py::TestHttpSession::test_catch_response_fail_successful_request_with_non_string_error_message PASSED [ 24%]
locust/test/test_http.py::TestHttpSession::test_catch_response_missing_with_block PASSED [ 24%]
locust/test/test_http.py::TestHttpSession::test_catch_response_multiple_failure_and_success PASSED [ 24%]
locust/test/test_http.py::TestHttpSession::test_catch_response_pass_failed_request PASSED [ 24%]
locust/test/test_http.py::TestHttpSession::test_catch_response_pass_failed_request_with_other_exception_within_block PASSED [ 24%]
locust/test/test_http.py::TestHttpSession::test_catch_response_response_error PASSED [ 24%]
locust/test/test_http.py::TestHttpSession::test_catch_response_timeout PASSED [ 25%]
locust/test/test_http.py::TestHttpSession::test_catch_response_with_name_replacement PASSED [ 25%]
locust/test/test_http.py::TestHttpSession::test_connection_error PASSED [ 25%]
locust/test/test_http.py::TestHttpSession::test_context_in_success PASSED [ 25%]
locust/test/test_http.py::TestHttpSession::test_cookie PASSED [ 25%]
locust/test/test_http.py::TestHttpSession::test_delete PASSED [ 26%]
locust/test/test_http.py::TestHttpSession::test_error_message PASSED [ 26%]
locust/test/test_http.py::TestHttpSession::test_error_message_with_name_replacement PASSED [ 26%]
locust/test/test_http.py::TestHttpSession::test_event_measure PASSED [ 26%]
locust/test/test_http.py::TestHttpSession::test_get PASSED [ 26%]
locust/test/test_http.py::TestHttpSession::test_get_with_params PASSED [ 26%]
locust/test/test_http.py::TestHttpSession::test_head PASSED [ 27%]
locust/test/test_http.py::TestHttpSession::test_missing_catch_response_true PASSED [ 27%]
locust/test/test_http.py::TestHttpSession::test_options PASSED [ 27%]
locust/test/test_http.py::TestHttpSession::test_post_redirect PASSED [ 27%]
locust/test/test_http.py::TestHttpSession::test_response_parameter PASSED [ 27%]
locust/test/test_http.py::TestHttpSession::test_slow_redirect PASSED [ 28%]
locust/test/test_http.py::TestHttpSession::test_streaming_response PASSED [ 28%]
locust/test/test_http.py::TestHttpSession::test_user_context PASSED [ 28%]
locust/test/test_http.py::TestHttpSession::test_wrong_url PASSED [ 28%]
locust/test/test_interruptable_task.py::TestInterruptableTask::test_interruptable_task PASSED [ 28%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_command_line_arguments_override_config_file PASSED [ 28%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_create_environment PASSED [ 29%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_is_user_class PASSED [ 29%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_load_locust_file_called_locust_dot_py PASSED [ 29%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_load_locust_file_from_absolute_path PASSED [ 29%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_load_locust_file_from_relative_path PASSED [ 29%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_load_locust_file_with_a_dot_in_filename PASSED [ 30%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_locustfile_can_be_set_in_config_file PASSED [ 30%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_locustfile_from_url FAILED [ 30%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_return_docstring_and_user_classes PASSED [ 30%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_specify_config_file PASSED [ 30%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_with_abstract_shape_class PASSED [ 30%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_with_multiple_shape_classes PASSED [ 31%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_with_not_imported_shape_class PASSED [ 31%]
locust/test/test_load_locustfile.py::TestLoadLocustfile::test_with_shape_class PASSED [ 31%]
locust/test/test_locust_class.py::TestTaskSet::test_on_start PASSED [ 31%]
locust/test/test_locust_class.py::TestTaskSet::test_on_start_interrupt PASSED [ 31%]
locust/test/test_locust_class.py::TestTaskSet::test_on_stop_interrupt PASSED [ 32%]
locust/test/test_locust_class.py::TestTaskSet::test_on_stop_interrupt_reschedule PASSED [ 32%]
locust/test/test_locust_class.py::TestTaskSet::test_on_stop_when_locust_stops PASSED [ 32%]
locust/test/test_locust_class.py::TestTaskSet::test_parent_attribute PASSED [ 32%]
locust/test/test_locust_class.py::TestTaskSet::test_schedule_task PASSED [ 32%]
locust/test/test_locust_class.py::TestTaskSet::test_schedule_task_bound_method PASSED [ 32%]
locust/test/test_locust_class.py::TestTaskSet::test_sub_taskset PASSED [ 33%]
locust/test/test_locust_class.py::TestTaskSet::test_sub_taskset_tasks_decorator PASSED [ 33%]
locust/test/test_locust_class.py::TestTaskSet::test_task_decorator_on_taskset PASSED [ 33%]
locust/test/test_locust_class.py::TestTaskSet::test_task_decorator_ratio PASSED [ 33%]
locust/test/test_locust_class.py::TestTaskSet::test_task_decorator_with_or_without_argument PASSED [ 33%]
locust/test/test_locust_class.py::TestTaskSet::test_task_ratio PASSED [ 34%]
locust/test/test_locust_class.py::TestTaskSet::test_tasks_missing_from_user_gives_user_friendly_exception PASSED [ 34%]
locust/test/test_locust_class.py::TestTaskSet::test_tasks_missing_gives_user_friendly_exception PASSED [ 34%]
locust/test/test_locust_class.py::TestTaskSet::test_tasks_on_abstract_locust PASSED [ 34%]
locust/test/test_locust_class.py::TestTaskSet::test_tasks_on_locust PASSED [ 34%]
locust/test/test_locust_class.py::TestTaskSet::test_taskset_inheritance PASSED [ 34%]
locust/test/test_locust_class.py::TestTaskSet::test_taskset_on_abstract_locust PASSED [ 35%]
locust/test/test_locust_class.py::TestTaskSet::test_user_is_read_only PASSED [ 35%]
locust/test/test_locust_class.py::TestTaskSet::test_wait_function PASSED [ 35%]
locust/test/test_locust_class.py::TestLocustClass::test_deprecated_locust_class PASSED [ 35%]
locust/test/test_locust_class.py::TestLocustClass::test_locust_forced_stop PASSED [ 35%]
locust/test/test_locust_class.py::TestLocustClass::test_locust_graceful_stop PASSED [ 36%]
locust/test/test_locust_class.py::TestLocustClass::test_locust_on_start PASSED [ 36%]
locust/test/test_locust_class.py::TestLocustClass::test_locust_on_stop PASSED [ 36%]
locust/test/test_locust_class.py::TestLocustClass::test_locust_start PASSED [ 36%]
locust/test/test_locust_class.py::TestLocustClass::test_locust_wait PASSED [ 36%]
locust/test/test_locust_class.py::TestWebLocustClass::test_client_basic_auth PASSED [ 36%]
locust/test/test_locust_class.py::TestWebLocustClass::test_client_delete PASSED [ 37%]
locust/test/test_locust_class.py::TestWebLocustClass::test_client_get PASSED [ 37%]
locust/test/test_locust_class.py::TestWebLocustClass::test_client_get_absolute_url PASSED [ 37%]
locust/test/test_locust_class.py::TestWebLocustClass::test_client_head PASSED [ 37%]
locust/test/test_locust_class.py::TestWebLocustClass::test_client_post PASSED [ 37%]
locust/test/test_locust_class.py::TestWebLocustClass::test_client_put PASSED [ 38%]
locust/test/test_locust_class.py::TestWebLocustClass::test_client_request_headers PASSED [ 38%]
locust/test/test_locust_class.py::TestWebLocustClass::test_get_request PASSED [ 38%]
locust/test/test_locust_class.py::TestWebLocustClass::test_log_request_name_argument PASSED [ 38%]
locust/test/test_locust_class.py::TestWebLocustClass::test_redirect_url_original_path_as_name PASSED [ 38%]
locust/test/test_locust_class.py::TestCatchResponse::test_catch_response PASSED [ 38%]
locust/test/test_locust_class.py::TestCatchResponse::test_catch_response_allow_404 PASSED [ 39%]
locust/test/test_locust_class.py::TestCatchResponse::test_catch_response_connection_error_fail PASSED [ 39%]
locust/test/test_locust_class.py::TestCatchResponse::test_catch_response_connection_error_success PASSED [ 39%]
locust/test/test_locust_class.py::TestCatchResponse::test_catch_response_http_fail PASSED [ 39%]
locust/test/test_locust_class.py::TestCatchResponse::test_catch_response_http_manual_fail PASSED [ 39%]
locust/test/test_locust_class.py::TestCatchResponse::test_catch_response_http_manual_success PASSED [ 40%]
locust/test/test_locust_class.py::TestCatchResponse::test_interrupt_taskset_with_catch_response PASSED [ 40%]
locust/test/test_log.py::TestGreenletExceptionLogger::test_greenlet_exception_logger PASSED [ 40%]
locust/test/test_log.py::TestLoggingOptions::test_log_to_file FAILED [ 40%]
locust/test/test_log.py::TestLoggingOptions::test_logging_output FAILED [ 40%]
locust/test/test_log.py::TestLoggingOptions::test_skip_logging FAILED [ 40%]
locust/test/test_log.py::TestLoggingOptions::test_user_broken_on_start FAILED [ 41%]
locust/test/test_main.py::StandaloneIntegrationTests::test_autostart_multiple_locustfiles_with_shape FAILED [ 41%]
locust/test/test_main.py::StandaloneIntegrationTests::test_autostart_w_load_shape FAILED [ 41%]
locust/test/test_main.py::StandaloneIntegrationTests::test_autostart_w_run_time FAILED [ 41%]
locust/test/test_main.py::StandaloneIntegrationTests::test_autostart_wo_run_time FAILED [ 41%]
locust/test/test_main.py::StandaloneIntegrationTests::test_command_line_user_selection FAILED [ 42%]
locust/test/test_main.py::StandaloneIntegrationTests::test_custom_arguments FAILED [ 42%]
locust/test/test_main.py::StandaloneIntegrationTests::test_custom_arguments_in_file FAILED [ 42%]
locust/test/test_main.py::StandaloneIntegrationTests::test_custom_exit_code FAILED [ 42%]
locust/test/test_main.py::StandaloneIntegrationTests::test_default_headless_spawn_options FAILED [ 42%]
locust/test/test_main.py::StandaloneIntegrationTests::test_default_headless_spawn_options_with_shape FAILED [ 42%]
locust/test/test_main.py::StandaloneIntegrationTests::test_error_when_duplicate_shape_class_names FAILED [ 43%]
locust/test/test_main.py::StandaloneIntegrationTests::test_error_when_duplicate_userclass_names FAILED [ 43%]
locust/test/test_main.py::StandaloneIntegrationTests::test_error_when_locustfiles_directory_is_empty FAILED [ 43%]
locust/test/test_main.py::StandaloneIntegrationTests::test_error_when_no_tasks_match_tags FAILED [ 43%]
locust/test/test_main.py::StandaloneIntegrationTests::test_error_when_providing_both_run_time_and_a_shape_class FAILED [ 43%]
locust/test/test_main.py::StandaloneIntegrationTests::test_graceful_exit_when_keyboard_interrupt FAILED [ 44%]
locust/test/test_main.py::StandaloneIntegrationTests::test_headless_spawn_options_wo_run_time FAILED [ 44%]
locust/test/test_main.py::StandaloneIntegrationTests::test_help_arg FAILED [ 44%]
locust/test/test_main.py::StandaloneIntegrationTests::test_html_report_option FAILED [ 44%]
locust/test/test_main.py::StandaloneIntegrationTests::test_input FAILED [ 44%]
locust/test/test_main.py::StandaloneIntegrationTests::test_invalid_percentile_parameter FAILED [ 44%]
locust/test/test_main.py::StandaloneIntegrationTests::test_invalid_stop_timeout_string FAILED [ 45%]
locust/test/test_main.py::StandaloneIntegrationTests::test_no_error_when_same_userclass_in_two_files FAILED [ 45%]
locust/test/test_main.py::StandaloneIntegrationTests::test_percentile_parameter FAILED [ 45%]
locust/test/test_main.py::StandaloneIntegrationTests::test_percentiles_to_statistics FAILED [ 45%]
locust/test/test_main.py::StandaloneIntegrationTests::test_run_autostart_with_multiple_locustfiles FAILED [ 45%]
locust/test/test_main.py::StandaloneIntegrationTests::test_run_headless_with_multiple_locustfiles FAILED [ 46%]
locust/test/test_main.py::StandaloneIntegrationTests::test_run_headless_with_multiple_locustfiles_with_shape FAILED [ 46%]
locust/test/test_main.py::StandaloneIntegrationTests::test_run_with_userclass_picker FAILED [ 46%]
locust/test/test_main.py::StandaloneIntegrationTests::test_shape_class_log_disabled_parameters FAILED [ 46%]
locust/test/test_main.py::StandaloneIntegrationTests::test_shape_class_with_use_common_options FAILED [ 46%]
locust/test/test_main.py::StandaloneIntegrationTests::test_spawing_with_fixed_multiple_locustfiles FAILED [ 46%]
locust/test/test_main.py::StandaloneIntegrationTests::test_spawning_with_fixed FAILED [ 47%]
locust/test/test_main.py::StandaloneIntegrationTests::test_web_options FAILED [ 47%]
locust/test/test_main.py::StandaloneIntegrationTests::test_webserver FAILED [ 47%]
locust/test/test_main.py::StandaloneIntegrationTests::test_webserver_multiple_locustfiles FAILED [ 47%]
locust/test/test_main.py::StandaloneIntegrationTests::test_webserver_multiple_locustfiles_in_directory FAILED [ 47%]
locust/test/test_main.py::StandaloneIntegrationTests::test_webserver_multiple_locustfiles_with_shape FAILED [ 48%]
locust/test/test_main.py::DistributedIntegrationTests::test_distributed FAILED [ 48%]
locust/test/test_main.py::DistributedIntegrationTests::test_distributed_events FAILED [ 48%]
locust/test/test_main.py::DistributedIntegrationTests::test_distributed_report_timeout_expired FAILED [ 48%]
locust/test/test_main.py::DistributedIntegrationTests::test_distributed_tags FAILED [ 48%]
locust/test/test_main.py::DistributedIntegrationTests::test_distributed_with_locustfile_distribution_not_plain_filename FAILED [ 48%]
locust/test/test_main.py::DistributedIntegrationTests::test_expect_workers FAILED [ 49%]
locust/test/test_main.py::DistributedIntegrationTests::test_json_schema FAILED [ 49%]
locust/test/test_main.py::DistributedIntegrationTests::test_locustfile_distribution FAILED [ 49%]
locust/test/test_main.py::DistributedIntegrationTests::test_locustfile_distribution_with_workers_started_first FAILED [ 49%]
locust/test/test_main.py::DistributedIntegrationTests::test_processes FAILED [ 49%]
locust/test/test_main.py::DistributedIntegrationTests::test_processes_autodetect FAILED [ 50%]
locust/test/test_main.py::DistributedIntegrationTests::test_processes_ctrl_c FAILED [ 50%]
locust/test/test_main.py::DistributedIntegrationTests::test_processes_error_doesnt_blow_up_completely FAILED [ 50%]
locust/test/test_main.py::DistributedIntegrationTests::test_processes_separate_worker FAILED [ 50%]
locust/test/test_main.py::DistributedIntegrationTests::test_processes_workers_quit_unexpected FAILED [ 50%]
locust/test/test_main.py::DistributedIntegrationTests::test_worker_indexes FAILED [ 51%]
locust/test/test_main.py::DistributedIntegrationTests::test_workers_shut_down_if_master_is_gone FAILED [ 51%]
locust/test/test_parser.py::TestParser::test_default PASSED [ 51%]
locust/test/test_parser.py::TestParser::test_parse_options_from_conf_file PASSED [ 51%]
locust/test/test_parser.py::TestParser::test_parse_options_from_toml_file PASSED [ 51%]
locust/test/test_parser.py::TestParser::test_reset_stats PASSED [ 51%]
locust/test/test_parser.py::TestParser::test_skip_log_setup PASSED [ 52%]
locust/test/test_parser.py::TestArgumentParser::test_csv_full_history_requires_csv PASSED [ 52%]
locust/test/test_parser.py::TestArgumentParser::test_custom_argument PASSED [ 52%]
locust/test/test_parser.py::TestArgumentParser::test_custom_argument_help_message PASSED [ 52%]
locust/test/test_parser.py::TestArgumentParser::test_custom_argument_included_in_web_ui PASSED [ 52%]
locust/test/test_parser.py::TestArgumentParser::test_parse_locustfile PASSED [ 53%]
locust/test/test_parser.py::TestArgumentParser::test_parse_locustfile_empty_directory_error PASSED [ 53%]
locust/test/test_parser.py::TestArgumentParser::test_parse_locustfile_invalid_directory_error PASSED [ 53%]
locust/test/test_parser.py::TestArgumentParser::test_parse_locustfile_multiple_files PASSED [ 53%]
locust/test/test_parser.py::TestArgumentParser::test_parse_locustfile_with_directory PASSED [ 53%]
locust/test/test_parser.py::TestArgumentParser::test_parse_locustfile_with_directory_ignores_invalid_filenames PASSED [ 53%]
locust/test/test_parser.py::TestArgumentParser::test_parse_locustfile_with_nested_directory PASSED [ 54%]
locust/test/test_parser.py::TestArgumentParser::test_parse_options PASSED [ 54%]
locust/test/test_parser.py::TestArgumentParser::test_parse_options_from_env PASSED [ 54%]
locust/test/test_parser.py::TestArgumentParser::test_unknown_command_line_arg PASSED [ 54%]
locust/test/test_parser.py::TestFindLocustfiles::test_find_locustfiles_error_for_invalid_file_extension PASSED [ 54%]
locust/test/test_parser.py::TestFindLocustfiles::test_find_locustfiles_error_if_directory_doesnt_exist PASSED [ 55%]
locust/test/test_parser.py::TestFindLocustfiles::test_find_locustfiles_error_if_invalid_directory PASSED [ 55%]
locust/test/test_parser.py::TestFindLocustfiles::test_find_locustfiles_error_if_multiple_values_for_directory PASSED [ 55%]
locust/test/test_parser.py::TestFindLocustfiles::test_find_locustfiles_ignores_invalid_files_in_directory PASSED [ 55%]
locust/test/test_parser.py::TestFindLocustfiles::test_find_locustfiles_with_is_directory PASSED [ 55%]
locust/test/test_parser.py::TestFindLocustfiles::test_find_locustfiles_with_multiple_locustfiles PASSED [ 55%]
locust/test/test_parser.py::TestLocustfileIsDirectory::test_locustfile_is_directory_false_if_file_and_directory_share_the_same_name PASSED [ 56%]
locust/test/test_parser.py::TestLocustfileIsDirectory::test_locustfile_is_directory_multiple_locustfiles PASSED [ 56%]
locust/test/test_parser.py::TestLocustfileIsDirectory::test_locustfile_is_directory_single_locustfile PASSED [ 56%]
locust/test/test_parser.py::TestLocustfileIsDirectory::test_locustfile_is_directory_single_locustfile_without_file_extension PASSED [ 56%]
locust/test/test_parser.py::TestLocustfileIsDirectory::test_locustfile_is_directory_true_if_directory PASSED [ 56%]
locust/test/test_runners.py::TestLocustRunner::test_attributes_populated_when_calling_start PASSED [ 57%]
locust/test/test_runners.py::TestLocustRunner::test_can_call_stop_endpoint_if_currently_swarming PASSED [ 57%]
locust/test/test_runners.py::TestLocustRunner::test_change_user_count_during_spawning PASSED [ 57%]
locust/test/test_runners.py::TestLocustRunner::test_cpu_warning PASSED [ 57%]
locust/test/test_runners.py::TestLocustRunner::test_custom_dispatcher_class PASSED [ 57%]
locust/test/test_runners.py::TestLocustRunner::test_custom_message PASSED [ 57%]
locust/test/test_runners.py::TestLocustRunner::test_duplicate_message_handler_registration PASSED [ 58%]
locust/test/test_runners.py::TestLocustRunner::test_host_class_attribute_from_web PASSED [ 58%]
locust/test/test_runners.py::TestLocustRunner::test_kill_locusts PASSED [ 58%]
locust/test/test_runners.py::TestLocustRunner::test_no_reset_stats PASSED [ 58%]
locust/test/test_runners.py::TestLocustRunner::test_reset_stats PASSED [ 58%]
locust/test/test_runners.py::TestLocustRunner::test_runner_quit_can_run_on_stop_for_multiple_users_concurrently PASSED [ 59%]
locust/test/test_runners.py::TestLocustRunner::test_runner_reference_on_environment PASSED [ 59%]
locust/test/test_runners.py::TestLocustRunner::test_start_event PASSED [ 59%]
locust/test/test_runners.py::TestLocustRunner::test_stop_event PASSED [ 59%]
locust/test/test_runners.py::TestLocustRunner::test_stop_event_quit PASSED [ 59%]
locust/test/test_runners.py::TestLocustRunner::test_stop_event_stop_and_quit PASSED [ 59%]
locust/test/test_runners.py::TestLocustRunner::test_stop_users_count PASSED [ 60%]
locust/test/test_runners.py::TestLocustRunner::test_stop_users_with_spawn_rate PASSED [ 60%]
locust/test/test_runners.py::TestLocustRunner::test_stopping_event PASSED [ 60%]
locust/test/test_runners.py::TestLocustRunner::test_swarm_endpoint_is_non_blocking PASSED [ 60%]
locust/test/test_runners.py::TestLocustRunner::test_target_user_count_is_set_before_ramp_up PASSED [ 60%]
locust/test/test_runners.py::TestLocustRunner::test_undefined_custom_message PASSED [ 61%]
locust/test/test_runners.py::TestLocustRunner::test_user_classes_count PASSED [ 61%]
locust/test/test_runners.py::TestLocustRunner::test_user_count_starts_from_specified_amount_when_creating_new_test_after_previous_step_has_been_stopped PASSED [ 61%]
locust/test/test_runners.py::TestLocustRunner::test_users_can_call_runner_quit_without_deadlocking PASSED [ 61%]
locust/test/test_runners.py::TestMasterRunner::test_attributes_populated_when_calling_start FAILED [ 61%]
locust/test/test_runners.py::TestMasterRunner::test_custom_message_receive PASSED [ 61%]
locust/test/test_runners.py::TestMasterRunner::test_custom_message_send PASSED [ 62%]
locust/test/test_runners.py::TestMasterRunner::test_custom_shape_scale_down FAILED [ 62%]
locust/test/test_runners.py::TestMasterRunner::test_custom_shape_scale_interval FAILED [ 62%]
locust/test/test_runners.py::TestMasterRunner::test_custom_shape_scale_up FAILED [ 62%]
locust/test/test_runners.py::TestMasterRunner::test_exception_in_task PASSED [ 62%]
locust/test/test_runners.py::TestMasterRunner::test_exception_is_caught PASSED [ 63%]
locust/test/test_runners.py::TestMasterRunner::test_last_worker_missing_stops_test FAILED [ 63%]
locust/test/test_runners.py::TestMasterRunner::test_last_worker_quitting_stops_test FAILED [ 63%]
locust/test/test_runners.py::TestMasterRunner::test_master_current_response_times PASSED [ 63%]
locust/test/test_runners.py::TestMasterRunner::test_master_discard_first_client_ready FAILED [ 63%]
locust/test/test_runners.py::TestMasterRunner::test_master_marks_downed_workers_as_missing FAILED [ 63%]
locust/test/test_runners.py::TestMasterRunner::test_master_reset_connection FAILED [ 64%]
locust/test/test_runners.py::TestMasterRunner::test_master_total_stats PASSED [ 64%]
locust/test/test_runners.py::TestMasterRunner::test_master_total_stats_with_none_response_times PASSED [ 64%]
locust/test/test_runners.py::TestMasterRunner::test_rebalance_locust_users_on_worker_connect FAILED [ 64%]
locust/test/test_runners.py::TestMasterRunner::test_reset_connection_after_RPCError FAILED [ 64%]
locust/test/test_runners.py::TestMasterRunner::test_sends_spawn_data_to_ready_running_spawning_workers PASSED [ 65%]
locust/test/test_runners.py::TestMasterRunner::test_spawn_correct_worker_indexes FAILED [ 65%]
locust/test/test_runners.py::TestMasterRunner::test_spawn_fewer_locusts_than_workers FAILED [ 65%]
locust/test/test_runners.py::TestMasterRunner::test_spawn_uneven_locusts FAILED [ 65%]
locust/test/test_runners.py::TestMasterRunner::test_spawn_zero_locusts PASSED [ 65%]
locust/test/test_runners.py::TestMasterRunner::test_start_event FAILED [ 65%]
locust/test/test_runners.py::TestMasterRunner::test_stop_event FAILED [ 66%]
locust/test/test_runners.py::TestMasterRunner::test_stop_event_quit FAILED [ 66%]
locust/test/test_runners.py::TestMasterRunner::test_undefined_custom_message_receive PASSED [ 66%]
locust/test/test_runners.py::TestMasterRunner::test_unknown_host_sends_message_to_master FAILED [ 66%]
locust/test/test_runners.py::TestMasterRunner::test_wait_for_workers_report_after_ramp_up PASSED [ 66%]
locust/test/test_runners.py::TestMasterRunner::test_worker_connect FAILED [ 67%]
locust/test/test_runners.py::TestMasterRunner::test_worker_connect_with_special_versions FAILED [ 67%]
locust/test/test_runners.py::TestMasterRunner::test_worker_missing_after_heartbeat_dead_interval FAILED [ 67%]
locust/test/test_runners.py::TestMasterRunner::test_worker_sends_bad_message_to_master FAILED [ 67%]
locust/test/test_runners.py::TestMasterRunner::test_worker_sends_unrecognized_message_to_master FAILED [ 67%]
locust/test/test_runners.py::TestMasterRunner::test_worker_stats_report_median PASSED [ 67%]
locust/test/test_runners.py::TestMasterRunner::test_worker_stats_report_with_none_response_times PASSED [ 68%]
locust/test/test_runners.py::TestWorkerRunner::test_change_user_count_during_spawning PASSED [ 68%]
locust/test/test_runners.py::TestWorkerRunner::test_computed_properties PASSED [ 68%]
locust/test/test_runners.py::TestWorkerRunner::test_custom_message_receive PASSED [ 68%]
locust/test/test_runners.py::TestWorkerRunner::test_custom_message_send PASSED [ 68%]
locust/test/test_runners.py::TestWorkerRunner::test_reset_rpc_connection_to_master PASSED [ 69%]
locust/test/test_runners.py::TestWorkerRunner::test_spawn_message_with_older_timestamp_is_rejected PASSED [ 69%]
locust/test/test_runners.py::TestWorkerRunner::test_start_event PASSED [ 69%]
locust/test/test_runners.py::TestWorkerRunner::test_stop_event PASSED [ 69%]
locust/test/test_runners.py::TestWorkerRunner::test_undefined_custom_message_receive PASSED [ 69%]
locust/test/test_runners.py::TestWorkerRunner::test_worker_connect_failure PASSED [ 69%]
locust/test/test_runners.py::TestWorkerRunner::test_worker_connect_success PASSED [ 70%]
locust/test/test_runners.py::TestWorkerRunner::test_worker_heartbeat_messages_sent_to_master PASSED [ 70%]
locust/test/test_runners.py::TestWorkerRunner::test_worker_messages_sent_to_master PASSED [ 70%]
locust/test/test_runners.py::TestWorkerRunner::test_worker_stop_timeout PASSED [ 70%]
locust/test/test_runners.py::TestWorkerRunner::test_worker_without_stop_timeout PASSED [ 70%]
locust/test/test_runners.py::TestMessageSerializing::test_message_serialize PASSED [ 71%]
locust/test/test_runners.py::TestStopTimeout::test_gracefully_handle_exceptions_in_listener PASSED [ 71%]
locust/test/test_runners.py::TestStopTimeout::test_kill_locusts_with_stop_timeout PASSED [ 71%]
locust/test/test_runners.py::TestStopTimeout::test_stop_timeout PASSED [ 71%]
locust/test/test_runners.py::TestStopTimeout::test_stop_timeout_during_on_start PASSED [ 71%]
locust/test/test_runners.py::TestStopTimeout::test_stop_timeout_exit_during_wait PASSED [ 71%]
locust/test/test_runners.py::TestStopTimeout::test_stop_timeout_with_interrupt PASSED [ 72%]
locust/test/test_runners.py::TestStopTimeout::test_stop_timeout_with_interrupt_no_reschedule PASSED [ 72%]
locust/test/test_runners.py::TestStopTimeout::test_stop_timeout_with_ramp_down PASSED [ 72%]
locust/test/test_runners.py::TestStopTimeout::test_users_can_call_runner_quit_with_stop_timeout PASSED [ 72%]
locust/test/test_sequential_taskset.py::TestTaskSet::test_task_sequence_multiple_iterations PASSED [ 72%]
locust/test/test_sequential_taskset.py::TestTaskSet::test_task_sequence_with_inheritance PASSED [ 73%]
locust/test/test_sequential_taskset.py::TestTaskSet::test_task_sequence_with_list PASSED [ 73%]
locust/test/test_sequential_taskset.py::TestTaskSet::test_task_sequence_with_methods PASSED [ 73%]
locust/test/test_sequential_taskset.py::TestTaskSet::test_task_sequence_with_methods_and_list PASSED [ 73%]
locust/test/test_stats.py::TestRequestStats::test_aggregation PASSED [ 73%]
locust/test/test_stats.py::TestRequestStats::test_aggregation_last_request_timestamp PASSED [ 73%]
locust/test/test_stats.py::TestRequestStats::test_aggregation_min_response_time PASSED [ 74%]
locust/test/test_stats.py::TestRequestStats::test_aggregation_with_decimal_rounding PASSED [ 74%]
locust/test/test_stats.py::TestRequestStats::test_aggregation_with_rounding PASSED [ 74%]
locust/test/test_stats.py::TestRequestStats::test_avg PASSED [ 74%]
locust/test/test_stats.py::TestRequestStats::test_avg_only_none PASSED [ 74%]
locust/test/test_stats.py::TestRequestStats::test_current_fail_per_sec PASSED [ 75%]
locust/test/test_stats.py::TestRequestStats::test_current_rps PASSED [ 75%]
locust/test/test_stats.py::TestRequestStats::test_custom_percentile_list PASSED [ 75%]
locust/test/test_stats.py::TestRequestStats::test_error_grouping PASSED [ 75%]
locust/test/test_stats.py::TestRequestStats::test_error_grouping_errors_with_memory_addresses PASSED [ 75%]
locust/test/test_stats.py::TestRequestStats::test_median PASSED [ 75%]
locust/test/test_stats.py::TestRequestStats::test_median_out_of_min_max_bounds PASSED [ 76%]
locust/test/test_stats.py::TestRequestStats::test_num_reqs_fails PASSED [ 76%]
locust/test/test_stats.py::TestRequestStats::test_percentile PASSED [ 76%]
locust/test/test_stats.py::TestRequestStats::test_percentile_rounded_down PASSED [ 76%]
locust/test/test_stats.py::TestRequestStats::test_percentile_rounded_up PASSED [ 76%]
locust/test/test_stats.py::TestRequestStats::test_reset PASSED [ 77%]
locust/test/test_stats.py::TestRequestStats::test_reset_min_response_time PASSED [ 77%]
locust/test/test_stats.py::TestRequestStats::test_rps_less_than_one_second PASSED [ 77%]
locust/test/test_stats.py::TestRequestStats::test_serialize_through_message PASSED [ 77%]
locust/test/test_stats.py::TestRequestStats::test_total_content_length PASSED [ 77%]
locust/test/test_stats.py::TestRequestStats::test_total_rps PASSED [ 77%]
locust/test/test_stats.py::TestStatsPrinting::test_print_error_report PASSED [ 78%]
locust/test/test_stats.py::TestStatsPrinting::test_print_percentile_stats PASSED [ 78%]
locust/test/test_stats.py::TestStatsPrinting::test_print_stats PASSED [ 78%]
locust/test/test_stats.py::TestCsvStats::test_csv_stats_on_master_from_aggregated_stats PASSED [ 78%]
locust/test/test_stats.py::TestCsvStats::test_csv_stats_writer PASSED [ 78%]
locust/test/test_stats.py::TestCsvStats::test_csv_stats_writer_full_history PASSED [ 79%]
locust/test/test_stats.py::TestCsvStats::test_requests_csv_quote_escaping PASSED [ 79%]
locust/test/test_stats.py::TestCsvStats::test_stats_history FAILED [ 79%]
locust/test/test_stats.py::TestCsvStats::test_user_count_in_csv_history_stats PASSED [ 79%]
locust/test/test_stats.py::TestCsvStats::test_write_csv_files PASSED [ 79%]
locust/test/test_stats.py::TestCsvStats::test_write_csv_files_full_history PASSED [ 79%]
locust/test/test_stats.py::TestStatsEntryResponseTimesCache::test_diff_response_times_dicts PASSED [ 80%]
locust/test/test_stats.py::TestStatsEntryResponseTimesCache::test_get_current_response_time_percentile PASSED [ 80%]
locust/test/test_stats.py::TestStatsEntryResponseTimesCache::test_get_current_response_time_percentile_outside_cache_window PASSED [ 80%]
locust/test/test_stats.py::TestStatsEntryResponseTimesCache::test_latest_total_response_times_pruned PASSED [ 80%]
locust/test/test_stats.py::TestStatsEntryResponseTimesCache::test_response_times_cached PASSED [ 80%]
locust/test/test_stats.py::TestStatsEntryResponseTimesCache::test_response_times_not_cached_if_not_enabled PASSED [ 81%]
locust/test/test_stats.py::TestStatsEntry::test_fail_ratio_with_all_failures PASSED [ 81%]
locust/test/test_stats.py::TestStatsEntry::test_fail_ratio_with_half_failures PASSED [ 81%]
locust/test/test_stats.py::TestStatsEntry::test_fail_ratio_with_no_failures PASSED [ 81%]
locust/test/test_stats.py::TestRequestStatsWithWebserver::test_request_connection_error PASSED [ 81%]
locust/test/test_stats.py::TestRequestStatsWithWebserver::test_request_stats_content_length PASSED [ 81%]
locust/test/test_stats.py::TestRequestStatsWithWebserver::test_request_stats_named_endpoint PASSED [ 82%]
locust/test/test_stats.py::TestRequestStatsWithWebserver::test_request_stats_named_endpoint_rename_request PASSED [ 82%]
locust/test/test_stats.py::TestRequestStatsWithWebserver::test_request_stats_named_endpoint_request_name PASSED [ 82%]
locust/test/test_stats.py::TestRequestStatsWithWebserver::test_request_stats_no_content_length PASSED [ 82%]
locust/test/test_stats.py::TestRequestStatsWithWebserver::test_request_stats_no_content_length_streaming PASSED [ 82%]
locust/test/test_stats.py::TestRequestStatsWithWebserver::test_request_stats_put PASSED [ 83%]
locust/test/test_stats.py::TestRequestStatsWithWebserver::test_request_stats_query_variables PASSED [ 83%]
locust/test/test_stats.py::TestInspectUser::test_get_task_ratio_relative PASSED [ 83%]
locust/test/test_stats.py::TestInspectUser::test_get_task_ratio_total PASSED [ 83%]
locust/test/test_tags.py::TestTags::test_env_exclude_tags PASSED [ 83%]
locust/test/test_tags.py::TestTags::test_env_include_tags PASSED [ 83%]
locust/test/test_tags.py::TestTags::test_exclude_tags_under_user PASSED [ 84%]
locust/test/test_tags.py::TestTags::test_excluding_tags PASSED [ 84%]
locust/test/test_tags.py::TestTags::test_excluding_tags_with_weights PASSED [ 84%]
locust/test/test_tags.py::TestTags::test_excluding_tasksets PASSED [ 84%]
locust/test/test_tags.py::TestTags::test_include_tags_under_user PASSED [ 84%]
locust/test/test_tags.py::TestTags::test_including_and_excluding PASSED [ 85%]
locust/test/test_tags.py::TestTags::test_including_tags PASSED [ 85%]
locust/test/test_tags.py::TestTags::test_including_tags_with_weights PASSED [ 85%]
locust/test/test_tags.py::TestTags::test_including_tasksets PASSED [ 85%]
locust/test/test_tags.py::TestTags::test_tagged_tasks_shared_across_tasksets PASSED [ 85%]
locust/test/test_tags.py::TestTags::test_tagging PASSED [ 85%]
locust/test/test_tags.py::TestTags::test_tagging_taskset PASSED [ 86%]
locust/test/test_tags.py::TestTags::test_tagging_without_args_fails PASSED [ 86%]
locust/test/test_taskratio.py::TestTaskRatio::test_task_ratio_command PASSED [ 86%]
locust/test/test_taskratio.py::TestTaskRatio::test_task_ratio_command_with_locust_weight PASSED [ 86%]
locust/test/test_users.py::TestUserClass::test_fullname_class_scoped PASSED [ 86%]
locust/test/test_users.py::TestUserClass::test_fullname_function_scoped PASSED [ 87%]
locust/test/test_users.py::TestUserClass::test_fullname_module_scoped PASSED [ 87%]
locust/test/test_users.py::TestHttpUserWithWebserver::test_pool_manager_per_user_instance PASSED [ 87%]
locust/test/test_users.py::TestHttpUserWithWebserver::test_shared_pool_manager PASSED [ 87%]
locust/test/test_util.py::TestParseTimespan::test_parse_timespan PASSED [ 87%]
locust/test/test_util.py::TestParseTimespan::test_parse_timespan_invalid_values PASSED [ 87%]
locust/test/test_util.py::TestRounding::test_rounding_down PASSED [ 88%]
locust/test/test_util.py::TestRounding::test_rounding_up PASSED [ 88%]
locust/test/test_wait_time.py::TestWaitTime::test_between PASSED [ 88%]
locust/test/test_wait_time.py::TestWaitTime::test_constant PASSED [ 88%]
locust/test/test_wait_time.py::TestWaitTime::test_constant_throughput PASSED [ 88%]
locust/test/test_wait_time.py::TestWaitTime::test_default_wait_time PASSED [ 89%]
locust/test/test_web.py::TestWebUI::test_custom_argument_dropdown PASSED [ 89%]
locust/test/test_web.py::TestWebUI::test_custom_shape_deactivate_num_users_and_spawn_rate PASSED [ 89%]
locust/test/test_web.py::TestWebUI::test_custom_shape_with_use_common_options_keep_num_users_and_spawn_rate PASSED [ 89%]
locust/test/test_web.py::TestWebUI::test_exceptions PASSED [ 89%]
locust/test/test_web.py::TestWebUI::test_exceptions_csv PASSED [ 89%]
locust/test/test_web.py::TestWebUI::test_failure_stats_csv PASSED [ 90%]
locust/test/test_web.py::TestWebUI::test_host_value_from_multiple_user_classes PASSED [ 90%]
locust/test/test_web.py::TestWebUI::test_host_value_from_multiple_user_classes_different_hosts PASSED [ 90%]
locust/test/test_web.py::TestWebUI::test_host_value_from_user_class PASSED [ 90%]
locust/test/test_web.py::TestWebUI::test_html_stats_report PASSED [ 90%]
locust/test/test_web.py::TestWebUI::test_index PASSED [ 91%]
locust/test/test_web.py::TestWebUI::test_index_with_spawn_options PASSED [ 91%]
locust/test/test_web.py::TestWebUI::test_logs PASSED [ 91%]
locust/test/test_web.py::TestWebUI::test_report_download PASSED [ 91%]
locust/test/test_web.py::TestWebUI::test_report_exceptions PASSED [ 91%]
locust/test/test_web.py::TestWebUI::test_report_host PASSED [ 91%]
locust/test/test_web.py::TestWebUI::test_report_host2 PASSED [ 92%]
locust/test/test_web.py::TestWebUI::test_report_page PASSED [ 92%]
locust/test/test_web.py::TestWebUI::test_report_page_empty_stats PASSED [ 92%]
locust/test/test_web.py::TestWebUI::test_request_stats_csv PASSED [ 92%]
locust/test/test_web.py::TestWebUI::test_request_stats_full_history_csv_not_present PASSED [ 92%]
locust/test/test_web.py::TestWebUI::test_request_stats_with_errors PASSED [ 93%]
locust/test/test_web.py::TestWebUI::test_reset_stats PASSED [ 93%]
locust/test/test_web.py::TestWebUI::test_stats PASSED [ 93%]
locust/test/test_web.py::TestWebUI::test_stats_cache PASSED [ 93%]
locust/test/test_web.py::TestWebUI::test_stats_no_data PASSED [ 93%]
locust/test/test_web.py::TestWebUI::test_stats_rounding PASSED [ 93%]
locust/test/test_web.py::TestWebUI::test_swarm_custom_argument PASSED [ 94%]
locust/test/test_web.py::TestWebUI::test_swarm_defaults_to_all_available_userclasses_when_userclass_picker_is_active_and_no_userclass_in_payload PASSED [ 94%]
locust/test/test_web.py::TestWebUI::test_swarm_error_when_userclass_picker_is_active_but_no_available_userclasses PASSED [ 94%]
locust/test/test_web.py::TestWebUI::test_swarm_host_value_not_specified PASSED [ 94%]
locust/test/test_web.py::TestWebUI::test_swarm_host_value_specified PASSED [ 94%]
locust/test/test_web.py::TestWebUI::test_swarm_multiple_userclasses_specified PASSED [ 95%]
locust/test/test_web.py::TestWebUI::test_swarm_run_time PASSED [ 95%]
locust/test/test_web.py::TestWebUI::test_swarm_run_time_empty_input PASSED [ 95%]
locust/test/test_web.py::TestWebUI::test_swarm_run_time_invalid_input PASSED [ 95%]
locust/test/test_web.py::TestWebUI::test_swarm_shape_class_defaults_to_none_when_userclass_picker_is_active PASSED [ 95%]
locust/test/test_web.py::TestWebUI::test_swarm_shape_class_is_updated_when_userclass_picker_is_active PASSED [ 95%]
locust/test/test_web.py::TestWebUI::test_swarm_shape_class_specified PASSED [ 96%]
locust/test/test_web.py::TestWebUI::test_swarm_updates_parsed_options_when_multiple_userclasses_specified PASSED [ 96%]
locust/test/test_web.py::TestWebUI::test_swarm_updates_parsed_options_when_single_userclass_specified PASSED [ 96%]
locust/test/test_web.py::TestWebUI::test_swarm_userclass_shapeclass_ignored_when_userclass_picker_is_inactive PASSED [ 96%]
locust/test/test_web.py::TestWebUI::test_swarm_userclass_specified PASSED [ 96%]
locust/test/test_web.py::TestWebUI::test_swarm_uses_pre_selected_user_classes_when_empty_payload_and_test_is_already_running_with_class_picker PASSED [ 97%]
locust/test/test_web.py::TestWebUI::test_template_args PASSED [ 97%]
locust/test/test_web.py::TestWebUI::test_update_user_endpoint PASSED [ 97%]
locust/test/test_web.py::TestWebUI::test_web_ui_no_runner PASSED [ 97%]
locust/test/test_web.py::TestWebUI::test_web_ui_reference_on_environment PASSED [ 97%]
locust/test/test_web.py::TestWebUIAuth::test_index_with_web_login_enabled_no_user PASSED [ 97%]
locust/test/test_web.py::TestWebUIAuth::test_index_with_web_login_enabled_valid_user PASSED [ 98%]
locust/test/test_web.py::TestWebUIWithTLS::test_index_with_https PASSED [ 98%]
locust/test/test_web.py::TestWebUIFullHistory::test_request_stats_full_history_csv PASSED [ 98%]
locust/test/test_web.py::TestModernWebUI::test_html_stats_report PASSED [ 98%]
locust/test/test_web.py::TestModernWebUI::test_index_with_modern_ui PASSED [ 98%]
locust/test/test_web.py::TestModernWebUI::test_web_ui_no_runner PASSED [ 99%]
locust/test/test_zmqrpc.py::ZMQRPC_tests::test_client_recv PASSED [ 99%]
locust/test/test_zmqrpc.py::ZMQRPC_tests::test_client_retry PASSED [ 99%]
locust/test/test_zmqrpc.py::ZMQRPC_tests::test_client_send PASSED [ 99%]
locust/test/test_zmqrpc.py::ZMQRPC_tests::test_constructor PASSED [ 99%]
locust/test/test_zmqrpc.py::ZMQRPC_tests::test_rpc_error PASSED [100%]
=================================== FAILURES ===================================
_________________ TestLoadLocustfile.test_locustfile_from_url __________________
self = <urllib3.connection.HTTPSConnection object at 0x7f9f49d8c5c0>
def _new_conn(self) -> socket.socket:
"""Establish a socket connection and set nodelay settings on it.
:return: New socket connection.
"""
try:
> sock = connection.create_connection(
(self._dns_host, self.port),
self.timeout,
source_address=self.source_address,
socket_options=self.socket_options,
)
/usr/lib/python3/dist-packages/urllib3/connection.py:203:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/urllib3/util/connection.py:60: in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
/usr/lib/python3/dist-packages/gevent/_socketcommon.py:225: in getaddrinfo
addrlist = get_hub().resolver.getaddrinfo(host, port, family, type, proto, flags)
/usr/lib/python3/dist-packages/gevent/resolver/thread.py:63: in getaddrinfo
return self.pool.apply(_socket.getaddrinfo, args, kwargs)
/usr/lib/python3/dist-packages/gevent/pool.py:161: in apply
return self.spawn(func, *args, **kwds).get()
src/gevent/event.py:329: in gevent._gevent_cevent.AsyncResult.get
???
src/gevent/event.py:359: in gevent._gevent_cevent.AsyncResult.get
???
src/gevent/event.py:347: in gevent._gevent_cevent.AsyncResult.get
???
src/gevent/event.py:327: in gevent._gevent_cevent.AsyncResult._raise_exception
???
/usr/lib/python3/dist-packages/gevent/_compat.py:49: in reraise
raise value.with_traceback(tb)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
# Copyright (c) 2012 Denis Bilenko. See LICENSE for details.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import os
import sys
from greenlet import greenlet as RawGreenlet
from gevent import monkey
from gevent._compat import integer_types
from gevent.event import AsyncResult
from gevent.exceptions import InvalidThreadUseError
from gevent.greenlet import Greenlet
from gevent._hub_local import get_hub_if_exists
from gevent.hub import _get_hub_noargs as get_hub
from gevent.hub import getcurrent
from gevent.hub import sleep
from gevent.lock import Semaphore
from gevent.pool import GroupMappingMixin
from gevent.util import clear_stack_frames
from gevent._threading import Queue
from gevent._threading import EmptyTimeout
from gevent._threading import start_new_thread
from gevent._threading import get_thread_ident
__all__ = [
'ThreadPool',
'ThreadResult',
]
def _format_hub(hub):
if hub is None:
return '<missing>'
return '<%s at 0x%x thread_ident=0x%x>' % (
hub.__class__.__name__, id(hub), hub.thread_ident
)
def _get_thread_profile(_sys=sys):
if 'threading' in _sys.modules:
return _sys.modules['threading']._profile_hook
def _get_thread_trace(_sys=sys):
if 'threading' in _sys.modules:
return _sys.modules['threading']._trace_hook
class _WorkerGreenlet(RawGreenlet):
# Exists to produce a more useful repr for worker pool
# threads/greenlets, and manage the communication of the worker
# thread with the threadpool.
# Inform the gevent.util.GreenletTree that this should be
# considered the root (for printing purposes)
greenlet_tree_is_root = True
_thread_ident = 0
_exc_info = sys.exc_info
_get_hub_if_exists = staticmethod(get_hub_if_exists)
# We capture the hub each time through the loop in case its created
# so we can destroy it after a fork.
_hub_of_worker = None
# The hub of the threadpool we're working for. Just for info.
_hub = None
# A cookie passed to task_queue.get()
_task_queue_cookie = None
# If not -1, how long to block waiting for a task before we
# exit.
_idle_task_timeout = -1
def __init__(self, threadpool):
# Construct in the main thread (owner of the threadpool)
# The parent greenlet and thread identifier will be set once the
# new thread begins running.
RawGreenlet.__init__(self)
self._hub = threadpool.hub
# Avoid doing any imports in the background thread if it's not
# necessary (monkey.get_original imports if not patched).
# Background imports can hang Python 2 (gevent's thread resolver runs in the BG,
# and resolving may have to import the idna module, which needs an import lock, so
# resolving at module scope)
if monkey.is_module_patched('sys'):
stderr = monkey.get_original('sys', 'stderr')
else:
stderr = sys.stderr
self._stderr = stderr
# We can capture the task_queue; even though it can change if the threadpool
# is re-innitted, we won't be running in that case
self._task_queue = threadpool.task_queue # type:gevent._threading.Queue
self._task_queue_cookie = self._task_queue.allocate_cookie()
self._unregister_worker = threadpool._unregister_worker
self._idle_task_timeout = threadpool._idle_task_timeout
threadpool._register_worker(self)
try:
start_new_thread(self._begin, ())
except:
self._unregister_worker(self)
raise
def _begin(self, _get_c=getcurrent, _get_ti=get_thread_ident):
# Pass arguments to avoid accessing globals during module shutdown.
# we're in the new thread (but its root greenlet). Establish invariants and get going
# by making this the current greenlet.
self.parent = _get_c() # pylint:disable=attribute-defined-outside-init
self._thread_ident = _get_ti()
# ignore the parent attribute. (We can't set parent to None.)
self.parent.greenlet_tree_is_ignored = True
try:
self.switch() # goto run()
except: # pylint:disable=bare-except
# run() will attempt to print any exceptions, but that might
# not work during shutdown. sys.excepthook and such may be gone,
# so things might not get printed at all except for a cryptic
# message. This is especially true on Python 2 (doesn't seem to be
# an issue on Python 3).
pass
def __fixup_hub_before_block(self):
hub = self._get_hub_if_exists() # Don't create one; only set if a worker function did it
if hub is not None:
hub.name = 'ThreadPool Worker Hub'
# While we block, don't let the monitoring thread, if any,
# report us as blocked. Indeed, so long as we never
# try to switch greenlets, don't report us as blocked---
# the threadpool is *meant* to run blocking tasks
if hub is not None and hub.periodic_monitoring_thread is not None:
hub.periodic_monitoring_thread.ignore_current_greenlet_blocking()
self._hub_of_worker = hub
@staticmethod
def __print_tb(tb, stderr):
# Extracted from traceback to avoid accessing any module
# globals (these sometimes happen during interpreter shutdown;
# see test__subprocess_interrupted)
while tb is not None:
f = tb.tb_frame
lineno = tb.tb_lineno
co = f.f_code
filename = co.co_filename
name = co.co_name
print(' File "%s", line %d, in %s' % (filename, lineno, name),
file=stderr)
tb = tb.tb_next
def _before_run_task(self, func, args, kwargs, thread_result,
_sys=sys,
_get_thread_profile=_get_thread_profile,
_get_thread_trace=_get_thread_trace):
# pylint:disable=unused-argument
_sys.setprofile(_get_thread_profile())
_sys.settrace(_get_thread_trace())
def _after_run_task(self, func, args, kwargs, thread_result, _sys=sys):
# pylint:disable=unused-argument
_sys.setprofile(None)
_sys.settrace(None)
def __run_task(self, func, args, kwargs, thread_result):
self._before_run_task(func, args, kwargs, thread_result)
try:
> thread_result.set(func(*args, **kwargs))
E socket.gaierror: [Errno -3] Temporary failure in name resolution
/usr/lib/python3/dist-packages/gevent/threadpool.py:173: gaierror
The above exception was the direct cause of the following exception:
self = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f9f49d22c00>
method = 'GET', url = '/locustio/locust/master/examples/basic.py', body = None
headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
redirect = False, assert_same_host = False
timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
release_conn = False, chunked = False, body_pos = None, preload_content = False
decode_content = False, response_kw = {}
parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/locustio/locust/master/examples/basic.py', query=None, fragment=None)
destination_scheme = None, conn = None, release_this_conn = True
http_tunnel_required = False, err = None, clean_exit = False
def urlopen( # type: ignore[override]
self,
method: str,
url: str,
body: _TYPE_BODY | None = None,
headers: typing.Mapping[str, str] | None = None,
retries: Retry | bool | int | None = None,
redirect: bool = True,
assert_same_host: bool = True,
timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
pool_timeout: int | None = None,
release_conn: bool | None = None,
chunked: bool = False,
body_pos: _TYPE_BODY_POSITION | None = None,
preload_content: bool = True,
decode_content: bool = True,
**response_kw: typing.Any,
) -> BaseHTTPResponse:
"""
Get a connection from the pool and perform an HTTP request. This is the
lowest level call for making a request, so you'll need to specify all
the raw details.
.. note::
More commonly, it's appropriate to use a convenience method
such as :meth:`request`.
.. note::
`release_conn` will only behave as expected if
`preload_content=False` because we want to make
`preload_content=False` the default behaviour someday soon without
breaking backwards compatibility.
:param method:
HTTP request method (such as GET, POST, PUT, etc.)
:param url:
The URL to perform the request on.
:param body:
Data to send in the request body, either :class:`str`, :class:`bytes`,
an iterable of :class:`str`/:class:`bytes`, or a file-like object.
:param headers:
Dictionary of custom headers to send, such as User-Agent,
If-None-Match, etc. If None, pool headers are used. If provided,
these headers completely replace any pool-specific headers.
:param retries:
Configure the number of retries to allow before raising a
:class:`~urllib3.exceptions.MaxRetryError` exception.
Pass ``None`` to retry until you receive a response. Pass a
:class:`~urllib3.util.retry.Retry` object for fine-grained control
over different types of retries.
Pass an integer number to retry connection errors that many times,
but no other types of errors. Pass zero to never retry.
If ``False``, then retries are disabled and any exception is raised
immediately. Also, instead of raising a MaxRetryError on redirects,
the redirect response will be returned.
:type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
:param redirect:
If True, automatically handle redirects (status codes 301, 302,
303, 307, 308). Each redirect counts as a retry. Disabling retries
will disable redirect, too.
:param assert_same_host:
If ``True``, will make sure that the host of the pool requests is
consistent else will raise HostChangedError. When ``False``, you can
use the pool on an HTTP proxy and request foreign hosts.
:param timeout:
If specified, overrides the default timeout for this one
request. It may be a float (in seconds) or an instance of
:class:`urllib3.util.Timeout`.
:param pool_timeout:
If set and the pool is set to block=True, then this method will
block for ``pool_timeout`` seconds and raise EmptyPoolError if no
connection is available within the time period.
:param bool preload_content:
If True, the response's body will be preloaded into memory.
:param bool decode_content:
If True, will attempt to decode the body based on the
'content-encoding' header.
:param release_conn:
If False, then the urlopen call will not release the connection
back into the pool once a response is received (but will release if
you read the entire contents of the response such as when
`preload_content=True`). This is useful if you're not preloading
the response's content immediately. You will need to call
``r.release_conn()`` on the response ``r`` to return the connection
back into the pool. If None, it takes the value of ``preload_content``
which defaults to ``True``.
:param bool chunked:
If True, urllib3 will send the body using chunked transfer
encoding. Otherwise, urllib3 will send the body using the standard
content-length form. Defaults to False.
:param int body_pos:
Position to seek to in file-like body in the event of a retry or
redirect. Typically this won't need to be set because urllib3 will
auto-populate the value when needed.
"""
parsed_url = parse_url(url)
destination_scheme = parsed_url.scheme
if headers is None:
headers = self.headers
if not isinstance(retries, Retry):
retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
if release_conn is None:
release_conn = preload_content
# Check host
if assert_same_host and not self.is_same_host(url):
raise HostChangedError(self, url, retries)
# Ensure that the URL we're connecting to is properly encoded
if url.startswith("/"):
url = to_str(_encode_target(url))
else:
url = to_str(parsed_url.url)
conn = None
# Track whether `conn` needs to be released before
# returning/raising/recursing. Update this variable if necessary, and
# leave `release_conn` constant throughout the function. That way, if
# the function recurses, the original value of `release_conn` will be
# passed down into the recursive call, and its value will be respected.
#
# See issue #651 [1] for details.
#
# [1] <https://github.com/urllib3/urllib3/issues/651>
release_this_conn = release_conn
http_tunnel_required = connection_requires_http_tunnel(
self.proxy, self.proxy_config, destination_scheme
)
# Merge the proxy headers. Only done when not using HTTP CONNECT. We
# have to copy the headers dict so we can safely change it without those
# changes being reflected in anyone else's copy.
if not http_tunnel_required:
headers = headers.copy() # type: ignore[attr-defined]
headers.update(self.proxy_headers) # type: ignore[union-attr]
# Must keep the exception bound to a separate variable or else Python 3
# complains about UnboundLocalError.
err = None
# Keep track of whether we cleanly exited the except block. This
# ensures we do proper cleanup in finally.
clean_exit = False
# Rewind body position, if needed. Record current position
# for future rewinds in the event of a redirect/retry.
body_pos = set_file_position(body, body_pos)
try:
# Request a connection from the queue.
timeout_obj = self._get_timeout(timeout)
conn = self._get_conn(timeout=pool_timeout)
conn.timeout = timeout_obj.connect_timeout # type: ignore[assignment]
# Is this a closed/new connection that requires CONNECT tunnelling?
if self.proxy is not None and http_tunnel_required and conn.is_closed:
try:
self._prepare_proxy(conn)
except (BaseSSLError, OSError, SocketTimeout) as e:
self._raise_timeout(
err=e, url=self.proxy.url, timeout_value=conn.timeout
)
raise
# If we're going to release the connection in ``finally:``, then
# the response doesn't need to know about the connection. Otherwise
# it will also try to release it and we'll have a double-release
# mess.
response_conn = conn if not release_conn else None
# Make the request on the HTTPConnection object
> response = self._make_request(
conn,
method,
url,
timeout=timeout_obj,
body=body,
headers=headers,
chunked=chunked,
retries=retries,
response_conn=response_conn,
preload_content=preload_content,
decode_content=decode_content,
**response_kw,
)
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:791:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:492: in _make_request
raise new_e
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:468: in _make_request
self._validate_conn(conn)
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1097: in _validate_conn
conn.connect()
/usr/lib/python3/dist-packages/urllib3/connection.py:611: in connect
self.sock = sock = self._new_conn()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <urllib3.connection.HTTPSConnection object at 0x7f9f49d8c5c0>
def _new_conn(self) -> socket.socket:
"""Establish a socket connection and set nodelay settings on it.
:return: New socket connection.
"""
try:
sock = connection.create_connection(
(self._dns_host, self.port),
self.timeout,
source_address=self.source_address,
socket_options=self.socket_options,
)
except socket.gaierror as e:
> raise NameResolutionError(self.host, self, e) from e
E urllib3.exceptions.NameResolutionError: <urllib3.connection.HTTPSConnection object at 0x7f9f49d8c5c0>: Failed to resolve 'raw.githubusercontent.com' ([Errno -3] Temporary failure in name resolution)
/usr/lib/python3/dist-packages/urllib3/connection.py:210: NameResolutionError
The above exception was the direct cause of the following exception:
self = <requests.adapters.HTTPAdapter object at 0x7f9f49d22780>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict({'no': 'localhost'})
def send(
self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
):
"""Sends PreparedRequest object. Returns Response object.
:param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
:param stream: (optional) Whether to stream the request content.
:param timeout: (optional) How long to wait for the server to send
data before giving up, as a float, or a :ref:`(connect timeout,
read timeout) <timeouts>` tuple.
:type timeout: float or tuple or urllib3 Timeout object
:param verify: (optional) Either a boolean, in which case it controls whether
we verify the server's TLS certificate, or a string, in which case it
must be a path to a CA bundle to use
:param cert: (optional) Any user-provided SSL certificate to be trusted.
:param proxies: (optional) The proxies dictionary to apply to the request.
:rtype: requests.Response
"""
try:
conn = self.get_connection_with_tls_context(
request, verify, proxies=proxies, cert=cert
)
except LocationValueError as e:
raise InvalidURL(e, request=request)
self.cert_verify(conn, request.url, verify, cert)
url = self.request_url(request, proxies)
self.add_headers(
request,
stream=stream,
timeout=timeout,
verify=verify,
cert=cert,
proxies=proxies,
)
chunked = not (request.body is None or "Content-Length" in request.headers)
if isinstance(timeout, tuple):
try:
connect, read = timeout
timeout = TimeoutSauce(connect=connect, read=read)
except ValueError:
raise ValueError(
f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
f"or a single float to set both timeouts to the same value."
)
elif isinstance(timeout, TimeoutSauce):
pass
else:
timeout = TimeoutSauce(connect=timeout, read=timeout)
try:
> resp = conn.urlopen(
method=request.method,
url=url,
body=request.body,
headers=request.headers,
redirect=False,
assert_same_host=False,
preload_content=False,
decode_content=False,
retries=self.max_retries,
timeout=timeout,
chunked=chunked,
)
/usr/lib/python3/dist-packages/requests/adapters.py:667:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:845: in urlopen
retries = retries.increment(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
method = 'GET', url = '/locustio/locust/master/examples/basic.py'
response = None
error = NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9f49d8c5c0>: Failed to resolve 'raw.githubusercontent.com' ([Errno -3] Temporary failure in name resolution)")
_pool = <urllib3.connectionpool.HTTPSConnectionPool object at 0x7f9f49d22c00>
_stacktrace = <traceback object at 0x7f9f49c78d40>
def increment(
self,
method: str | None = None,
url: str | None = None,
response: BaseHTTPResponse | None = None,
error: Exception | None = None,
_pool: ConnectionPool | None = None,
_stacktrace: TracebackType | None = None,
) -> Retry:
"""Return a new Retry object with incremented retry counters.
:param response: A response object, or None, if the server did not
return a response.
:type response: :class:`~urllib3.response.BaseHTTPResponse`
:param Exception error: An error encountered during the request, or
None if the response was received successfully.
:return: A new ``Retry`` object.
"""
if self.total is False and error:
# Disabled, indicate to re-raise the error.
raise reraise(type(error), error, _stacktrace)
total = self.total
if total is not None:
total -= 1
connect = self.connect
read = self.read
redirect = self.redirect
status_count = self.status
other = self.other
cause = "unknown"
status = None
redirect_location = None
if error and self._is_connection_error(error):
# Connect retry?
if connect is False:
raise reraise(type(error), error, _stacktrace)
elif connect is not None:
connect -= 1
elif error and self._is_read_error(error):
# Read retry?
if read is False or method is None or not self._is_method_retryable(method):
raise reraise(type(error), error, _stacktrace)
elif read is not None:
read -= 1
elif error:
# Other retry?
if other is not None:
other -= 1
elif response and response.get_redirect_location():
# Redirect retry?
if redirect is not None:
redirect -= 1
cause = "too many redirects"
response_redirect_location = response.get_redirect_location()
if response_redirect_location:
redirect_location = response_redirect_location
status = response.status
else:
# Incrementing because of a server error like a 500 in
# status_forcelist and the given method is in the allowed_methods
cause = ResponseError.GENERIC_ERROR
if response and response.status:
if status_count is not None:
status_count -= 1
cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)
status = response.status
history = self.history + (
RequestHistory(method, url, error, status, redirect_location),
)
new_retry = self.new(
total=total,
connect=connect,
read=read,
redirect=redirect,
status=status_count,
other=other,
history=history,
)
if new_retry.is_exhausted():
reason = error or ResponseError(cause)
> raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type]
E urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='raw.githubusercontent.com', port=443): Max retries exceeded with url: /locustio/locust/master/examples/basic.py (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9f49d8c5c0>: Failed to resolve 'raw.githubusercontent.com' ([Errno -3] Temporary failure in name resolution)"))
/usr/lib/python3/dist-packages/urllib3/util/retry.py:515: MaxRetryError
During handling of the above exception, another exception occurred:
url = 'https://raw.githubusercontent.com/locustio/locust/master/examples/basic.py'
def download_locustfile_from_url(url: str) -> str:
try:
> response = requests.get(url)
locust/argument_parser.py:193:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/requests/api.py:73: in get
return request("get", url, params=params, **kwargs)
/usr/lib/python3/dist-packages/requests/api.py:59: in request
return session.request(method=method, url=url, **kwargs)
/usr/lib/python3/dist-packages/requests/sessions.py:589: in request
resp = self.send(prep, **send_kwargs)
/usr/lib/python3/dist-packages/requests/sessions.py:703: in send
r = adapter.send(request, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <requests.adapters.HTTPAdapter object at 0x7f9f49d22780>
request = <PreparedRequest [GET]>, stream = False
timeout = Timeout(connect=None, read=None, total=None), verify = True
cert = None, proxies = OrderedDict({'no': 'localhost'})
def send(
self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
):
"""Sends PreparedRequest object. Returns Response object.
:param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
:param stream: (optional) Whether to stream the request content.
:param timeout: (optional) How long to wait for the server to send
data before giving up, as a float, or a :ref:`(connect timeout,
read timeout) <timeouts>` tuple.
:type timeout: float or tuple or urllib3 Timeout object
:param verify: (optional) Either a boolean, in which case it controls whether
we verify the server's TLS certificate, or a string, in which case it
must be a path to a CA bundle to use
:param cert: (optional) Any user-provided SSL certificate to be trusted.
:param proxies: (optional) The proxies dictionary to apply to the request.
:rtype: requests.Response
"""
try:
conn = self.get_connection_with_tls_context(
request, verify, proxies=proxies, cert=cert
)
except LocationValueError as e:
raise InvalidURL(e, request=request)
self.cert_verify(conn, request.url, verify, cert)
url = self.request_url(request, proxies)
self.add_headers(
request,
stream=stream,
timeout=timeout,
verify=verify,
cert=cert,
proxies=proxies,
)
chunked = not (request.body is None or "Content-Length" in request.headers)
if isinstance(timeout, tuple):
try:
connect, read = timeout
timeout = TimeoutSauce(connect=connect, read=read)
except ValueError:
raise ValueError(
f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
f"or a single float to set both timeouts to the same value."
)
elif isinstance(timeout, TimeoutSauce):
pass
else:
timeout = TimeoutSauce(connect=timeout, read=timeout)
try:
resp = conn.urlopen(
method=request.method,
url=url,
body=request.body,
headers=request.headers,
redirect=False,
assert_same_host=False,
preload_content=False,
decode_content=False,
retries=self.max_retries,
timeout=timeout,
chunked=chunked,
)
except (ProtocolError, OSError) as err:
raise ConnectionError(err, request=request)
except MaxRetryError as e:
if isinstance(e.reason, ConnectTimeoutError):
# TODO: Remove this in 3.0.0: see #2811
if not isinstance(e.reason, NewConnectionError):
raise ConnectTimeout(e, request=request)
if isinstance(e.reason, ResponseError):
raise RetryError(e, request=request)
if isinstance(e.reason, _ProxyError):
raise ProxyError(e, request=request)
if isinstance(e.reason, _SSLError):
# This branch is for urllib3 v1.22 and later.
raise SSLError(e, request=request)
> raise ConnectionError(e, request=request)
E requests.exceptions.ConnectionError: HTTPSConnectionPool(host='raw.githubusercontent.com', port=443): Max retries exceeded with url: /locustio/locust/master/examples/basic.py (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9f49d8c5c0>: Failed to resolve 'raw.githubusercontent.com' ([Errno -3] Temporary failure in name resolution)"))
/usr/lib/python3/dist-packages/requests/adapters.py:700: ConnectionError
During handling of the above exception, another exception occurred:
self = <locust.test.test_load_locustfile.TestLoadLocustfile testMethod=test_locustfile_from_url>
def test_locustfile_from_url(self):
> locustfiles = parse_locustfile_option(
args=[
"-f",
"https://raw.githubusercontent.com/locustio/locust/master/examples/basic.py",
]
)
locust/test/test_load_locustfile.py:216:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
locust/argument_parser.py:370: in parse_locustfile_option
download_locustfile_from_url(f) if is_url(f.strip()) else f.strip() for f in options.locustfile.split(",")
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
url = 'https://raw.githubusercontent.com/locustio/locust/master/examples/basic.py'
def download_locustfile_from_url(url: str) -> str:
try:
response = requests.get(url)
# Check if response is valid python code
ast.parse(response.text)
except requests.exceptions.RequestException as e:
sys.stderr.write(f"Failed to get locustfile from: {url}. Exception: {e}")
> sys.exit(1)
E SystemExit: 1
locust/argument_parser.py:198: SystemExit
----------------------------- Captured stderr call -----------------------------
Failed to get locustfile from: https://raw.githubusercontent.com/locustio/locust/master/examples/basic.py. Exception: HTTPSConnectionPool(host='raw.githubusercontent.com', port=443): Max retries exceeded with url: /locustio/locust/master/examples/basic.py (Caused by NameResolutionError("<urllib3.connection.HTTPSConnection object at 0x7f9f49d8c5c0>: Failed to resolve 'raw.githubusercontent.com' ([Errno -3] Temporary failure in name resolution)"))
_____________________ TestLoggingOptions.test_log_to_file ______________________
self = <locust.test.test_log.TestLoggingOptions testMethod=test_log_to_file>
def test_log_to_file(self):
with temporary_file(
textwrap.dedent(
"""
import logging
from locust import User, task, constant
class MyUser(User):
wait_time = constant(2)
@task
def my_task(self):
print("running my_task")
logging.info("custom log message")
"""
)
) as file_path:
with temporary_file("", suffix=".log") as log_file_path:
try:
> output = subprocess.check_output(
[
"locust",
"-f",
file_path,
"-u",
"1",
"-r",
"1",
"-t",
"1",
"--headless",
"--logfile",
log_file_path,
],
stderr=subprocess.STDOUT,
timeout=10,
text=True,
)
locust/test/test_log.py:158:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:405: in check_output
with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f493b2870 pid=113 returncode=1>
args = ['locust', '-f', '/tmp/tmpxuqlh1nb_locustfile.py', '-u', '1', '-r', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = -1, errwrite = 80, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
____________________ TestLoggingOptions.test_logging_output ____________________
self = <locust.test.test_log.TestLoggingOptions testMethod=test_logging_output>
def test_logging_output(self):
with temporary_file(
textwrap.dedent(
"""
import logging
from locust import User, task, constant
custom_logger = logging.getLogger("custom_logger")
class MyUser(User):
wait_time = constant(2)
@task
def my_task(self):
print("running my_task")
logging.info("custom log message")
custom_logger.info("test")
"""
)
) as file_path:
> output = subprocess.check_output(
[
"locust",
"-f",
file_path,
"-u",
"1",
"-r",
"1",
"-t",
"1",
"--headless",
],
stderr=subprocess.STDOUT,
timeout=10,
text=True,
)
locust/test/test_log.py:58:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:405: in check_output
with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f493b3b90 pid=114 returncode=1>
args = ['locust', '-f', '/tmp/tmpesj9szho_locustfile.py', '-u', '1', '-r', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = -1, errwrite = 80, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_____________________ TestLoggingOptions.test_skip_logging _____________________
self = <locust.test.test_log.TestLoggingOptions testMethod=test_skip_logging>
def test_skip_logging(self):
with temporary_file(
textwrap.dedent(
"""
from locust import User, task, constant
class MyUser(User):
wait_time = constant(2)
@task
def my_task(self):
print("running my_task")
"""
)
) as file_path:
> output = subprocess.check_output(
[
"locust",
"-f",
file_path,
"-u",
"1",
"-r",
"1",
"-t",
"1",
"--headless",
"--skip-log-setup",
],
stderr=subprocess.STDOUT,
timeout=10,
text=True,
)
locust/test/test_log.py:117:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:405: in check_output
with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49342750 pid=115 returncode=1>
args = ['locust', '-f', '/tmp/tmprnzeoekd_locustfile.py', '-u', '1', '-r', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = -1, errwrite = 80, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_________________ TestLoggingOptions.test_user_broken_on_start _________________
self = <locust.test.test_log.TestLoggingOptions testMethod=test_user_broken_on_start>
def test_user_broken_on_start(self):
with temporary_file(
textwrap.dedent(
"""
from locust import HttpUser, task
class TestUser(HttpUser):
host = "invalidhost"
def on_start(self):
self.client.get("/")
"""
)
) as file_path:
> output = subprocess.check_output(
[
"locust",
"-f",
file_path,
"-t",
"1",
"--headless",
],
stderr=subprocess.STDOUT,
timeout=10,
text=True,
)
locust/test/test_log.py:223:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:405: in check_output
with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49340470 pid=116 returncode=1>
args = ['locust', '-f', '/tmp/tmpk06p_n_b_locustfile.py', '-t', '1', '--headless']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = -1, errwrite = 80, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
__ StandaloneIntegrationTests.test_autostart_multiple_locustfiles_with_shape ___
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_autostart_multiple_locustfiles_with_shape>
def test_autostart_multiple_locustfiles_with_shape(self):
port = get_free_tcp_port()
content = textwrap.dedent(
"""
from locust import User, task, between
class TestUser2(User):
wait_time = between(2, 4)
@task
def my_task(self):
print("running my_task() again")
"""
)
with mock_locustfile(content=content) as mocked1:
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, between, LoadTestShape
class LoadTestShape(LoadTestShape):
def tick(self):
run_time = self.get_run_time()
if run_time < 2:
return (10, 1)
return None
class TestUser(User):
wait_time = between(2, 4)
@task
def my_task(self):
print("running my_task()")
"""
)
) as mocked2:
> proc = subprocess.Popen(
[
"locust",
"-f",
f"{mocked1.file_path},{mocked2}",
"--legacy-ui",
"--web-port",
str(port),
"--autostart",
"--autoquit",
"3",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:794:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49340aa0 pid=117 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671769_5153518_97848.py,/tmp/tmp2ns266mg_locustfile.py', '--legacy-ui', '--web-port', '37051', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
____________ StandaloneIntegrationTests.test_autostart_w_load_shape ____________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_autostart_w_load_shape>
def test_autostart_w_load_shape(self):
port = get_free_tcp_port()
with mock_locustfile(
content=MOCK_LOCUSTFILE_CONTENT
+ textwrap.dedent(
"""
from locust import LoadTestShape
class LoadTestShape(LoadTestShape):
def tick(self):
run_time = self.get_run_time()
if run_time < 2:
return (10, 1)
return None
"""
)
) as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--legacy-ui",
"--web-port",
str(port),
"--autostart",
"--autoquit",
"3",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:727:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f493422a0 pid=118 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671769_569973_94592.py', '--legacy-ui', '--web-port', '40605', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_____________ StandaloneIntegrationTests.test_autostart_w_run_time _____________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_autostart_w_run_time>
@unittest.skipIf(sys.platform == "darwin", reason="This is too messy on macOS")
def test_autostart_w_run_time(self):
port = get_free_tcp_port()
with mock_locustfile() as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--web-port",
str(port),
"-t",
"3",
"--autostart",
"--autoquit",
"1",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:635:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49343890 pid=119 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671769_623352_13143.py', '--web-port', '56327', '-t', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
____________ StandaloneIntegrationTests.test_autostart_wo_run_time _____________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_autostart_wo_run_time>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_autostart_wo_run_time(self):
port = get_free_tcp_port()
with mock_locustfile() as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--web-port",
str(port),
"--autostart",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:600:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446ff1d0 pid=120 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671769_6777544_35244.py', '--web-port', '33773', '--autostart']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_________ StandaloneIntegrationTests.test_command_line_user_selection __________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_command_line_user_selection>
def test_command_line_user_selection(self):
LOCUSTFILE_CONTENT = textwrap.dedent(
"""
from locust import User, task, constant
class User1(User):
wait_time = constant(1)
@task
def t(self):
print("User1 is running")
class User2(User):
wait_time = constant(1)
@task
def t(self):
print("User2 is running")
class User3(User):
wait_time = constant(1)
@task
def t(self):
print("User3 is running")
"""
)
with mock_locustfile(content=LOCUSTFILE_CONTENT) as mocked:
proc = subprocess.Popen(
" ".join(
[
"locust",
"-f",
mocked.file_path,
"--headless",
"--run-time",
"2s",
"-u",
"5",
"-r",
"10",
"User2",
"User3",
]
),
stderr=STDOUT,
stdout=PIPE,
shell=True,
text=True,
)
output = proc.communicate()[0]
self.assertNotIn("User1 is running", output)
> self.assertIn("User2 is running", output)
E AssertionError: 'User2 is running' not found in '/<<PKGBUILDDIR>>/debian/locust: 2: from: not found\n/<<PKGBUILDDIR>>/debian/locust: 5: Syntax error: end of file unexpected\n'
locust/test/test_main.py:1080: AssertionError
_______________ StandaloneIntegrationTests.test_custom_arguments _______________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_custom_arguments>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_custom_arguments(self):
port = get_free_tcp_port()
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, constant, events
@events.init_command_line_parser.add_listener
def _(parser, **kw):
parser.add_argument("--custom-string-arg")
class TestUser(User):
wait_time = constant(10)
@task
def my_task(self):
print(self.environment.parsed_options.custom_string_arg)
"""
)
) as file_path:
# print(subprocess.check_output(["cat", file_path]))
> proc = subprocess.Popen(
["locust", "-f", file_path, "--custom-string-arg", "command_line_value", "--web-port", str(port)],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:104:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446fca70 pid=123 returncode=1>
args = ['locust', '-f', '/tmp/tmpdowke14q_locustfile.py', '--custom-string-arg', 'command_line_value', '--web-port', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
___________ StandaloneIntegrationTests.test_custom_arguments_in_file ___________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_custom_arguments_in_file>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_custom_arguments_in_file(self):
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, constant, events
@events.init_command_line_parser.add_listener
def _(parser, **kw):
parser.add_argument("--custom-string-arg")
class TestUser(User):
wait_time = constant(10)
@task
def my_task(self):
print(self.environment.parsed_options.custom_string_arg)
"""
)
) as file_path:
try:
with open("locust.conf", "w") as conf_file:
conf_file.write("custom-string-arg config_file_value")
> proc = subprocess.Popen(
["locust", "-f", file_path, "--autostart"],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:147:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49342630 pid=124 returncode=1>
args = ['locust', '-f', '/tmp/tmp0phcmc_n_locustfile.py', '--autostart']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_______________ StandaloneIntegrationTests.test_custom_exit_code _______________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_custom_exit_code>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_custom_exit_code(self):
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, constant, events
@events.quitting.add_listener
def _(environment, **kw):
environment.process_exit_code = 42
@events.quit.add_listener
def _(exit_code, **kw):
print(f"Exit code in quit event {exit_code}")
class TestUser(User):
wait_time = constant(3)
@task
def my_task(self):
print("running my_task()")
"""
)
) as file_path:
> proc = subprocess.Popen(["locust", "-f", file_path], stdout=PIPE, stderr=PIPE, text=True)
locust/test/test_main.py:182:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446fc590 pid=125 returncode=1>
args = ['locust', '-f', '/tmp/tmphvpepdxu_locustfile.py'], executable = 'locust'
preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
universal_newlines = None, startupinfo = None, creationflags = 0, shell = False
p2cread = -1, p2cwrite = -1, c2pread = 11, c2pwrite = 80, errread = 81
errwrite = 82, restore_signals = True, gid = None, gids = None, uid = None
umask = -1, start_new_session = False, process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
________ StandaloneIntegrationTests.test_default_headless_spawn_options ________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_default_headless_spawn_options>
def test_default_headless_spawn_options(self):
with mock_locustfile() as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--host",
"https://test.com/",
"--run-time",
"1s",
"--headless",
"--loglevel",
"DEBUG",
"--exit-code-on-error",
"0",
# just to test --stop-timeout argument parsing, doesnt actually validate its function:
"--stop-timeout",
"1s",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:371:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446fe360 pid=126 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671769_9346728_86997.py', '--host', 'https://test.com/', '--run-time', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
__ StandaloneIntegrationTests.test_default_headless_spawn_options_with_shape ___
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_default_headless_spawn_options_with_shape>
@unittest.skipIf(sys.version_info < (3, 9), reason="dies in 3.8 on GH and I cant be bothered to investigate it")
def test_default_headless_spawn_options_with_shape(self):
content = MOCK_LOCUSTFILE_CONTENT + textwrap.dedent(
"""
class LoadTestShape(LoadTestShape):
def tick(self):
run_time = self.get_run_time()
if run_time < 2:
return (10, 1)
return None
"""
)
with mock_locustfile(content=content) as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--host",
"https://test.com/",
"--headless",
"--exit-code-on-error",
"0",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:500:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446fde80 pid=127 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671769_9892182_42873.py', '--host', 'https://test.com/', '--headless', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
____ StandaloneIntegrationTests.test_error_when_duplicate_shape_class_names ____
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_error_when_duplicate_shape_class_names>
def test_error_when_duplicate_shape_class_names(self):
MOCK_LOCUSTFILE_CONTENT_C = MOCK_LOCUSTFILE_CONTENT_A + textwrap.dedent(
"""
from locust import LoadTestShape
class TestShape(LoadTestShape):
def tick(self):
run_time = self.get_run_time()
if run_time < 2:
return (10, 1)
return None
"""
)
MOCK_LOCUSTFILE_CONTENT_D = MOCK_LOCUSTFILE_CONTENT_B + textwrap.dedent(
"""
from locust import LoadTestShape
class TestShape(LoadTestShape):
def tick(self):
run_time = self.get_run_time()
if run_time < 2:
return (10, 1)
return None
"""
)
with temporary_file(content=MOCK_LOCUSTFILE_CONTENT_C) as file1:
with temporary_file(content=MOCK_LOCUSTFILE_CONTENT_D) as file2:
> proc = subprocess.Popen(["locust", "-f", f"{file1},{file2}"], stdout=PIPE, stderr=PIPE, text=True)
locust/test/test_main.py:1209:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446ff980 pid=128 returncode=1>
args = ['locust', '-f', '/tmp/tmprj7dfx3c_locustfile.py,/tmp/tmpnodf_hef_locustfile.py']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_____ StandaloneIntegrationTests.test_error_when_duplicate_userclass_names _____
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_error_when_duplicate_userclass_names>
def test_error_when_duplicate_userclass_names(self):
MOCK_LOCUSTFILE_CONTENT_C = textwrap.dedent(
"""
from locust import User, task, constant, events
class TestUser1(User):
wait_time = constant(3)
@task
def my_task(self):
print("running my_task()")
"""
)
with temporary_file(content=MOCK_LOCUSTFILE_CONTENT_A) as file1:
with temporary_file(content=MOCK_LOCUSTFILE_CONTENT_C) as file2:
> proc = subprocess.Popen(["locust", "-f", f"{file1},{file2}"], stdout=PIPE, stderr=PIPE, text=True)
locust/test/test_main.py:1157:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446f24b0 pid=129 returncode=1>
args = ['locust', '-f', '/tmp/tmpkrqf__8u_locustfile.py,/tmp/tmp8xujmuo3_locustfile.py']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
__ StandaloneIntegrationTests.test_error_when_locustfiles_directory_is_empty ___
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_error_when_locustfiles_directory_is_empty>
def test_error_when_locustfiles_directory_is_empty(self):
with TemporaryDirectory() as temp_dir:
> proc = subprocess.Popen(["locust", "-f", temp_dir], stdout=PIPE, stderr=PIPE, text=True)
locust/test/test_main.py:1298:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f493b0aa0 pid=130 returncode=1>
args = ['locust', '-f', '/tmp/tmp18_nia9c'], executable = 'locust'
preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
universal_newlines = None, startupinfo = None, creationflags = 0, shell = False
p2cread = -1, p2cwrite = -1, c2pread = 11, c2pwrite = 80, errread = 81
errwrite = 82, restore_signals = True, gid = None, gids = None, uid = None
umask = -1, start_new_session = False, process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
________ StandaloneIntegrationTests.test_error_when_no_tasks_match_tags ________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_error_when_no_tasks_match_tags>
def test_error_when_no_tasks_match_tags(self):
content = """
from locust import HttpUser, TaskSet, task, constant, LoadTestShape, tag
class MyUser(HttpUser):
host = "http://127.0.0.1:8089"
wait_time = constant(1)
@tag("tag1")
@task
def task1(self):
print("task1")
"""
with mock_locustfile(content=content) as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--headless",
"-t",
"1",
"--tags",
"tag2",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:1317:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f495af590 pid=131 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671770_2086492_44814.py', '--headless', '-t', '1', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_ StandaloneIntegrationTests.test_error_when_providing_both_run_time_and_a_shape_class _
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_error_when_providing_both_run_time_and_a_shape_class>
def test_error_when_providing_both_run_time_and_a_shape_class(self):
content = MOCK_LOCUSTFILE_CONTENT + textwrap.dedent(
"""
from locust import LoadTestShape
class TestShape(LoadTestShape):
def tick(self):
return None
"""
)
with mock_locustfile(content=content) as mocked:
> out = self.assert_run(
[
"locust",
"-f",
mocked.file_path,
"--run-time=1s",
"--headless",
"--exit-code-on-error",
"0",
]
)
locust/test/test_main.py:1226:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
locust/test/test_main.py:65: in assert_run
out = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
/usr/lib/python3/dist-packages/gevent/subprocess.py:2001: in run
with Popen(*popenargs, **kwargs) as process:
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446f1fa0 pid=132 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671770_253979_84157.py', '--run-time=1s', '--headless', '--exit-code-on-error', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
____ StandaloneIntegrationTests.test_graceful_exit_when_keyboard_interrupt _____
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_graceful_exit_when_keyboard_interrupt>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_graceful_exit_when_keyboard_interrupt(self):
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, events, task, constant, LoadTestShape
@events.test_stop.add_listener
def on_test_stop(environment, **kwargs) -> None:
print("Test Stopped")
class LoadTestShape(LoadTestShape):
def tick(self):
run_time = self.get_run_time()
if run_time < 2:
return (10, 1)
return None
class TestUser(User):
wait_time = constant(3)
@task
def my_task(self):
print("running my_task()")
"""
)
) as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked,
"--headless",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:1363:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446f3c20 pid=133 returncode=1>
args = ['locust', '-f', '/tmp/tmp0lsdj1wd_locustfile.py', '--headless']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
______ StandaloneIntegrationTests.test_headless_spawn_options_wo_run_time ______
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_headless_spawn_options_wo_run_time>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_headless_spawn_options_wo_run_time(self):
with mock_locustfile() as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--host",
"https://test.com/",
"--headless",
"--exit-code-on-error",
"0",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:421:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446f1b20 pid=134 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671770_37008_56142.py', '--host', 'https://test.com/', '--headless', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = 81, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
___________________ StandaloneIntegrationTests.test_help_arg ___________________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_help_arg>
def test_help_arg(self):
> output = subprocess.check_output(
["locust", "--help"],
stderr=subprocess.STDOUT,
timeout=5,
text=True,
).strip()
locust/test/test_main.py:72:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:405: in check_output
with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446f2ff0 pid=135 returncode=1>
args = ['locust', '--help'], executable = 'locust', preexec_fn = None
close_fds = True, pass_fds = (), cwd = None, env = None
universal_newlines = None, startupinfo = None, creationflags = 0, shell = False
p2cread = -1, p2cwrite = -1, c2pread = 11, c2pwrite = 80, errread = -1
errwrite = 80, restore_signals = True, gid = None, gids = None, uid = None
umask = -1, start_new_session = False, process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
______________ StandaloneIntegrationTests.test_html_report_option ______________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_html_report_option>
def test_html_report_option(self):
with mock_locustfile() as mocked:
with temporary_file("", suffix=".html") as html_report_file_path:
try:
> output = subprocess.check_output(
[
"locust",
"-f",
mocked.file_path,
"--legacy-ui",
"--host",
"https://test.com/",
"--run-time",
"2s",
"--headless",
"--exit-code-on-error",
"0",
"--html",
html_report_file_path,
],
stderr=subprocess.STDOUT,
timeout=10,
text=True,
).strip()
locust/test/test_main.py:1088:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:405: in check_output
with Popen(*popenargs, stdout=PIPE, **kwargs) as process:
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446f39b0 pid=136 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671770_48288_26144.py', '--legacy-ui', '--host', 'https://test.com/', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 80, errread = -1, errwrite = 80, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
____________________ StandaloneIntegrationTests.test_input _____________________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_input>
@unittest.skipIf(os.name == "nt", reason="termios doesnt exist on windows, and thus we cannot import pty")
def test_input(self):
import pty
LOCUSTFILE_CONTENT = textwrap.dedent(
"""
from locust import User, TaskSet, task, between
class UserSubclass(User):
wait_time = between(0.2, 0.8)
@task
def t(self):
print("Test task is running")
"""
)
with mock_locustfile(content=LOCUSTFILE_CONTENT) as mocked:
stdin_m, stdin_s = pty.openpty()
stdin = os.fdopen(stdin_m, "wb", 0)
proc = subprocess.Popen(
" ".join(
[
"locust",
"-f",
mocked.file_path,
"--headless",
"--run-time",
"7s",
"-u",
"0",
"--loglevel",
"INFO",
]
),
stderr=STDOUT,
stdin=stdin_s,
stdout=PIPE,
shell=True,
text=True,
)
gevent.sleep(1)
stdin.write(b"w")
gevent.sleep(1)
stdin.write(b"W")
gevent.sleep(1)
stdin.write(b"s")
gevent.sleep(1)
stdin.write(b"S")
gevent.sleep(1)
# This should not do anything since we are already at zero users
stdin.write(b"S")
gevent.sleep(1)
output = proc.communicate()[0]
stdin.close()
> self.assertIn("Ramping to 1 users at a rate of 100.00 per second", output)
E AssertionError: 'Ramping to 1 users at a rate of 100.00 per second' not found in '/<<PKGBUILDDIR>>/debian/locust: 2: from: not found\n/<<PKGBUILDDIR>>/debian/locust: 5: Syntax error: end of file unexpected\n'
locust/test/test_main.py:922: AssertionError
_________ StandaloneIntegrationTests.test_invalid_percentile_parameter _________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_invalid_percentile_parameter>
def test_invalid_percentile_parameter(self):
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, constant, events
from locust.stats import PERCENTILES_TO_CHART
PERCENTILES_TO_CHART[0] = 1.2
class TestUser(User):
wait_time = constant(3)
@task
def my_task(self):
print("running my_task()")
"""
)
) as file_path:
> proc = subprocess.Popen(["locust", "-f", file_path, "--autostart"], stdout=PIPE, stderr=PIPE, text=True)
locust/test/test_main.py:287:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f44715340 pid=139 returncode=1>
args = ['locust', '-f', '/tmp/tmpmtdrwrvy_locustfile.py', '--autostart']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_________ StandaloneIntegrationTests.test_invalid_stop_timeout_string __________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_invalid_stop_timeout_string>
def test_invalid_stop_timeout_string(self):
with mock_locustfile() as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--host",
"https://test.com/",
"--stop-timeout",
"asdf1",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:400:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f447157c0 pid=140 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671776_6847074_16104.py', '--host', 'https://test.com/', '--stop-timeout', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
__ StandaloneIntegrationTests.test_no_error_when_same_userclass_in_two_files ___
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_no_error_when_same_userclass_in_two_files>
def test_no_error_when_same_userclass_in_two_files(self):
with temporary_file(content=MOCK_LOCUSTFILE_CONTENT_A) as file1:
MOCK_LOCUSTFILE_CONTENT_C = textwrap.dedent(
f"""
from {os.path.basename(file1)[:-3]} import TestUser1
"""
)
print(MOCK_LOCUSTFILE_CONTENT_C)
with temporary_file(content=MOCK_LOCUSTFILE_CONTENT_C) as file2:
> proc = subprocess.Popen(
["locust", "-f", f"{file1},{file2}", "-t", "1", "--headless"], stdout=PIPE, stderr=PIPE, text=True
)
locust/test/test_main.py:1173:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f44716870 pid=141 returncode=1>
args = ['locust', '-f', '/tmp/tmpksyuazuo_locustfile.py,/tmp/tmp0vmpn_q5_locustfile.py', '-t', '1', '--headless']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
----------------------------- Captured stdout call -----------------------------
from tmpksyuazuo_locustfile import TestUser1
_____________ StandaloneIntegrationTests.test_percentile_parameter _____________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_percentile_parameter>
def test_percentile_parameter(self):
port = get_free_tcp_port()
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, constant, events
from locust.stats import PERCENTILES_TO_CHART
PERCENTILES_TO_CHART[0] = 0.9
PERCENTILES_TO_CHART[1] = 0.4
class TestUser(User):
wait_time = constant(3)
@task
def my_task(self):
print("running my_task()")
"""
)
) as file_path:
> proc = subprocess.Popen(
["locust", "-f", file_path, "--web-port", str(port), "--autostart"], stdout=PIPE, stderr=PIPE, text=True
)
locust/test/test_main.py:233:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f447173e0 pid=142 returncode=1>
args = ['locust', '-f', '/tmp/tmpe7wpn8ge_locustfile.py', '--web-port', '50289', '--autostart']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
__________ StandaloneIntegrationTests.test_percentiles_to_statistics ___________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_percentiles_to_statistics>
def test_percentiles_to_statistics(self):
port = get_free_tcp_port()
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, constant, events
from locust.stats import PERCENTILES_TO_STATISTICS
PERCENTILES_TO_STATISTICS = [0.9, 0.99]
class TestUser(User):
wait_time = constant(3)
@task
def my_task(self):
print("running my_task()")
"""
)
) as file_path:
> proc = subprocess.Popen(
["locust", "-f", file_path, "--web-port", str(port), "--autostart"],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:259:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f44714aa0 pid=143 returncode=1>
args = ['locust', '-f', '/tmp/tmpwcywykz8_locustfile.py', '--web-port', '58691', '--autostart']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
___ StandaloneIntegrationTests.test_run_autostart_with_multiple_locustfiles ____
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_run_autostart_with_multiple_locustfiles>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_run_autostart_with_multiple_locustfiles(self):
with TemporaryDirectory() as temp_dir:
with mock_locustfile(dir=temp_dir):
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, constant, events
class TestUser(User):
wait_time = constant(1)
@task
def my_task(self):
print("running my_task()")
"""
),
dir=temp_dir,
):
> proc = subprocess.Popen(
[
"locust",
"-f",
temp_dir,
"--autostart",
"-u",
"2",
"--exit-code-on-error",
"0",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:685:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f446f3ec0 pid=144 returncode=1>
args = ['locust', '-f', '/tmp/tmp_bw7xlvr', '--autostart', '-u', '2', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
____ StandaloneIntegrationTests.test_run_headless_with_multiple_locustfiles ____
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_run_headless_with_multiple_locustfiles>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_run_headless_with_multiple_locustfiles(self):
with TemporaryDirectory() as temp_dir:
with mock_locustfile(dir=temp_dir):
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, constant, events
class TestUser(User):
wait_time = constant(1)
@task
def my_task(self):
print("running my_task()")
"""
),
dir=temp_dir,
):
> proc = subprocess.Popen(
[
"locust",
"-f",
temp_dir,
"--headless",
"-u",
"2",
"--exit-code-on-error",
"0",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:461:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49a35b80 pid=145 returncode=1>
args = ['locust', '-f', '/tmp/tmpzr2fvx0y', '--headless', '-u', '2', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_ StandaloneIntegrationTests.test_run_headless_with_multiple_locustfiles_with_shape _
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_run_headless_with_multiple_locustfiles_with_shape>
def test_run_headless_with_multiple_locustfiles_with_shape(self):
content = textwrap.dedent(
"""
from locust import User, task, between
class TestUser2(User):
wait_time = between(2, 4)
@task
def my_task(self):
print("running my_task() again")
"""
)
with mock_locustfile(content=content) as mocked1:
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, between, LoadTestShape
class LoadTestShape(LoadTestShape):
def tick(self):
run_time = self.get_run_time()
if run_time < 2:
return (10, 1)
return None
class TestUser(User):
wait_time = between(2, 4)
@task
def my_task(self):
print("running my_task()")
"""
)
) as mocked2:
> proc = subprocess.Popen(
[
"locust",
"-f",
f"{mocked1.file_path},{mocked2}",
"--host",
"https://test.com/",
"--headless",
"--exit-code-on-error",
"0",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:565:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49a36b40 pid=146 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_0187995_92340.py,/tmp/tmp6mi0rx8f_locustfile.py', '--host', 'https://test.com/', '--headless', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
__________ StandaloneIntegrationTests.test_run_with_userclass_picker ___________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_run_with_userclass_picker>
def test_run_with_userclass_picker(self):
with temporary_file(content=MOCK_LOCUSTFILE_CONTENT_A) as file1:
with temporary_file(content=MOCK_LOCUSTFILE_CONTENT_B) as file2:
> proc = subprocess.Popen(
["locust", "-f", f"{file1},{file2}", "--class-picker"],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:1130:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49a37fb0 pid=147 returncode=1>
args = ['locust', '-f', '/tmp/tmpsjs5prls_locustfile.py,/tmp/tmpiu_bd4l2_locustfile.py', '--class-picker']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_____ StandaloneIntegrationTests.test_shape_class_log_disabled_parameters ______
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_shape_class_log_disabled_parameters>
def test_shape_class_log_disabled_parameters(self):
content = MOCK_LOCUSTFILE_CONTENT + textwrap.dedent(
"""
from locust import LoadTestShape
class TestShape(LoadTestShape):
def tick(self):
return None
"""
)
with mock_locustfile(content=content) as mocked:
> out = self.assert_run(
[
"locust",
"--headless",
"-f",
mocked.file_path,
"--exit-code-on-error=0",
"--users=1",
"--spawn-rate=1",
]
)
locust/test/test_main.py:1252:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
locust/test/test_main.py:65: in assert_run
out = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
/usr/lib/python3/dist-packages/gevent/subprocess.py:2001: in run
with Popen(*popenargs, **kwargs) as process:
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49a357c0 pid=148 returncode=1>
args = ['locust', '--headless', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_1292827_65242.py', '--exit-code-on-error=0', '--users=1', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_____ StandaloneIntegrationTests.test_shape_class_with_use_common_options ______
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_shape_class_with_use_common_options>
def test_shape_class_with_use_common_options(self):
content = MOCK_LOCUSTFILE_CONTENT + textwrap.dedent(
"""
from locust import LoadTestShape
class TestShape(LoadTestShape):
use_common_options = True
def tick(self):
return None
"""
)
with mock_locustfile(content=content) as mocked:
> out = self.assert_run(
[
"locust",
"-f",
mocked.file_path,
"--run-time=1s",
"--users=1",
"--spawn-rate=1",
"--headless",
"--exit-code-on-error=0",
]
)
locust/test/test_main.py:1280:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
locust/test/test_main.py:65: in assert_run
out = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
/usr/lib/python3/dist-packages/gevent/subprocess.py:2001: in run
with Popen(*popenargs, **kwargs) as process:
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f44714350 pid=149 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_1953688_49595.py', '--run-time=1s', '--users=1', '--spawn-rate=1', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
___ StandaloneIntegrationTests.test_spawing_with_fixed_multiple_locustfiles ____
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_spawing_with_fixed_multiple_locustfiles>
def test_spawing_with_fixed_multiple_locustfiles(self):
with mock_locustfile(content=MOCK_LOCUSTFILE_CONTENT_A) as mocked1:
with mock_locustfile(content=MOCK_LOCUSTFILE_CONTENT_B) as mocked2:
proc = subprocess.Popen(
" ".join(
[
"locust",
"-f",
f"{mocked1.file_path},{mocked2.file_path}",
"--headless",
"--run-time",
"5s",
"-u",
"10",
"-r",
"10",
"--loglevel",
"INFO",
]
),
stderr=STDOUT,
stdout=PIPE,
shell=True,
text=True,
)
output = proc.communicate()[0]
> self.assertIn("Ramping to 10 users at a rate of 10.00 per second", output)
E AssertionError: 'Ramping to 10 users at a rate of 10.00 per second' not found in '/<<PKGBUILDDIR>>/debian/locust: 2: from: not found\n/<<PKGBUILDDIR>>/debian/locust: 5: Syntax error: end of file unexpected\n'
locust/test/test_main.py:1022: AssertionError
_____________ StandaloneIntegrationTests.test_spawning_with_fixed ______________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_spawning_with_fixed>
def test_spawning_with_fixed(self):
LOCUSTFILE_CONTENT = textwrap.dedent(
"""
from locust import User, task, constant
class User1(User):
fixed_count = 2
wait_time = constant(1)
@task
def t(self):
print("Test task is running")
class User2(User):
wait_time = constant(1)
@task
def t(self):
print("Test task is running")
class User3(User):
wait_time = constant(1)
@task
def t(self):
print("Test task is running")
"""
)
with mock_locustfile(content=LOCUSTFILE_CONTENT) as mocked:
proc = subprocess.Popen(
" ".join(
[
"locust",
"-f",
mocked.file_path,
"--headless",
"--run-time",
"5s",
"-u",
"10",
"-r",
"10",
"--loglevel",
"INFO",
]
),
stderr=STDOUT,
stdout=PIPE,
shell=True,
text=True,
)
output = proc.communicate()[0]
> self.assertIn("Ramping to 10 users at a rate of 10.00 per second", output)
E AssertionError: 'Ramping to 10 users at a rate of 10.00 per second' not found in '/<<PKGBUILDDIR>>/debian/locust: 2: from: not found\n/<<PKGBUILDDIR>>/debian/locust: 5: Syntax error: end of file unexpected\n'
locust/test/test_main.py:987: AssertionError
_________________ StandaloneIntegrationTests.test_web_options __________________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_web_options>
@unittest.skipIf(platform.system() == "Darwin", reason="Messy on macOS on GH")
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_web_options(self):
port = get_free_tcp_port()
if platform.system() != "Darwin":
# MacOS only sets up the loopback interface for 127.0.0.1 and not for 127.*.*.*, so we cant test this
with mock_locustfile() as mocked:
> proc = subprocess.Popen(
["locust", "-f", mocked.file_path, "--web-host", "127.0.0.2", "--web-port", str(port)],
stdout=PIPE,
stderr=PIPE,
)
locust/test/test_main.py:838:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49a361b0 pid=154 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_333616_71343.py', '--web-host', '127.0.0.2', '--web-port', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
__________________ StandaloneIntegrationTests.test_webserver ___________________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_webserver>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_webserver(self):
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, constant, events
class TestUser(User):
wait_time = constant(3)
@task
def my_task(self):
print("running my_task()")
"""
)
) as file_path:
> proc = subprocess.Popen(["locust", "-f", file_path], stdout=PIPE, stderr=PIPE, text=True)
locust/test/test_main.py:206:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49ade4b0 pid=155 returncode=1>
args = ['locust', '-f', '/tmp/tmplrfro3ng_locustfile.py'], executable = 'locust'
preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
universal_newlines = None, startupinfo = None, creationflags = 0, shell = False
p2cread = -1, p2cwrite = -1, c2pread = 11, c2pwrite = 81, errread = 82
errwrite = 83, restore_signals = True, gid = None, gids = None, uid = None
umask = -1, start_new_session = False, process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
________ StandaloneIntegrationTests.test_webserver_multiple_locustfiles ________
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_webserver_multiple_locustfiles>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_webserver_multiple_locustfiles(self):
with mock_locustfile(content=MOCK_LOCUSTFILE_CONTENT_A) as mocked1:
with mock_locustfile(content=MOCK_LOCUSTFILE_CONTENT_B) as mocked2:
> proc = subprocess.Popen(
["locust", "-f", f"{mocked1.file_path},{mocked2.file_path}"], stdout=PIPE, stderr=PIPE, text=True
)
locust/test/test_main.py:297:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49ade1e0 pid=156 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_4431384_73520.py,/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_4432368_59904.py']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_ StandaloneIntegrationTests.test_webserver_multiple_locustfiles_in_directory __
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_webserver_multiple_locustfiles_in_directory>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_webserver_multiple_locustfiles_in_directory(self):
with TemporaryDirectory() as temp_dir:
with mock_locustfile(content=MOCK_LOCUSTFILE_CONTENT_A, dir=temp_dir):
with mock_locustfile(content=MOCK_LOCUSTFILE_CONTENT_B, dir=temp_dir):
> proc = subprocess.Popen(["locust", "-f", temp_dir], stdout=PIPE, stderr=PIPE, text=True)
locust/test/test_main.py:314:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49adef60 pid=157 returncode=1>
args = ['locust', '-f', '/tmp/tmpvudhvvae'], executable = 'locust'
preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
universal_newlines = None, startupinfo = None, creationflags = 0, shell = False
p2cread = -1, p2cwrite = -1, c2pread = 11, c2pwrite = 81, errread = 82
errwrite = 83, restore_signals = True, gid = None, gids = None, uid = None
umask = -1, start_new_session = False, process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
__ StandaloneIntegrationTests.test_webserver_multiple_locustfiles_with_shape ___
self = <locust.test.test_main.StandaloneIntegrationTests testMethod=test_webserver_multiple_locustfiles_with_shape>
@unittest.skipIf(os.name == "nt", reason="Signal handling on windows is hard")
def test_webserver_multiple_locustfiles_with_shape(self):
content = textwrap.dedent(
"""
from locust import User, task, between
class TestUser2(User):
wait_time = between(2, 4)
@task
def my_task(self):
print("running my_task() again")
"""
)
with mock_locustfile(content=content) as mocked1:
with temporary_file(
content=textwrap.dedent(
"""
from locust import User, task, between, LoadTestShape
class LoadTestShape(LoadTestShape):
def tick(self):
run_time = self.get_run_time()
if run_time < 2:
return (10, 1)
return None
class TestUser(User):
wait_time = between(2, 4)
@task
def my_task(self):
print("running my_task()")
"""
)
) as mocked2:
> proc = subprocess.Popen(
["locust", "-f", f"{mocked1.file_path},{mocked2}"], stdout=PIPE, stderr=PIPE, text=True
)
locust/test/test_main.py:357:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49a36ff0 pid=158 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_5544927_97044.py,/tmp/tmpwib_eqpt_locustfile.py']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_________________ DistributedIntegrationTests.test_distributed _________________
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_distributed>
def test_distributed(self):
LOCUSTFILE_CONTENT = textwrap.dedent(
"""
from locust import User, task, constant
class User1(User):
wait_time = constant(1)
@task
def t(self):
pass
"""
)
with mock_locustfile(content=LOCUSTFILE_CONTENT) as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--headless",
"--master",
"--expect-workers",
"1",
"-u",
"3",
"-t",
"5s",
],
stderr=STDOUT,
stdout=PIPE,
text=True,
)
locust/test/test_main.py:1570:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49adf020 pid=160 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_6099231_21244.py', '--headless', '--master', '--expect-workers', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = -1, errwrite = 81, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_____________ DistributedIntegrationTests.test_distributed_events ______________
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_distributed_events>
def test_distributed_events(self):
content = (
MOCK_LOCUSTFILE_CONTENT
+ """
from locust import events
from locust.runners import MasterRunner
@events.test_start.add_listener
def on_test_start(environment, **kwargs):
if isinstance(environment.runner, MasterRunner):
print("test_start on master")
else:
print("test_start on worker")
@events.test_stop.add_listener
def on_test_stop(environment, **kwargs):
if isinstance(environment.runner, MasterRunner):
print("test_stop on master")
else:
print("test_stop on worker")
"""
)
with mock_locustfile(content=content) as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--headless",
"--master",
"--expect-workers",
"1",
"-t",
"1",
"--exit-code-on-error",
"0",
"-L",
"DEBUG",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:1448:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49add190 pid=161 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_6577086_46819.py', '--headless', '--master', '--expect-workers', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_____ DistributedIntegrationTests.test_distributed_report_timeout_expired ______
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_distributed_report_timeout_expired>
def test_distributed_report_timeout_expired(self):
LOCUSTFILE_CONTENT = textwrap.dedent(
"""
from locust import User, task, constant
class User1(User):
wait_time = constant(1)
@task
def t(self):
pass
"""
)
with mock_locustfile(content=LOCUSTFILE_CONTENT) as mocked, patch_env(
"LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.01"
) as _:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--headless",
"--master",
"--expect-workers",
"1",
"-u",
"3",
"-t",
"5s",
],
stderr=STDOUT,
stdout=PIPE,
text=True,
)
locust/test/test_main.py:1624:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49adda30 pid=162 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_7041323_14296.py', '--headless', '--master', '--expect-workers', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = -1, errwrite = 81, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
______________ DistributedIntegrationTests.test_distributed_tags _______________
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_distributed_tags>
def test_distributed_tags(self):
content = """
from locust import HttpUser, TaskSet, task, between, LoadTestShape, tag
class SecondUser(HttpUser):
host = "http://127.0.0.1:8089"
wait_time = between(0, 0.1)
@tag("tag1")
@task
def task1(self):
print("task1")
@tag("tag2")
@task
def task2(self):
print("task2")
"""
with mock_locustfile(content=content) as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--headless",
"--master",
"--expect-workers",
"1",
"-t",
"1",
"-u",
"2",
"--exit-code-on-error",
"0",
"-L",
"DEBUG",
"--tags",
"tag1",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:1509:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49adf6e0 pid=163 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_764136_82652.py', '--headless', '--master', '--expect-workers', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_ DistributedIntegrationTests.test_distributed_with_locustfile_distribution_not_plain_filename _
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_distributed_with_locustfile_distribution_not_plain_filename>
def test_distributed_with_locustfile_distribution_not_plain_filename(self):
LOCUSTFILE_CONTENT = textwrap.dedent(
"""
from locust import User, task, constant
class User1(User):
wait_time = constant(1)
@task
def t(self):
pass
"""
)
with mock_locustfile(content=LOCUSTFILE_CONTENT) as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path[:-3], # remove ".py"
"--headless",
"--master",
],
stderr=STDOUT,
stdout=PIPE,
text=True,
)
locust/test/test_main.py:1804:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49aae1b0 pid=164 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_820524_39488', '--headless', '--master']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = -1, errwrite = 81, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_______________ DistributedIntegrationTests.test_expect_workers ________________
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_expect_workers>
def test_expect_workers(self):
with mock_locustfile() as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--headless",
"--master",
"--expect-workers",
"2",
"--expect-workers-max-wait",
"1",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:1404:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49adf530 pid=165 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_8790064_60105.py', '--headless', '--master', '--expect-workers', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_________________ DistributedIntegrationTests.test_json_schema _________________
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_json_schema>
def test_json_schema(self):
LOCUSTFILE_CONTENT = textwrap.dedent(
"""
from locust import HttpUser, task, constant
class QuickstartUser(HttpUser):
wait_time = constant(1)
@task
def hello_world(self):
self.client.get("/")
"""
)
with mock_locustfile(content=LOCUSTFILE_CONTENT) as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--host",
"http://google.com",
"--headless",
"-u",
"1",
"-t",
"2s",
"--json",
],
stderr=DEVNULL,
stdout=PIPE,
text=True,
)
locust/test/test_main.py:1848:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49aae660 pid=166 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_931894_52989.py', '--host', 'http://google.com', '--headless', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = -1, errwrite = 82, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
___________ DistributedIntegrationTests.test_locustfile_distribution ___________
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_locustfile_distribution>
def test_locustfile_distribution(self):
LOCUSTFILE_CONTENT = textwrap.dedent(
"""
from locust import User, task, constant
class User1(User):
wait_time = constant(1)
@task
def t(self):
pass
"""
)
with mock_locustfile(content=LOCUSTFILE_CONTENT) as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--headless",
"--master",
"--expect-workers",
"2",
"-t",
"1s",
],
stderr=STDOUT,
stdout=PIPE,
text=True,
)
locust/test/test_main.py:1679:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49aae9f0 pid=167 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671777_9879963_84565.py', '--headless', '--master', '--expect-workers', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = -1, errwrite = 81, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_ DistributedIntegrationTests.test_locustfile_distribution_with_workers_started_first _
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_locustfile_distribution_with_workers_started_first>
def test_locustfile_distribution_with_workers_started_first(self):
LOCUSTFILE_CONTENT = textwrap.dedent(
"""
from locust import User, task, constant
class User1(User):
wait_time = constant(1)
@task
def t(self):
print("hello")
"""
)
with mock_locustfile(content=LOCUSTFILE_CONTENT) as mocked:
> proc_worker = subprocess.Popen(
[
"locust",
"-f",
"-",
"--worker",
],
stderr=STDOUT,
stdout=PIPE,
text=True,
)
locust/test/test_main.py:1751:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49aad370 pid=168 returncode=1>
args = ['locust', '-f', '-', '--worker'], executable = 'locust'
preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
universal_newlines = None, startupinfo = None, creationflags = 0, shell = False
p2cread = -1, p2cwrite = -1, c2pread = 11, c2pwrite = 81, errread = -1
errwrite = 81, restore_signals = True, gid = None, gids = None, uid = None
umask = -1, start_new_session = False, process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
__________________ DistributedIntegrationTests.test_processes __________________
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_processes>
@unittest.skipIf(os.name == "nt", reason="--processes doesnt work on windows")
def test_processes(self):
with mock_locustfile() as mocked:
command = f"locust -f {mocked.file_path} --processes 4 --headless --run-time 1 --exit-code-on-error 0"
proc = subprocess.Popen(
command,
shell=True,
stdout=PIPE,
stderr=PIPE,
text=True,
)
try:
_, stderr = proc.communicate(timeout=9)
except Exception:
proc.kill()
assert False, f"locust process never finished: {command}"
self.assertNotIn("Traceback", stderr)
> self.assertIn("(index 3) reported as ready", stderr)
E AssertionError: '(index 3) reported as ready' not found in '/<<PKGBUILDDIR>>/debian/locust: 2: from: not found\n/<<PKGBUILDDIR>>/debian/locust: 5: Syntax error: end of file unexpected\n'
locust/test/test_main.py:1993: AssertionError
____________ DistributedIntegrationTests.test_processes_autodetect _____________
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_processes_autodetect>
@unittest.skipIf(os.name == "nt", reason="--processes doesnt work on windows")
def test_processes_autodetect(self):
with mock_locustfile() as mocked:
command = f"locust -f {mocked.file_path} --processes -1 --headless --run-time 1 --exit-code-on-error 0"
proc = subprocess.Popen(
command,
shell=True,
stdout=PIPE,
stderr=PIPE,
text=True,
)
try:
_, stderr = proc.communicate(timeout=9)
except Exception:
proc.kill()
assert False, f"locust process never finished: {command}"
self.assertNotIn("Traceback", stderr)
> self.assertIn("(index 0) reported as ready", stderr)
E AssertionError: '(index 0) reported as ready' not found in '/<<PKGBUILDDIR>>/debian/locust: 2: from: not found\n/<<PKGBUILDDIR>>/debian/locust: 5: Syntax error: end of file unexpected\n'
locust/test/test_main.py:2013: AssertionError
______________ DistributedIntegrationTests.test_processes_ctrl_c _______________
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_processes_ctrl_c>
@unittest.skipIf(os.name == "nt", reason="--processes doesnt work on windows")
def test_processes_ctrl_c(self):
with mock_locustfile() as mocked:
> proc = psutil.Popen( # use psutil.Popen instead of subprocess.Popen to use extra features
[
"locust",
"-f",
mocked.file_path,
"--processes",
"4",
"--headless",
"-L",
"DEBUG",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:2064:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/psutil/__init__.py:1378: in __init__
self.__subproc = subprocess.Popen(*args, **kwargs)
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49ac4140 pid=173 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671778_179039_4104.py', '--processes', '4', '--headless', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
__ DistributedIntegrationTests.test_processes_error_doesnt_blow_up_completely __
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_processes_error_doesnt_blow_up_completely>
@unittest.skipIf(os.name == "nt", reason="--processes doesnt work on windows")
def test_processes_error_doesnt_blow_up_completely(self):
with mock_locustfile() as mocked:
> proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--processes",
"4",
"-L",
"DEBUG",
"UserThatDoesntExist",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:2162:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49aae4e0 pid=174 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671778_2450106_83811.py', '--processes', '4', '-L', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
__________ DistributedIntegrationTests.test_processes_separate_worker __________
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_processes_separate_worker>
@unittest.skipIf(os.name == "nt", reason="--processes doesnt work on windows")
def test_processes_separate_worker(self):
with mock_locustfile() as mocked:
master_proc = subprocess.Popen(
f"locust -f {mocked.file_path} --master --headless --run-time 1 --exit-code-on-error 0 --expect-workers-max-wait 2",
shell=True,
stdout=PIPE,
stderr=PIPE,
text=True,
)
worker_parent_proc = subprocess.Popen(
f"locust -f {mocked.file_path} --processes 4 --worker",
shell=True,
stdout=PIPE,
stderr=PIPE,
text=True,
)
try:
_, worker_stderr = worker_parent_proc.communicate(timeout=9)
except Exception:
master_proc.kill()
worker_parent_proc.kill()
_, worker_stderr = worker_parent_proc.communicate()
_, master_stderr = master_proc.communicate()
assert False, f"worker never finished: {worker_stderr}"
try:
_, master_stderr = master_proc.communicate(timeout=9)
except Exception:
master_proc.kill()
worker_parent_proc.kill()
_, worker_stderr = worker_parent_proc.communicate()
_, master_stderr = master_proc.communicate()
assert False, f"master never finished: {master_stderr}"
_, worker_stderr = worker_parent_proc.communicate()
_, master_stderr = master_proc.communicate()
self.assertNotIn("Traceback", worker_stderr)
self.assertNotIn("Traceback", master_stderr)
self.assertNotIn("Gave up waiting for workers to connect", master_stderr)
> self.assertIn("(index 3) reported as ready", master_stderr)
E AssertionError: '(index 3) reported as ready' not found in '/<<PKGBUILDDIR>>/debian/locust: 2: from: not found\n/<<PKGBUILDDIR>>/debian/locust: 5: Syntax error: end of file unexpected\n'
locust/test/test_main.py:2058: AssertionError
______ DistributedIntegrationTests.test_processes_workers_quit_unexpected ______
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_processes_workers_quit_unexpected>
@unittest.skipIf(os.name == "nt", reason="--processes doesnt work on windows")
@unittest.skipIf(sys.platform == "darwin", reason="Flaky on macOS :-/")
def test_processes_workers_quit_unexpected(self):
content = """
from locust import runners, events, User, task
import sys
runners.HEARTBEAT_INTERVAL = 0.1
@events.test_start.add_listener
def on_test_start(environment, **_kwargs):
if isinstance(environment.runner, runners.WorkerRunner):
sys.exit(42)
class AnyUser(User):
@task
def mytask(self):
pass
"""
with mock_locustfile(content=content) as mocked:
> worker_proc = subprocess.Popen(
["locust", "-f", mocked.file_path, "--processes", "2", "--worker"],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:2202:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49ac5e20 pid=179 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671778_3578844_9891.py', '--processes', '2', '--worker']
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_______________ DistributedIntegrationTests.test_worker_indexes ________________
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_worker_indexes>
def test_worker_indexes(self):
content = """
from locust import HttpUser, task, between
class AnyUser(HttpUser):
host = "http://127.0.0.1:8089"
wait_time = between(0, 0.1)
@task
def my_task(self):
print("worker index:", self.environment.runner.worker_index)
"""
with mock_locustfile(content=content) as mocked:
> master = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--headless",
"--master",
"--expect-workers",
"2",
"-t",
"5",
"-u",
"2",
"-L",
"DEBUG",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:1900:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49ac7ad0 pid=180 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671778_4205356_10698.py', '--headless', '--master', '--expect-workers', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
_____ DistributedIntegrationTests.test_workers_shut_down_if_master_is_gone _____
self = <locust.test.test_main.DistributedIntegrationTests testMethod=test_workers_shut_down_if_master_is_gone>
@unittest.skipIf(os.name == "nt", reason="--processes doesnt work on windows")
def test_workers_shut_down_if_master_is_gone(self):
content = """
from locust import HttpUser, task, constant, runners
runners.MASTER_HEARTBEAT_TIMEOUT = 2
class AnyUser(HttpUser):
host = "http://127.0.0.1:8089"
wait_time = constant(1)
@task
def my_task(self):
print("worker index:", self.environment.runner.worker_index)
"""
with mock_locustfile(content=content) as mocked:
> master_proc = subprocess.Popen(
[
"locust",
"-f",
mocked.file_path,
"--master",
"--headless",
"--expect-workers",
"2",
],
stdout=PIPE,
stderr=PIPE,
text=True,
)
locust/test/test_main.py:2115:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/gevent/subprocess.py:808: in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <Popen at 0x7f9f49ac5340 pid=181 returncode=1>
args = ['locust', '-f', '/<<PKGBUILDDIR>>/locust/test/mock_locustfile_1731671778_477437_97566.py', '--master', '--headless', '--expect-workers', ...]
executable = 'locust', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, universal_newlines = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11
c2pwrite = 81, errread = 82, errwrite = 83, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False
process_group = None
def _execute_child(self, args, executable, preexec_fn, close_fds,
pass_fds, cwd, env, universal_newlines,
startupinfo, creationflags, shell,
p2cread, p2cwrite,
c2pread, c2pwrite,
errread, errwrite,
restore_signals,
gid, gids, uid, umask,
start_new_session, process_group):
"""Execute program (POSIX version)"""
if isinstance(args, (str, bytes)):
args = [args]
elif isinstance(args, PathLike):
if shell:
raise TypeError('path-like args is not allowed when '
'shell is true')
args = [fsencode(args)] # os.PathLike -> [str]
else:
args = list(args)
if shell:
# On Android the default shell is at '/system/bin/sh'.
unix_shell = (
'/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh'
)
args = [unix_shell, "-c"] + args
if executable:
args[0] = executable
if executable is None:
executable = args[0]
self._loop.install_sigchld()
# For transferring possible exec failure from child to parent
# The first char specifies the exception type: 0 means
# OSError, 1 means some other error.
errpipe_read, errpipe_write = self.pipe_cloexec()
# errpipe_write must not be in the standard io 0, 1, or 2 fd range.
low_fds_to_close = []
while errpipe_write < 3:
low_fds_to_close.append(errpipe_write)
errpipe_write = os.dup(errpipe_write)
for low_fd in low_fds_to_close:
os.close(low_fd)
try:
try:
gc_was_enabled = gc.isenabled()
# Disable gc to avoid bug where gc -> file_dealloc ->
# write to stderr -> hang. http://bugs.python.org/issue1336
gc.disable()
try:
self.pid = fork_and_watch(self._on_child, self._loop, True, fork)
except:
if gc_was_enabled:
gc.enable()
raise
if self.pid == 0:
# Child
# In various places on the child side of things, we catch OSError
# and add attributes to it that detail where in the process we failed;
# like all exceptions until we have exec'd, this exception is pickled
# and sent to the parent to raise in the calling process.
# The parent uses this to decide how to treat that exception,
# adjusting certain information about it as needed.
#
# Python 3.11.8 --- yes, a minor patch release --- stopped
# letting the 'filename' parameter get set in the resulting
# exception for many cases. We're not quite interpreting this
# the same way the stdlib is, I'm sure, but this makes the stdlib
# tests pass.
# XXX: Technically we're doing a lot of stuff here that
# may not be safe to do before a exec(), depending on the OS.
# CPython 3 goes to great lengths to precompute a lot
# of this info before the fork and pass it all to C functions that
# try hard not to call things like malloc(). (Of course,
# CPython 2 pretty much did what we're doing.)
try:
# Close parent's pipe ends
if p2cwrite != -1:
os.close(p2cwrite)
if c2pread != -1:
os.close(c2pread)
if errread != -1:
os.close(errread)
os.close(errpipe_read)
# When duping fds, if there arises a situation
# where one of the fds is either 0, 1 or 2, it
# is possible that it is overwritten (#12607).
if c2pwrite == 0:
c2pwrite = os.dup(c2pwrite)
_set_inheritable(c2pwrite, False)
while errwrite in (0, 1):
errwrite = os.dup(errwrite)
_set_inheritable(errwrite, False)
# Dup fds for child
def _dup2(existing, desired):
# dup2() removes the CLOEXEC flag but
# we must do it ourselves if dup2()
# would be a no-op (issue #10806).
if existing == desired:
self._set_cloexec_flag(existing, False)
elif existing != -1:
os.dup2(existing, desired)
try:
self._remove_nonblock_flag(desired)
except OSError:
# Ignore EBADF, it may not actually be
# open yet.
# Tested beginning in 3.7.0b3 test_subprocess.py
pass
_dup2(p2cread, 0)
_dup2(c2pwrite, 1)
_dup2(errwrite, 2)
# Close pipe fds. Make sure we don't close the
# same fd more than once, or standard fds.
if not True:
closed = set([None])
for fd in (p2cread, c2pwrite, errwrite):
if fd not in closed and fd > 2:
os.close(fd)
closed.add(fd)
# Python 3 (with a working set_inheritable):
# We no longer manually close p2cread,
# c2pwrite, and errwrite here as
# _close_open_fds takes care when it is
# not already non-inheritable.
if cwd is not None:
try:
os.chdir(cwd)
except OSError as e:
e._failed_chdir = True
raise
# Python 3.9
if umask >= 0:
os.umask(umask)
# XXX: CPython does _Py_RestoreSignals here.
# Then setsid() based on ???
try:
if gids:
os.setgroups(gids)
if gid:
os.setregid(gid, gid)
if uid:
os.setreuid(uid, uid)
if process_group is not None:
os.setpgid(0, process_group)
except OSError as e:
e._failed_chuser = True
raise
if preexec_fn:
preexec_fn()
# Close all other fds, if asked for. This must be done
# after preexec_fn runs.
if close_fds:
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
self._close_fds(fds_to_keep, errpipe_write)
if restore_signals:
# restore the documented signals back to sig_dfl;
# not all will be defined on every platform
for sig in 'SIGPIPE', 'SIGXFZ', 'SIGXFSZ':
sig = getattr(signal, sig, None)
if sig is not None:
signal.signal(sig, signal.SIG_DFL)
if start_new_session:
os.setsid()
try:
if env is None:
os.execvp(executable, args)
else:
# Python 3.6 started testing for
# bytes values in the env; it also
# started encoding strs using
# fsencode and using a lower-level
# API that takes a list of keys
# and values. We don't have access
# to that API, so we go the reverse direction.
env = {os.fsdecode(k) if isinstance(k, bytes) else k:
os.fsdecode(v) if isinstance(v, bytes) else v
for k, v in env.items()}
os.execvpe(executable, args, env)
except OSError as e:
e._failed_exec = True
raise
except:
exc_type, exc_value, tb = sys.exc_info()
# Save the traceback and attach it to the exception object
exc_lines = traceback.format_exception(exc_type,
exc_value,
tb)
exc_value.child_traceback = ''.join(exc_lines)
os.write(errpipe_write, pickle.dumps(exc_value))
finally:
# Make sure that the process exits no matter what.
# The return code does not matter much as it won't be
# reported to the application
os._exit(1)
# Parent
self._child_created = True
if gc_was_enabled:
gc.enable()
finally:
# be sure the FD is closed no matter what
os.close(errpipe_write)
# self._devnull is not always defined.
devnull_fd = getattr(self, '_devnull', None)
if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
os.close(p2cread)
if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
os.close(c2pwrite)
if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
os.close(errwrite)
if devnull_fd is not None:
os.close(devnull_fd)
# Prevent a double close of these fds from __init__ on error.
self._closed_child_pipe_fds = True
# Wait for exec to fail or succeed; possibly raising exception
errpipe_read = FileObject(errpipe_read, 'rb')
data = errpipe_read.read()
finally:
try:
if hasattr(errpipe_read, 'close'):
errpipe_read.close()
else:
os.close(errpipe_read)
except OSError:
# Especially on PyPy, we sometimes see the above
# `os.close(errpipe_read)` raise an OSError.
# It's not entirely clear why, but it happens in
# InterprocessSignalTests.test_main sometimes, which must mean
# we have some sort of race condition.
pass
finally:
errpipe_read = -1
if data != b"":
self.wait()
child_exception = pickle.loads(data)
for fd in (p2cwrite, c2pread, errread):
if fd is not None and fd != -1:
os.close(fd)
if isinstance(child_exception, OSError):
child_exception.filename = executable
if hasattr(child_exception, '_failed_chdir'):
child_exception.filename = cwd
if getattr(child_exception, '_failed_chuser', False):
child_exception.filename = None
> raise child_exception
E OSError: [Errno 8] Exec format error: 'locust'
/usr/lib/python3/dist-packages/gevent/subprocess.py:1838: OSError
________ TestMasterRunner.test_attributes_populated_when_calling_start _________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_attributes_populated_when_calling_start>
def test_attributes_populated_when_calling_start(self):
class MyUser1(User):
@task
def my_task(self):
pass
class MyUser2(User):
@task
def my_task(self):
pass
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[MyUser1, MyUser2])
server.mocked_send(Message("client_ready", __version__, "fake_client1"))
master.start(7, 7)
> self.assertEqual({"MyUser1": 4, "MyUser2": 3}, master.target_user_classes_count)
E AssertionError: {'MyUser1': 4, 'MyUser2': 3} != {}
E - {'MyUser1': 4, 'MyUser2': 3}
E + {}
locust/test/test_runners.py:3033: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
________________ TestMasterRunner.test_custom_shape_scale_down _________________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_custom_shape_scale_down>
def test_custom_shape_scale_down(self):
class MyUser(User):
@task
def my_task(self):
pass
class TestShape(LoadTestShape):
def tick(self):
run_time = self.get_run_time()
if run_time < 2:
return 5, 5
elif run_time < 4:
return 1, 5
else:
return None
self.environment.shape_class = TestShape()
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[MyUser])
for i in range(5):
server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
# Start the shape_worker
self.environment.shape_class.reset_time()
master.start_shape()
sleep(0.5)
# Wait for shape_worker to update user_count
num_users = sum(
sum(msg.data["user_classes_count"].values()) for _, msg in server.outbox if msg.type != "ack"
)
> self.assertEqual(
5, num_users, "Total number of users in first stage of shape test is not 5: %i" % num_users
)
E AssertionError: 5 != 0 : Total number of users in first stage of shape test is not 5: 0
locust/test/test_runners.py:2907: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client0). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client3). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client4). That's not going to work.
INFO locust.runners:runners.py:329 Shape test starting.
INFO locust.runners:runners.py:337 Shape worker starting
INFO locust.runners:runners.py:356 Shape test updating to 5 users at 5.00 spawn rate
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
WARNING root:runners.py:305 CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-distributed.html for how to distribute the load over multiple CPU cores or machines
______________ TestMasterRunner.test_custom_shape_scale_interval _______________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_custom_shape_scale_interval>
def test_custom_shape_scale_interval(self):
class MyUser(User):
@task
def my_task(self):
pass
class TestShape(LoadTestShape):
def __init__(self):
super().__init__()
self._users_num = [1, 1, 1, 2, 2, 3, 3, 3, 4]
self._index = 0
def tick(self):
if self._index >= len(self._users_num):
return None
users_num = self._users_num[self._index]
self._index += 1
return users_num, users_num
self.environment.shape_class = TestShape()
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[MyUser])
for i in range(5):
server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
# Start the shape_worker
self.environment.shape_class.reset_time()
master.start_shape()
# Wait for shape_worker to update user_count
sleep(0.5)
num_users = sum(
sum(msg.data["user_classes_count"].values()) for _, msg in server.outbox if msg.type != "ack"
)
> self.assertEqual(
1, num_users, "Total number of users in first stage of shape test is not 1: %i" % num_users
)
E AssertionError: 1 != 0 : Total number of users in first stage of shape test is not 1: 0
locust/test/test_runners.py:2800: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client0). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client3). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client4). That's not going to work.
INFO locust.runners:runners.py:329 Shape test starting.
INFO locust.runners:runners.py:337 Shape worker starting
INFO locust.runners:runners.py:356 Shape test updating to 1 users at 1.00 spawn rate
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
_________________ TestMasterRunner.test_custom_shape_scale_up __________________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_custom_shape_scale_up>
def test_custom_shape_scale_up(self):
class MyUser(User):
@task
def my_task(self):
pass
class TestShape(LoadTestShape):
def tick(self):
run_time = self.get_run_time()
if run_time < 2:
return 1, 1
elif run_time < 4:
return 2, 2
else:
return None
self.environment.shape_class = TestShape()
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[MyUser])
for i in range(5):
server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
# Start the shape_worker
self.environment.shape_class.reset_time()
master.start_shape()
sleep(0.5)
# Wait for shape_worker to update user_count
num_users = sum(
sum(msg.data["user_classes_count"].values()) for _, msg in server.outbox if msg.type != "ack"
)
> self.assertEqual(
1, num_users, "Total number of users in first stage of shape test is not 1: %i" % num_users
)
E AssertionError: 1 != 0 : Total number of users in first stage of shape test is not 1: 0
locust/test/test_runners.py:2858: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client0). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client3). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client4). That's not going to work.
INFO locust.runners:runners.py:329 Shape test starting.
INFO locust.runners:runners.py:337 Shape worker starting
INFO locust.runners:runners.py:356 Shape test updating to 1 users at 1.00 spawn rate
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
_____________ TestMasterRunner.test_last_worker_missing_stops_test _____________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_last_worker_missing_stops_test>
@mock.patch("locust.runners.HEARTBEAT_INTERVAL", new=0.1)
def test_last_worker_missing_stops_test(self):
class TestUser(User):
@task
def my_task(self):
gevent.sleep(600)
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server, patch_env(
"LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.1"
):
master = self.get_runner(user_classes=[TestUser])
server.mocked_send(Message("client_ready", __version__, "fake_client1"))
server.mocked_send(Message("client_ready", __version__, "fake_client2"))
server.mocked_send(Message("client_ready", __version__, "fake_client3"))
master.start(3, 3)
server.mocked_send(Message("spawning", None, "fake_client1"))
server.mocked_send(Message("spawning", None, "fake_client2"))
server.mocked_send(Message("spawning", None, "fake_client3"))
sleep(0.2)
server.mocked_send(
Message(
"heartbeat",
{"state": STATE_RUNNING, "current_cpu_usage": 50, "current_memory_usage": 200, "count": 1},
"fake_client1",
)
)
server.mocked_send(
Message(
"heartbeat",
{"state": STATE_RUNNING, "current_cpu_usage": 50, "current_memory_usage": 200, "count": 1},
"fake_client2",
)
)
server.mocked_send(
Message(
"heartbeat",
{"state": STATE_RUNNING, "current_cpu_usage": 50, "current_memory_usage": 200, "count": 1},
"fake_client3",
)
)
sleep(0.2)
self.assertEqual(0, len(master.clients.missing))
> self.assertEqual(3, master.worker_count)
E AssertionError: 3 != 0
locust/test/test_runners.py:2236: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client3). That's not going to work.
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
WARNING locust.runners:runners.py:1115 Got spawning message from unknown worker fake_client1. Asking worker to quit.
WARNING locust.runners:runners.py:1115 Got spawning message from unknown worker fake_client2. Asking worker to quit.
WARNING locust.runners:runners.py:1115 Got spawning message from unknown worker fake_client3. Asking worker to quit.
INFO locust.runners:runners.py:356 Shape test updating to 1 users at 5.00 spawn rate
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
____________ TestMasterRunner.test_last_worker_quitting_stops_test _____________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_last_worker_quitting_stops_test>
def test_last_worker_quitting_stops_test(self):
class TestUser(User):
@task
def my_task(self):
gevent.sleep(600)
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server, patch_env(
"LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.1"
):
master = self.get_runner(user_classes=[TestUser])
server.mocked_send(Message("client_ready", __version__, "fake_client1"))
server.mocked_send(Message("client_ready", __version__, "fake_client2"))
master.start(1, 2)
server.mocked_send(Message("spawning", None, "fake_client1"))
server.mocked_send(Message("spawning", None, "fake_client2"))
server.mocked_send(Message("quit", None, "fake_client1"))
sleep(0.1)
> self.assertEqual(1, len(master.clients.all))
E AssertionError: 1 != 0
locust/test/test_runners.py:2183: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
WARNING locust.runners:runners.py:1115 Got spawning message from unknown worker fake_client1. Asking worker to quit.
WARNING locust.runners:runners.py:1115 Got spawning message from unknown worker fake_client2. Asking worker to quit.
INFO locust.runners:runners.py:933 Worker 0 failed to send heartbeat, setting state to missing.
INFO locust.runners:runners.py:933 Worker 1 failed to send heartbeat, setting state to missing.
INFO locust.runners:runners.py:933 Worker 2 failed to send heartbeat, setting state to missing.
INFO locust.runners:runners.py:933 Worker 3 failed to send heartbeat, setting state to missing.
INFO locust.runners:runners.py:933 Worker 4 failed to send heartbeat, setting state to missing.
INFO locust.runners:runners.py:941 The last worker went missing, stopping test.
___________ TestMasterRunner.test_master_discard_first_client_ready ____________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_master_discard_first_client_ready>
def test_master_discard_first_client_ready(self):
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
server.mocked_send(Message("client_ready", __version__, "dummy_client"))
# discard first client_ready msg
server.queue.get()
master = self.get_runner()
server.mocked_send(Message("client_ready", __version__, "dummy_client"))
> self.assertEqual(1, len(master.clients))
E AssertionError: 1 != 0
locust/test/test_runners.py:3148: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (dummy_client). That's not going to work.
_________ TestMasterRunner.test_master_marks_downed_workers_as_missing _________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_master_marks_downed_workers_as_missing>
def test_master_marks_downed_workers_as_missing(self):
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner()
server.mocked_send(Message("client_ready", __version__, "fake_client"))
sleep(6)
# print(master.clients['fake_client'].__dict__)
> assert master.clients["fake_client"].state == STATE_MISSING
locust/test/test_runners.py:2162:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <locust.runners.WorkerNodes object at 0x7f9f407c3ec0>, k = 'fake_client'
def __getitem__(self, k: str) -> WorkerNode:
> return self._worker_nodes[k]
E KeyError: 'fake_client'
locust/runners.py:636: KeyError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client). That's not going to work.
INFO locust.runners:runners.py:356 Shape test updating to 2 users at 2.00 spawn rate
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
INFO locust.runners:runners.py:356 Shape test updating to 2 users at 2.00 spawn rate
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
INFO locust.runners:runners.py:342 Shape test stopping
INFO locust.runners:runners.py:342 Shape test stopping
INFO locust.runners:runners.py:356 Shape test updating to 3 users at 3.00 spawn rate
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
________________ TestMasterRunner.test_master_reset_connection _________________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_master_reset_connection>
def test_master_reset_connection(self):
"""Test that connection will be reset when network issues found"""
with mock.patch("locust.runners.FALLBACK_INTERVAL", new=0.1):
with mock.patch("locust.rpc.rpc.Server", mocked_rpc(raise_on_close=False)) as server:
master = self.get_runner()
self.assertEqual(0, len(master.clients))
server.mocked_send(Message("client_ready", NETWORK_BROKEN, "fake_client"))
self.assertTrue(master.connection_broken)
server.mocked_send(Message("client_ready", __version__, "fake_client"))
sleep(1)
self.assertFalse(master.connection_broken)
> self.assertEqual(1, len(master.clients))
E AssertionError: 1 != 0
locust/test/test_runners.py:2998: AssertionError
------------------------------ Captured log call -------------------------------
INFO locust.runners:runners.py:356 Shape test updating to 4 users at 4.00 spawn rate
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client). That's not going to work.
INFO locust.runners:runners.py:959 Resetting RPC server and all worker connections.
________ TestMasterRunner.test_rebalance_locust_users_on_worker_connect ________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_rebalance_locust_users_on_worker_connect>
@mock.patch("locust.runners.HEARTBEAT_INTERVAL", new=600)
def test_rebalance_locust_users_on_worker_connect(self):
class TestUser(User):
@task
def my_task(self):
pass
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[TestUser])
server.mocked_send(Message("client_ready", __version__, "zeh_fake_client1"))
> self.assertEqual(1, len(master.clients))
E AssertionError: 1 != 0
locust/test/test_runners.py:2511: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (zeh_fake_client1). That's not going to work.
____________ TestMasterRunner.test_reset_connection_after_RPCError _____________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_reset_connection_after_RPCError>
def test_reset_connection_after_RPCError(self):
with mock.patch("locust.rpc.rpc.Server", mocked_rpc(raise_on_close=False)) as server:
master = self.get_runner()
server.mocked_send(Message("client_ready", __version__, "fake_client"))
sleep(0.2)
self.assertFalse(master.connection_broken)
> self.assertEqual(1, len(master.clients))
E AssertionError: 1 != 0
locust/test/test_runners.py:3007: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client). That's not going to work.
______________ TestMasterRunner.test_spawn_correct_worker_indexes ______________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_spawn_correct_worker_indexes>
def test_spawn_correct_worker_indexes(self):
"""
Tests that workers would receive a monotonic sequence of ordinal IDs.
"""
class TestUser(User):
@task
def my_task(self):
pass
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[TestUser])
USERS_COUNT = 5
for i in range(USERS_COUNT):
server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
master.start(USERS_COUNT, USERS_COUNT)
> self.assertEqual(USERS_COUNT * 2, len(server.outbox))
E AssertionError: 10 != 0
locust/test/test_runners.py:2753: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client0). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client3). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client4). That's not going to work.
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
____________ TestMasterRunner.test_spawn_fewer_locusts_than_workers ____________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_spawn_fewer_locusts_than_workers>
def test_spawn_fewer_locusts_than_workers(self):
class TestUser(User):
@task
def my_task(self):
pass
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[TestUser])
for i in range(5):
server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
master.start(2, 2)
> self.assertEqual(10, len(server.outbox))
E AssertionError: 10 != 0
locust/test/test_runners.py:2726: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client0). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client3). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client4). That's not going to work.
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
__________________ TestMasterRunner.test_spawn_uneven_locusts __________________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_spawn_uneven_locusts>
def test_spawn_uneven_locusts(self):
"""
Tests that we can accurately spawn a certain number of locusts, even if it's not an
even number of the connected workers
"""
class TestUser(User):
@task
def my_task(self):
pass
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[TestUser])
for i in range(5):
server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
master.start(7, 7)
> self.assertEqual(10, len(server.outbox))
E AssertionError: 10 != 0
locust/test/test_runners.py:2705: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client0). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client3). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client4). That's not going to work.
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
______________________ TestMasterRunner.test_start_event _______________________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_start_event>
def test_start_event(self):
"""
Tests that test_start event is fired
"""
class TestUser(User):
@task
def my_task(self):
pass
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[TestUser])
run_count = [0]
@self.environment.events.test_start.add_listener
def on_test_start(*a, **kw):
run_count[0] += 1
for i in range(5):
server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
master.start(7, 7)
> self.assertEqual(10, len(server.outbox))
E AssertionError: 10 != 0
locust/test/test_runners.py:2580: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client0). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client3). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client4). That's not going to work.
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
_______________________ TestMasterRunner.test_stop_event _______________________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_stop_event>
def test_stop_event(self):
"""
Tests that test_stop event is fired
"""
class TestUser(User):
@task
def my_task(self):
pass
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[TestUser])
@self.environment.events.test_stopping.add_listener
def on_test_stopping(*_, **__):
self.runner_stopping = True
@self.environment.events.test_stop.add_listener
def on_test_stop(*_, **__):
self.runner_stopped = True
for i in range(5):
server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
master.start(7, 7)
> self.assertEqual(10, len(server.outbox))
E AssertionError: 10 != 0
locust/test/test_runners.py:2619: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client0). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client3). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client4). That's not going to work.
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
____________________ TestMasterRunner.test_stop_event_quit _____________________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_stop_event_quit>
def test_stop_event_quit(self):
"""
Tests that test_stop event is fired when quit() is called directly
"""
class TestUser(User):
@task
def my_task(self):
pass
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[TestUser])
@self.environment.events.test_stopping.add_listener
def on_test_stopping(*_, **__):
self.runner_stopping = True
@self.environment.events.test_stop.add_listener
def on_test_stop(*_, **__):
self.runner_stopped = True
for i in range(5):
server.mocked_send(Message("client_ready", __version__, "fake_client%i" % i))
master.start(7, 7)
> self.assertEqual(10, len(server.outbox))
E AssertionError: 10 != 0
locust/test/test_runners.py:2658: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client0). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client3). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client4). That's not going to work.
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
__________ TestMasterRunner.test_unknown_host_sends_message_to_master __________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_unknown_host_sends_message_to_master>
def test_unknown_host_sends_message_to_master(self):
"""
Validate master ignores message that is sent from unknown host
"""
class TestUser(User):
@task
def my_task(self):
pass
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[TestUser])
server.mocked_send(Message("client_ready", __version__, "zeh_fake_client1"))
> self.assertEqual(1, len(master.clients))
E AssertionError: 1 != 0
locust/test/test_runners.py:3217: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (zeh_fake_client1). That's not going to work.
_____________________ TestMasterRunner.test_worker_connect _____________________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_worker_connect>
def test_worker_connect(self):
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner()
server.mocked_send(Message("client_ready", __version__, "zeh_fake_client1"))
> self.assertEqual(1, len(master.clients))
E AssertionError: 1 != 0
locust/test/test_runners.py:2083: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (zeh_fake_client1). That's not going to work.
__________ TestMasterRunner.test_worker_connect_with_special_versions __________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_worker_connect_with_special_versions>
def test_worker_connect_with_special_versions(self):
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner()
server.mocked_send(Message("client_ready", None, "1.x_style_client_should_not_be_allowed"))
self.assertEqual(1, len(self.mocked_log.error))
self.assertEqual(0, len(master.clients))
server.mocked_send(Message("client_ready", "abcd", "other_version_mismatch_should_just_give_a_warning"))
self.assertEqual(1, len(self.mocked_log.warning))
self.assertEqual(1, len(master.clients))
server.mocked_send(Message("client_ready", -1, "version_check_bypass_should_not_warn"))
self.assertEqual(1, len(self.mocked_log.warning))
self.assertEqual(2, len(master.clients))
server.mocked_send(
Message("client_ready", __version__ + "1", "difference_in_patch_version_should_not_warn")
)
self.assertEqual(3, len(master.clients))
> self.assertEqual(1, len(self.mocked_log.warning))
E AssertionError: 1 != 2
locust/test/test_runners.py:2111: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (1.x_style_client_should_not_be_allowed). That's not going to work.
WARNING locust.runners:runners.py:1017 A worker (other_version_mismatch_should_just_give_a_warning) running a different version (abcd) connected, master version is
INFO locust.runners:runners.py:1028 Worker other_version_mismatch_should_just_give_a_warning (index 0) reported as ready. 1 workers connected.
INFO locust.runners:runners.py:1028 Worker version_check_bypass_should_not_warn (index 1) reported as ready. 2 workers connected.
WARNING locust.runners:runners.py:1017 A worker (difference_in_patch_version_should_not_warn) running a different version (1) connected, master version is
INFO locust.runners:runners.py:1028 Worker difference_in_patch_version_should_not_warn (index 2) reported as ready. 3 workers connected.
______ TestMasterRunner.test_worker_missing_after_heartbeat_dead_interval ______
self = <locust.test.test_runners.TestMasterRunner testMethod=test_worker_missing_after_heartbeat_dead_interval>
@mock.patch("locust.runners.HEARTBEAT_INTERVAL", new=0.1)
@mock.patch("locust.runners.HEARTBEAT_DEAD_INTERNAL", new=-3)
def test_worker_missing_after_heartbeat_dead_interval(self):
class TestUser(User):
@task
def my_task(self):
gevent.sleep(600)
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server, patch_env(
"LOCUST_WAIT_FOR_WORKERS_REPORT_AFTER_RAMP_UP", "0.1"
):
master = self.get_runner(user_classes=[TestUser])
server.mocked_send(Message("client_ready", __version__, "fake_client1"))
server.mocked_send(Message("client_ready", __version__, "fake_client2"))
server.mocked_send(Message("client_ready", __version__, "fake_client3"))
master.start(3, 3)
server.mocked_send(Message("spawning", None, "fake_client1"))
server.mocked_send(Message("spawning", None, "fake_client2"))
server.mocked_send(Message("spawning", None, "fake_client3"))
sleep(0.1)
server.mocked_send(
Message(
"heartbeat",
{"state": STATE_RUNNING, "current_cpu_usage": 50, "current_memory_usage": 200, "count": 1},
"fake_client1",
)
)
server.mocked_send(
Message(
"heartbeat",
{"state": STATE_RUNNING, "current_cpu_usage": 50, "current_memory_usage": 200, "count": 1},
"fake_client2",
)
)
server.mocked_send(
Message(
"heartbeat",
{"state": STATE_RUNNING, "current_cpu_usage": 50, "current_memory_usage": 200, "count": 1},
"fake_client3",
)
)
sleep(0.1)
# initially all workers are in active state
self.assertEqual(0, len(master.clients.missing))
> self.assertEqual(3, master.worker_count)
E AssertionError: 3 != 0
locust/test/test_runners.py:2308: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client1). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client2). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (fake_client3). That's not going to work.
WARNING locust.runners:runners.py:743 You can't start a distributed test before at least one worker processes has connected
WARNING locust.runners:runners.py:1115 Got spawning message from unknown worker fake_client1. Asking worker to quit.
WARNING locust.runners:runners.py:1115 Got spawning message from unknown worker fake_client2. Asking worker to quit.
WARNING locust.runners:runners.py:1115 Got spawning message from unknown worker fake_client3. Asking worker to quit.
___________ TestMasterRunner.test_worker_sends_bad_message_to_master ___________
self = <locust.test.test_runners.TestMasterRunner testMethod=test_worker_sends_bad_message_to_master>
def test_worker_sends_bad_message_to_master(self):
"""
Validate master sends reconnect message to worker when it receives a bad message.
"""
class TestUser(User):
@task
def my_task(self):
pass
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[TestUser])
server.mocked_send(Message("client_ready", __version__, "zeh_fake_client1"))
> self.assertEqual(1, len(master.clients))
E AssertionError: 1 != 0
locust/test/test_runners.py:3166: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (zeh_fake_client1). That's not going to work.
______ TestMasterRunner.test_worker_sends_unrecognized_message_to_master _______
self = <locust.test.test_runners.TestMasterRunner testMethod=test_worker_sends_unrecognized_message_to_master>
def test_worker_sends_unrecognized_message_to_master(self):
"""
Validate master ignores message from worker when it cannot parse adddress info.
"""
class TestUser(User):
@task
def my_task(self):
pass
with mock.patch("locust.rpc.rpc.Server", mocked_rpc()) as server:
master = self.get_runner(user_classes=[TestUser])
server.mocked_send(Message("client_ready", __version__, "zeh_fake_client1"))
> self.assertEqual(1, len(master.clients))
E AssertionError: 1 != 0
locust/test/test_runners.py:3194: AssertionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (zeh_fake_client1). That's not going to work.
_______________________ TestCsvStats.test_stats_history ________________________
self = <locust.test.test_stats.TestCsvStats testMethod=test_stats_history>
def test_stats_history(self):
env1 = Environment(events=locust.events, catch_exceptions=False)
runner1 = env1.create_master_runner("127.0.0.1", 5558)
env2 = Environment(events=locust.events, catch_exceptions=False)
> runner2 = env2.create_worker_runner("127.0.0.1", 5558)
locust/test/test_stats.py:589:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
locust/env.py:153: in create_worker_runner
return self._create_runner(
locust/env.py:115: in _create_runner
self.runner = runner_class(self, *args, **kwargs)
locust/runners.py:1216: in __init__
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
locust/runners.py:1445: in connect_to_master
self.connect_to_master()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <locust.runners.WorkerRunner object at 0x7f9f48f630b0>
def connect_to_master(self):
self.retry += 1
self.client.send(Message("client_ready", __version__, self.client_id))
try:
success = self.connection_event.wait(timeout=CONNECT_TIMEOUT)
except KeyboardInterrupt:
# dont complain about getting CTRL-C
sys.exit(1)
if not success:
if self.retry < 3:
logger.debug(
f"Failed to connect to master {self.master_host}:{self.master_port}, retry {self.retry}/{CONNECT_RETRY_COUNT}."
)
else:
logger.warning(
f"Failed to connect to master {self.master_host}:{self.master_port}, retry {self.retry}/{CONNECT_RETRY_COUNT}."
)
if self.retry > CONNECT_RETRY_COUNT:
> raise ConnectionError()
E ConnectionError
locust/runners.py:1444: ConnectionError
------------------------------ Captured log call -------------------------------
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 3/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 4/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 5/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 6/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 7/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 8/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 9/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 10/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 11/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 12/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 13/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 14/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 15/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 16/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 17/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 18/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 19/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 20/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 21/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 22/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 23/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 24/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 25/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 26/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 27/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 28/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 29/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 30/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 31/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 32/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 33/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 34/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 35/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 36/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 37/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 38/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 39/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 40/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 41/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 42/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 43/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 44/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 45/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 46/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 47/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 48/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 49/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 50/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 51/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 52/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 53/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 54/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 55/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 56/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 57/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 58/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 59/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 60/60.
ERROR locust.runners:runners.py:1009 An old (pre 2.0) worker tried to connect (sbuild_2bce979d7eae40e3901f022dcc31cd5c). That's not going to work.
WARNING locust.runners:runners.py:1440 Failed to connect to master 127.0.0.1:5558, retry 61/60.
=============================== warnings summary ===============================
locust/test/test_fasthttp.py::TestFastHttpSsl::test_ssl_request_insecure
locust/test/test_web.py::TestWebUIWithTLS::test_index_with_https
/usr/lib/python3/dist-packages/gevent/ssl.py:237: DeprecationWarning: ssl.PROTOCOL_TLS is deprecated
self._context = SSLContext(ssl_version)
locust/test/test_log.py: 4 warnings
locust/test/test_main.py: 38 warnings
/usr/lib/python3/dist-packages/gevent/os.py:426: DeprecationWarning: This process (pid=102) is multi-threaded, use of fork() may lead to deadlocks in the child.
pid = fork()
locust/test/test_web.py::TestWebUI::test_html_stats_report
locust/test/test_web.py::TestWebUI::test_report_download
locust/test/test_web.py::TestWebUI::test_report_exceptions
locust/test/test_web.py::TestWebUI::test_report_host
locust/test/test_web.py::TestWebUI::test_report_host2
locust/test/test_web.py::TestWebUI::test_report_page
locust/test/test_web.py::TestWebUI::test_report_page_empty_stats
locust/test/test_web.py::TestModernWebUI::test_html_stats_report
/<<PKGBUILDDIR>>/locust/html.py:42: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC).
start_time = datetime.datetime.utcfromtimestamp(start_ts).strftime("%Y-%m-%d %H:%M:%S")
locust/test/test_web.py::TestWebUI::test_report_download
locust/test/test_web.py::TestWebUI::test_report_exceptions
locust/test/test_web.py::TestWebUI::test_report_host
locust/test/test_web.py::TestWebUI::test_report_host2
locust/test/test_web.py::TestWebUI::test_report_page
/<<PKGBUILDDIR>>/locust/html.py:46: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC).
end_time = datetime.datetime.utcfromtimestamp(end_ts).strftime("%Y-%m-%d %H:%M:%S")
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=========================== short test summary info ============================
FAILED locust/test/test_load_locustfile.py::TestLoadLocustfile::test_locustfile_from_url
FAILED locust/test/test_log.py::TestLoggingOptions::test_log_to_file - OSErro...
FAILED locust/test/test_log.py::TestLoggingOptions::test_logging_output - OSE...
FAILED locust/test/test_log.py::TestLoggingOptions::test_skip_logging - OSErr...
FAILED locust/test/test_log.py::TestLoggingOptions::test_user_broken_on_start
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_autostart_multiple_locustfiles_with_shape
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_autostart_w_load_shape
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_autostart_w_run_time
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_autostart_wo_run_time
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_command_line_user_selection
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_custom_arguments
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_custom_arguments_in_file
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_custom_exit_code
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_default_headless_spawn_options
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_default_headless_spawn_options_with_shape
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_error_when_duplicate_shape_class_names
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_error_when_duplicate_userclass_names
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_error_when_locustfiles_directory_is_empty
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_error_when_no_tasks_match_tags
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_error_when_providing_both_run_time_and_a_shape_class
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_graceful_exit_when_keyboard_interrupt
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_headless_spawn_options_wo_run_time
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_help_arg - ...
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_html_report_option
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_input - Ass...
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_invalid_percentile_parameter
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_invalid_stop_timeout_string
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_no_error_when_same_userclass_in_two_files
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_percentile_parameter
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_percentiles_to_statistics
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_run_autostart_with_multiple_locustfiles
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_run_headless_with_multiple_locustfiles
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_run_headless_with_multiple_locustfiles_with_shape
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_run_with_userclass_picker
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_shape_class_log_disabled_parameters
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_shape_class_with_use_common_options
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_spawing_with_fixed_multiple_locustfiles
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_spawning_with_fixed
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_web_options
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_webserver
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_webserver_multiple_locustfiles
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_webserver_multiple_locustfiles_in_directory
FAILED locust/test/test_main.py::StandaloneIntegrationTests::test_webserver_multiple_locustfiles_with_shape
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_distributed
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_distributed_events
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_distributed_report_timeout_expired
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_distributed_tags
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_distributed_with_locustfile_distribution_not_plain_filename
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_expect_workers
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_json_schema
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_locustfile_distribution
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_locustfile_distribution_with_workers_started_first
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_processes
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_processes_autodetect
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_processes_ctrl_c
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_processes_error_doesnt_blow_up_completely
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_processes_separate_worker
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_processes_workers_quit_unexpected
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_worker_indexes
FAILED locust/test/test_main.py::DistributedIntegrationTests::test_workers_shut_down_if_master_is_gone
FAILED locust/test/test_runners.py::TestMasterRunner::test_attributes_populated_when_calling_start
FAILED locust/test/test_runners.py::TestMasterRunner::test_custom_shape_scale_down
FAILED locust/test/test_runners.py::TestMasterRunner::test_custom_shape_scale_interval
FAILED locust/test/test_runners.py::TestMasterRunner::test_custom_shape_scale_up
FAILED locust/test/test_runners.py::TestMasterRunner::test_last_worker_missing_stops_test
FAILED locust/test/test_runners.py::TestMasterRunner::test_last_worker_quitting_stops_test
FAILED locust/test/test_runners.py::TestMasterRunner::test_master_discard_first_client_ready
FAILED locust/test/test_runners.py::TestMasterRunner::test_master_marks_downed_workers_as_missing
FAILED locust/test/test_runners.py::TestMasterRunner::test_master_reset_connection
FAILED locust/test/test_runners.py::TestMasterRunner::test_rebalance_locust_users_on_worker_connect
FAILED locust/test/test_runners.py::TestMasterRunner::test_reset_connection_after_RPCError
FAILED locust/test/test_runners.py::TestMasterRunner::test_spawn_correct_worker_indexes
FAILED locust/test/test_runners.py::TestMasterRunner::test_spawn_fewer_locusts_than_workers
FAILED locust/test/test_runners.py::TestMasterRunner::test_spawn_uneven_locusts
FAILED locust/test/test_runners.py::TestMasterRunner::test_start_event - Asse...
FAILED locust/test/test_runners.py::TestMasterRunner::test_stop_event - Asser...
FAILED locust/test/test_runners.py::TestMasterRunner::test_stop_event_quit - ...
FAILED locust/test/test_runners.py::TestMasterRunner::test_unknown_host_sends_message_to_master
FAILED locust/test/test_runners.py::TestMasterRunner::test_worker_connect - A...
FAILED locust/test/test_runners.py::TestMasterRunner::test_worker_connect_with_special_versions
FAILED locust/test/test_runners.py::TestMasterRunner::test_worker_missing_after_heartbeat_dead_interval
FAILED locust/test/test_runners.py::TestMasterRunner::test_worker_sends_bad_message_to_master
FAILED locust/test/test_runners.py::TestMasterRunner::test_worker_sends_unrecognized_message_to_master
FAILED locust/test/test_stats.py::TestCsvStats::test_stats_history - Connecti...
= 84 failed, 464 passed, 1 skipped, 15 deselected, 57 warnings in 469.27s (0:07:49) =
E: pybuild pybuild:389: test: plugin custom failed with: exit code=1: PYTHONPATH=/<<PKGBUILDDIR>>/.pybuild/cpython3_3.12_locust/build python3.12 -m pytest -v --ignore=examples/test_data_management.py -k 'not TestMasterWorkerRunners'
dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p "3.13 3.12" returned exit code 13
make[1]: [debian/rules:15: override_dh_auto_test] Error 25 (ignored)
make[1]: Leaving directory '/<<PKGBUILDDIR>>'
create-stamp debian/debhelper-build-stamp
dh_testroot -O--buildsystem=pybuild
dh_prep -O--buildsystem=pybuild
dh_auto_install --destdir=debian/python3-locust/ -O--buildsystem=pybuild
I: pybuild plugin_pyproject:178: Copying package built for python3.13 to destdir
I: pybuild plugin_pyproject:178: Copying package built for python3.12 to destdir
dh_installdocs -O--buildsystem=pybuild
dh_installchangelogs -O--buildsystem=pybuild
debian/rules override_dh_installexamples
make[1]: Entering directory '/<<PKGBUILDDIR>>'
dh_installexamples -X.pyc
make[1]: Leaving directory '/<<PKGBUILDDIR>>'
dh_python3 -O--buildsystem=pybuild
dh_installsystemduser -O--buildsystem=pybuild
dh_perl -O--buildsystem=pybuild
dh_link -O--buildsystem=pybuild
dh_strip_nondeterminism -O--buildsystem=pybuild
dh_compress -O--buildsystem=pybuild
dh_fixperms -O--buildsystem=pybuild
dh_missing -O--buildsystem=pybuild
dh_installdeb -O--buildsystem=pybuild
dh_gencontrol -O--buildsystem=pybuild
dpkg-gencontrol: warning: Recommends field of package python3-locust: substitution variable ${python3:Recommends} used, but is not defined
dpkg-gencontrol: warning: Suggests field of package python3-locust: substitution variable ${python3:Suggests} used, but is not defined
dh_md5sums -O--buildsystem=pybuild
dh_builddeb -O--buildsystem=pybuild
dpkg-deb: building package 'python3-locust' in '../python3-locust_2.24.0-1_all.deb'.
dpkg-genbuildinfo --build=binary -O../locust_2.24.0-1_amd64.buildinfo
dpkg-genchanges --build=binary -O../locust_2.24.0-1_amd64.changes
dpkg-genchanges: info: binary-only upload (no source code included)
dpkg-source --after-build .
dpkg-source: info: using options from locust-2.24.0/debian/source/options: --extend-diff-ignore=^[^/]+.egg-info/
dpkg-buildpackage: info: binary-only upload (no source included)
--------------------------------------------------------------------------------
Build finished at 2024-11-15T12:03:23Z
Finished
--------
I: Built successfully
+------------------------------------------------------------------------------+
| Changes |
+------------------------------------------------------------------------------+
locust_2.24.0-1_amd64.changes:
------------------------------
Format: 1.8
Date: Wed, 13 Mar 2024 00:41:31 -0400
Source: locust
Binary: python3-locust
Architecture: all
Version: 2.24.0-1
Distribution: sid
Urgency: medium
Maintainer: Sandro Tosi <morph@debian.org>
Changed-By: Sandro Tosi <morph@debian.org>
Description:
python3-locust - Developer friendly load testing framework
Changes:
locust (2.24.0-1) unstable; urgency=medium
.
* New upstream release
* drop patches, no longer needed
* debian/control
- replace flask-basicauth with flask-login
- bump versioned b-d on configargparse to >= 1.5.5
Checksums-Sha1:
6f9543636bfd087395f21da6209553f2c45d7dae 8025 locust_2.24.0-1_amd64.buildinfo
c90ba334372274611f165e3bd0b9e61b2b977a05 1188912 python3-locust_2.24.0-1_all.deb
Checksums-Sha256:
d98b14bf5db823dd1ab5856ff8c48fbddbf47b65654cd7fc7426164ae2154f71 8025 locust_2.24.0-1_amd64.buildinfo
da2aa281868f823e865b1fd2a723ef4c5d265478690bcaff027781911741bd54 1188912 python3-locust_2.24.0-1_all.deb
Files:
bfa7259d627fde93a604691c2d2404fa 8025 python optional locust_2.24.0-1_amd64.buildinfo
7b45100f5ce7f49c4ada6978eb72d8a6 1188912 python optional python3-locust_2.24.0-1_all.deb
+------------------------------------------------------------------------------+
| Buildinfo |
+------------------------------------------------------------------------------+
Format: 1.0
Source: locust
Binary: python3-locust
Architecture: all
Version: 2.24.0-1
Checksums-Md5:
7b45100f5ce7f49c4ada6978eb72d8a6 1188912 python3-locust_2.24.0-1_all.deb
Checksums-Sha1:
c90ba334372274611f165e3bd0b9e61b2b977a05 1188912 python3-locust_2.24.0-1_all.deb
Checksums-Sha256:
da2aa281868f823e865b1fd2a723ef4c5d265478690bcaff027781911741bd54 1188912 python3-locust_2.24.0-1_all.deb
Build-Origin: Debian
Build-Architecture: amd64
Build-Date: Fri, 15 Nov 2024 12:03:22 +0000
Build-Path: /<<PKGBUILDDIR>>
Build-Tainted-By:
merged-usr-via-aliased-dirs
Installed-Build-Depends:
autoconf (= 2.72-3),
automake (= 1:1.16.5-1.3),
autopoint (= 0.22.5-2),
autotools-dev (= 20220109.1),
base-files (= 13.5),
base-passwd (= 3.6.5),
bash (= 5.2.32-1+b2),
binutils (= 2.43.1-5),
binutils-common (= 2.43.1-5),
binutils-x86-64-linux-gnu (= 2.43.1-5),
bsdextrautils (= 2.40.2-11),
bsdutils (= 1:2.40.2-11),
build-essential (= 12.12),
bzip2 (= 1.0.8-6),
ca-certificates (= 20240203),
coreutils (= 9.5-1+b1),
cpp (= 4:14.2.0-1),
cpp-14 (= 14.2.0-8),
cpp-14-x86-64-linux-gnu (= 14.2.0-8),
cpp-x86-64-linux-gnu (= 4:14.2.0-1),
dash (= 0.5.12-9),
debconf (= 1.5.87),
debhelper (= 13.20),
debianutils (= 5.20),
dh-autoreconf (= 20),
dh-python (= 6.20241024),
dh-strip-nondeterminism (= 1.14.0-1),
diffutils (= 1:3.10-1),
dpkg (= 1.22.11),
dpkg-dev (= 1.22.12~1.gbp82cafd),
dwz (= 0.15-1+b1),
file (= 1:5.45-3+b1),
findutils (= 4.10.0-3),
fonts-font-awesome (= 5.0.10+really4.7.0~dfsg-4.1),
fonts-lato (= 2.015-1),
g++ (= 4:14.2.0-1),
g++-14 (= 14.2.0-8),
g++-14-x86-64-linux-gnu (= 14.2.0-8),
g++-x86-64-linux-gnu (= 4:14.2.0-1),
gcc (= 4:14.2.0-1),
gcc-14 (= 14.2.0-8),
gcc-14-base (= 14.2.0-8),
gcc-14-x86-64-linux-gnu (= 14.2.0-8),
gcc-x86-64-linux-gnu (= 4:14.2.0-1),
gettext (= 0.22.5-2),
gettext-base (= 0.22.5-2),
grep (= 3.11-4),
groff-base (= 1.23.0-5),
gzip (= 1.12-1.1),
hostname (= 3.25),
init-system-helpers (= 1.67),
intltool-debian (= 0.35.0+20060710.6),
libacl1 (= 2.3.2-2+b1),
libarchive-zip-perl (= 1.68-1),
libasan8 (= 14.2.0-8),
libatomic1 (= 14.2.0-8),
libattr1 (= 1:2.5.2-2),
libaudit-common (= 1:4.0.2-2),
libaudit1 (= 1:4.0.2-2),
libbinutils (= 2.43.1-5),
libblkid1 (= 2.40.2-11),
libbsd0 (= 0.12.2-2),
libbz2-1.0 (= 1.0.8-6),
libc-bin (= 2.40-3),
libc-dev-bin (= 2.40-3),
libc6 (= 2.40-3),
libc6-dev (= 2.40-3),
libcap-ng0 (= 0.8.5-3+b1),
libcap2 (= 1:2.66-5+b1),
libcares2 (= 1.34.2-1),
libcc1-0 (= 14.2.0-8),
libcom-err2 (= 1.47.1-1+b1),
libcrypt-dev (= 1:4.4.36-5),
libcrypt1 (= 1:4.4.36-5),
libctf-nobfd0 (= 2.43.1-5),
libctf0 (= 2.43.1-5),
libdb5.3t64 (= 5.3.28+dfsg2-9),
libdebconfclient0 (= 0.273),
libdebhelper-perl (= 13.20),
libdpkg-perl (= 1.22.12~1.gbp82cafd),
libelf1t64 (= 0.192-4),
libev4t64 (= 1:4.33-2.1+b1),
libexpat1 (= 2.6.4-1),
libffi8 (= 3.4.6-1),
libfile-stripnondeterminism-perl (= 1.14.0-1),
libgcc-14-dev (= 14.2.0-8),
libgcc-s1 (= 14.2.0-8),
libgcrypt20 (= 1.11.0-6),
libgdbm-compat4t64 (= 1.24-2),
libgdbm6t64 (= 1.24-2),
libgmp10 (= 2:6.3.0+dfsg-2+b2),
libgomp1 (= 14.2.0-8),
libgpg-error0 (= 1.50-4),
libgprofng0 (= 2.43.1-5),
libgssapi-krb5-2 (= 1.21.3-3),
libhwasan0 (= 14.2.0-8),
libicu72 (= 72.1-5+b1),
libisl23 (= 0.27-1),
libitm1 (= 14.2.0-8),
libjansson4 (= 2.14-2+b3),
libjs-jquery (= 3.6.1+dfsg+~3.5.14-1),
libjs-sphinxdoc (= 7.4.7-4),
libjs-underscore (= 1.13.4~dfsg+~1.11.4-3),
libk5crypto3 (= 1.21.3-3),
libkeyutils1 (= 1.6.3-4),
libkrb5-3 (= 1.21.3-3),
libkrb5support0 (= 1.21.3-3),
liblsan0 (= 14.2.0-8),
liblzma5 (= 5.6.3-1+b1),
libmagic-mgc (= 1:5.45-3+b1),
libmagic1t64 (= 1:5.45-3+b1),
libmd0 (= 1.1.0-2+b1),
libmount1 (= 2.40.2-11),
libmpc3 (= 1.3.1-1+b3),
libmpfr6 (= 4.2.1-1+b2),
libncursesw6 (= 6.5-2+b1),
libnorm1t64 (= 1.5.9+dfsg-3.1+b1),
libnsl2 (= 1.3.0-3+b3),
libpam-modules (= 1.5.3-7+b1),
libpam-modules-bin (= 1.5.3-7+b1),
libpam-runtime (= 1.5.3-7),
libpam0g (= 1.5.3-7+b1),
libpcre2-8-0 (= 10.44-2),
libperl5.40 (= 5.40.0-7),
libpgm-5.3-0t64 (= 5.3.128~dfsg-2.1+b1),
libpipeline1 (= 1.5.8-1),
libpython3-stdlib (= 3.12.7-1),
libpython3.12-minimal (= 3.12.7-3),
libpython3.12-stdlib (= 3.12.7-3),
libpython3.13-minimal (= 3.13.0-2),
libpython3.13-stdlib (= 3.13.0-2),
libquadmath0 (= 14.2.0-8),
libreadline8t64 (= 8.2-5),
libseccomp2 (= 2.5.5-1+b3),
libselinux1 (= 3.7-3+b1),
libsframe1 (= 2.43.1-5),
libsmartcols1 (= 2.40.2-11),
libsodium23 (= 1.0.18-1+b2),
libsqlite3-0 (= 3.46.1-1),
libssl3t64 (= 3.3.2-2),
libstdc++-14-dev (= 14.2.0-8),
libstdc++6 (= 14.2.0-8),
libsystemd0 (= 257~rc1-4),
libtinfo6 (= 6.5-2+b1),
libtirpc-common (= 1.3.4+ds-1.3),
libtirpc3t64 (= 1.3.4+ds-1.3+b1),
libtool (= 2.4.7-8),
libtsan2 (= 14.2.0-8),
libubsan1 (= 14.2.0-8),
libuchardet0 (= 0.0.8-1+b2),
libudev1 (= 257~rc1-4),
libunistring5 (= 1.2-1+b1),
libuuid1 (= 2.40.2-11),
libxml2 (= 2.12.7+dfsg+really2.9.14-0.2+b1),
libxslt1.1 (= 1.1.35-1.1+b1),
libzmq5 (= 4.3.5-1+b3),
libzstd1 (= 1.5.6+dfsg-1+b1),
linux-libc-dev (= 6.11.7-1),
m4 (= 1.4.19-4),
make (= 4.3-4.1),
man-db (= 2.13.0-1),
mawk (= 1.3.4.20240905-1),
media-types (= 10.1.0),
ncurses-base (= 6.5-2),
ncurses-bin (= 6.5-2+b1),
netbase (= 6.4),
openssl (= 3.3.2-2),
openssl-provider-legacy (= 3.3.2-2),
patch (= 2.7.6-7),
perl (= 5.40.0-7),
perl-base (= 5.40.0-7),
perl-modules-5.40 (= 5.40.0-7),
po-debconf (= 1.0.21+nmu1),
pybuild-plugin-pyproject (= 6.20241024),
python3 (= 3.12.7-1),
python3-all (= 3.12.7-1),
python3-autocommand (= 2.2.2-3),
python3-bcrypt (= 4.2.0-2),
python3-blinker (= 1.8.2-1),
python3-brotli (= 1.1.0-2+b6),
python3-build (= 1.2.2-1),
python3-certifi (= 2024.8.30+dfsg-1),
python3-cffi-backend (= 1.17.1-2+b1),
python3-chardet (= 5.2.0+dfsg-1),
python3-charset-normalizer (= 3.4.0-1+b1),
python3-click (= 8.1.7-2),
python3-colorama (= 0.4.6-4),
python3-configargparse (= 1.7-2),
python3-cryptography (= 43.0.0-1),
python3-cssselect (= 1.2.0-4),
python3-decorator (= 5.1.1-5),
python3-flask (= 3.0.3-1),
python3-flask-cors (= 5.0.0-1),
python3-flask-login (= 0.6.3-2),
python3-gevent (= 24.2.1-1),
python3-geventhttpclient (= 2.0.11-2+b1),
python3-greenlet (= 3.1.0-1+b1),
python3-idna (= 3.8-2),
python3-inflect (= 7.3.1-2),
python3-iniconfig (= 1.1.1-2),
python3-installer (= 0.7.0+dfsg1-3),
python3-itsdangerous (= 2.2.0-1),
python3-jaraco.context (= 6.0.0-1),
python3-jaraco.functools (= 4.1.0-1),
python3-jaraco.text (= 4.0.0-1),
python3-jinja2 (= 3.1.3-1),
python3-lxml (= 5.3.0-1+b1),
python3-markupsafe (= 2.1.5-1+b2),
python3-minimal (= 3.12.7-1),
python3-more-itertools (= 10.5.0-1),
python3-msgpack (= 1.0.3-3+b2),
python3-packaging (= 24.1-1),
python3-pkg-resources (= 75.2.0-1),
python3-pluggy (= 1.5.0-1),
python3-psutil (= 5.9.8-2),
python3-py (= 1.11.0-2),
python3-pyproject-hooks (= 1.2.0-1),
python3-pyquery (= 1.4.3-1),
python3-pytest (= 8.3.3-1),
python3-requests (= 2.32.3+dfsg-1),
python3-retry (= 0.9.2-3),
python3-roundrobin (= 0.0.4-3),
python3-setuptools (= 75.2.0-1),
python3-six (= 1.16.0-7),
python3-toml (= 0.10.2-1),
python3-typeguard (= 4.4.1-1),
python3-typing-extensions (= 4.12.2-2),
python3-urllib3 (= 2.0.7-2),
python3-webob (= 1:1.8.7-1),
python3-werkzeug (= 3.0.4-1),
python3-wheel (= 0.44.0-2),
python3-zipp (= 3.21.0-1),
python3-zmq (= 24.0.1-5+b2),
python3-zope.event (= 5.0-0.1),
python3-zope.interface (= 7.1.1-1+b1),
python3.12 (= 3.12.7-3),
python3.12-minimal (= 3.12.7-3),
python3.13 (= 3.13.0-2),
python3.13-minimal (= 3.13.0-2),
readline-common (= 8.2-5),
rpcsvc-proto (= 1.4.3-1),
sed (= 4.9-2),
sensible-utils (= 0.0.24),
sphinx-rtd-theme-common (= 3.0.1+dfsg-1),
sysvinit-utils (= 3.11-1),
tar (= 1.35+dfsg-3),
tzdata (= 2024b-3),
util-linux (= 2.40.2-11),
xz-utils (= 5.6.3-1+b1),
zlib1g (= 1:1.3.dfsg+really1.3.1-1+b1)
Environment:
DEB_BUILD_OPTIONS="parallel=4"
LANG="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_CTYPE="C.UTF-8"
SOURCE_DATE_EPOCH="1710304891"
+------------------------------------------------------------------------------+
| Package contents |
+------------------------------------------------------------------------------+
python3-locust_2.24.0-1_all.deb
-------------------------------
new Debian package, version 2.0.
size 1188912 bytes: control archive=6148 bytes.
2586 bytes, 43 lines control
14679 bytes, 159 lines md5sums
263 bytes, 12 lines * postinst #!/bin/sh
376 bytes, 12 lines * prerm #!/bin/sh
Package: python3-locust
Source: locust
Version: 2.24.0-1
Architecture: all
Maintainer: Sandro Tosi <morph@debian.org>
Installed-Size: 4041
Depends: python3-configargparse (>= 1.5.5), python3-flask (>= 2.0.0), python3-flask-cors, python3-flask-login (>= 0.6.3), python3-gevent, python3-geventhttpclient (>= 2.0.8), python3-msgpack (>= 0.6.2), python3-psutil (>= 5.6.7), python3-requests (>= 2.9.1), python3-roundrobin, python3-tomli | python3-supported-min (>= 3.11), python3-werkzeug, python3-zmq (>= 16.0.2), python3:any
Provides: locust
Section: python
Priority: optional
Homepage: https://locust.io/
Description: Developer friendly load testing framework
Locust is an easy to use, scriptable and scalable performance testing tool. You
define the behaviour of your users in regular Python code, instead of using a
clunky UI or domain specific language. This makes Locust infinitely expandable
and very developer friendly.
.
Features:
.
* Write user test scenarios in plain-old Python -- If you want your users to
loop, perform some conditional behaviour or do some calculations, you just
use the regular programming constructs provided by Python. Locust runs every
user inside its own greenlet (a lightweight process/coroutine). This enables
you to write your tests like normal (blocking) Python code instead of having
to use callbacks or some other mechanism. Because your scenarios are “just
python” you can use your regular IDE, and version control your tests as
regular code (as opposed to some other tools that use XML or binary
formats).
* Distributed & Scalable - supports hundreds of thousands of users -- Locust
makes it easy to run load tests distributed over multiple machines. It is
event-based (using gevent), which makes it possible for a single process to
handle many thousands concurrent users. While there may be other tools that
are capable of doing more requests per second on a given hardware, the low
overhead of each Locust user makes it very suitable for testing highly
concurrent workloads.
* Web-based UI -- Locust has a user friendly web interface that shows the
progress of your test in real-time. You can even change the load while the
test is running. It can also be run without the UI, making it easy to use
for CI/CD testing.
* Can test any system -- Even though Locust primarily works with web
sites/services, it can be used to test almost any system or protocol. Just
write a client for what you want to test, or explore some created by the
community.
drwxr-xr-x root/root 0 2024-03-13 04:41 ./
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/bin/
-rwxr-xr-x root/root 210 2024-03-13 04:41 ./usr/bin/locust
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust-0.0.0.dist-info/
-rw-r--r-- root/root 7 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust-0.0.0.dist-info/INSTALLER
-rw-r--r-- root/root 7190 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust-0.0.0.dist-info/METADATA
-rw-r--r-- root/root 91 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust-0.0.0.dist-info/WHEEL
-rw-r--r-- root/root 44 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust-0.0.0.dist-info/entry_points.txt
-rw-r--r-- root/root 7 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust-0.0.0.dist-info/top_level.txt
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/
-rw-r--r-- root/root 1402 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/__init__.py
-rw-r--r-- root/root 31 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/__main__.py
-rw-r--r-- root/root 13 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/_version.py
-rw-r--r-- root/root 31955 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/argument_parser.py
-rw-r--r-- root/root 14810 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/clients.py
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/contrib/
-rw-r--r-- root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/contrib/__init__.py
-rw-r--r-- root/root 26601 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/contrib/fasthttp.py
-rw-r--r-- root/root 5134 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/debug.py
-rw-r--r-- root/root 18605 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/dispatch.py
-rw-r--r-- root/root 12348 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/env.py
-rw-r--r-- root/root 7713 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/event.py
-rw-r--r-- root/root 1791 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/exception.py
-rw-r--r-- root/root 5718 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/html.py
-rw-r--r-- root/root 3292 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/input_events.py
-rw-r--r-- root/root 3155 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/log.py
-rw-r--r-- root/root 28866 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/main.py
-rw-r--r-- root/root 65 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/py.typed
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/rpc/
-rw-r--r-- root/root 58 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/rpc/__init__.py
-rw-r--r-- root/root 1298 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/rpc/protocol.py
-rw-r--r-- root/root 2637 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/rpc/zmqrpc.py
-rw-r--r-- root/root 67444 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/runners.py
-rw-r--r-- root/root 1973 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/shape.py
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/
-rw-r--r-- root/root 4796 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/chart.js
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/css/
-rw-r--r-- root/root 9550 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/css/application.css
-rw-r--r-- root/root 2089 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/css/application.css.map
-rw-r--r-- root/root 1403 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/css/tables.css
-rw-r--r-- root/root 411 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/css/tables.css.map
-rw-r--r-- root/root 620458 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/echarts.common.min.js
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/img/
-rw-r--r-- root/root 8348 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/img/favicon.ico
-rw-r--r-- root/root 24553 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/img/logo.png
-rw-r--r-- root/root 79701 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/img/ui-screenshot-charts.png
-rw-r--r-- root/root 64670 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/img/ui-screenshot-start-test.png
-rw-r--r-- root/root 95837 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/img/ui-screenshot-stats.png
-rw-r--r-- root/root 151806 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/img/ui-screenshot-workers.png
-rw-r--r-- root/root 95957 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/jquery-1.11.3.min.js
-rw-r--r-- root/root 3381 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/jquery.jqote2.min.js
-rw-r--r-- root/root 2981 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/jquery.tools.min.js
-rw-r--r-- root/root 10264 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/locust.js
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/sass/
-rw-r--r-- root/root 458 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/sass/_base.sass
-rw-r--r-- root/root 69 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/sass/_mixins.sass
-rw-r--r-- root/root 8512 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/sass/application.sass
-rw-r--r-- root/root 1361 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/sass/tables.sass
-rw-r--r-- root/root 1370 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/tasks.js
-rw-r--r-- root/root 1137 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/static/vintage.js
-rw-r--r-- root/root 46129 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/stats.py
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/templates/
-rw-r--r-- root/root 21678 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/templates/index.html
-rw-r--r-- root/root 10667 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/templates/report.html
-rw-r--r-- root/root 1264 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/templates/stats_data.html
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/
-rw-r--r-- root/root 396 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/__init__.py
-rw-r--r-- root/root 164 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/fake_module1_for_env_test.py
-rw-r--r-- root/root 164 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/fake_module2_for_env_test.py
-rw-r--r-- root/root 1273 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/mock_locustfile.py
-rw-r--r-- root/root 819 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/mock_logging.py
-rw-r--r-- root/root 1069 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_debugging.py
-rw-r--r-- root/root 166165 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_dispatch.py
-rw-r--r-- root/root 7489 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_env.py
-rw-r--r-- root/root 29887 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_fasthttp.py
-rw-r--r-- root/root 12570 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_http.py
-rw-r--r-- root/root 1408 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_interruptable_task.py
-rw-r--r-- root/root 8494 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_load_locustfile.py
-rw-r--r-- root/root 25547 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_locust_class.py
-rw-r--r-- root/root 7553 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_log.py
-rw-r--r-- root/root 83712 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_main.py
-rw-r--r-- root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_old_wait_api.py
-rw-r--r-- root/root 18309 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_parser.py
-rw-r--r-- root/root 158561 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_runners.py
-rw-r--r-- root/root 3398 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_sequential_taskset.py
-rw-r--r-- root/root 33928 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_stats.py
-rw-r--r-- root/root 13138 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_tags.py
-rw-r--r-- root/root 2742 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_taskratio.py
-rw-r--r-- root/root 2135 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_users.py
-rw-r--r-- root/root 1229 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_util.py
-rw-r--r-- root/root 2353 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_wait_time.py
-rw-r--r-- root/root 51761 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_web.py
-rw-r--r-- root/root 2173 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/test_zmqrpc.py
-rw-r--r-- root/root 6979 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/testcases.py
-rw-r--r-- root/root 2754 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/test/util.py
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/user/
-rw-r--r-- root/root 71 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/user/__init__.py
-rw-r--r-- root/root 2641 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/user/inspectuser.py
-rw-r--r-- root/root 2544 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/user/sequential_taskset.py
-rw-r--r-- root/root 16718 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/user/task.py
-rw-r--r-- root/root 9950 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/user/users.py
-rw-r--r-- root/root 2675 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/user/wait_time.py
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/util/
-rw-r--r-- root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/util/__init__.py
-rw-r--r-- root/root 1062 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/util/cache.py
-rw-r--r-- root/root 2028 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/util/deprecation.py
-rw-r--r-- root/root 797 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/util/exception_handler.py
-rw-r--r-- root/root 2964 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/util/load_locustfile.py
-rw-r--r-- root/root 92 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/util/rounding.py
-rw-r--r-- root/root 997 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/util/timespan.py
-rw-r--r-- root/root 28245 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/web.py
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/webui/
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/webui/dist/
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/webui/dist/assets/
-rw-r--r-- root/root 8348 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/webui/dist/assets/favicon.ico
-rw-r--r-- root/root 1645568 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/webui/dist/assets/index-0d6d578a.js
-rw-r--r-- root/root 19299 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/webui/dist/assets/logo.png
-rw-r--r-- root/root 501 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/webui/dist/auth.html
-rw-r--r-- root/root 901 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/webui/dist/index.html
-rw-r--r-- root/root 513 2024-03-13 04:41 ./usr/lib/python3/dist-packages/locust/webui/dist/report.html
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/share/
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/share/doc/
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/share/doc/python3-locust/
-rw-r--r-- root/root 10 2024-02-29 17:06 ./usr/share/doc/python3-locust/README
-rw-r--r-- root/root 2415 2024-02-29 17:06 ./usr/share/doc/python3-locust/README.md.gz
-rw-r--r-- root/root 1013 2024-03-13 04:41 ./usr/share/doc/python3-locust/changelog.Debian.gz
-rw-r--r-- root/root 23738 2024-02-29 17:06 ./usr/share/doc/python3-locust/changelog.gz
-rw-r--r-- root/root 2336 2024-03-13 04:41 ./usr/share/doc/python3-locust/copyright
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/share/doc/python3-locust/examples/
-rw-r--r-- root/root 1154 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/add_command_line_argument.py
-rw-r--r-- root/root 589 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/basic.py
-rw-r--r-- root/root 1523 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/browse_docs_sequence_test.py
-rw-r--r-- root/root 1378 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/browse_docs_test.py
-rw-r--r-- root/root 1995 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/custom_messages.py
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/share/doc/python3-locust/examples/custom_shape/
-rw-r--r-- root/root 1339 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/custom_shape/double_wave.py
-rw-r--r-- root/root 1473 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/custom_shape/stages.py
-rw-r--r-- root/root 1895 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/custom_shape/staging_user_classes.py
-rw-r--r-- root/root 900 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/custom_shape/step_load.py
-rw-r--r-- root/root 2250 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/custom_shape/wait_user_count.py
-rw-r--r-- root/root 1369 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/custom_wait_function.py
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/share/doc/python3-locust/examples/custom_xmlrpc_client/
-rw-r--r-- root/root 470 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/custom_xmlrpc_client/server.py
-rw-r--r-- root/root 2242 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/custom_xmlrpc_client/xmlrpc_locustfile.py
-rw-r--r-- root/root 445 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/debugging.py
-rw-r--r-- root/root 655 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/debugging_advanced.py
drwxr-xr-x root/root 0 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/docker-compose/
-rw-r--r-- root/root 348 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/docker-compose/docker-compose.yml
-rw-r--r-- root/root 639 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/dynamic_user_credentials.py
-rw-r--r-- root/root 2312 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/events.py
-rw-r--r-- root/root 5378 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/extend_modern_web_ui.py
drwxr-xr-x root/root 0 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/extend_web_ui/
-rw-r--r-- root/root 4532 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/extend_web_ui/extend.py
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/share/doc/python3-locust/examples/extend_web_ui/static/
-rw-r--r-- root/root 761 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/extend_web_ui/static/custom-stats-table.css
-rw-r--r-- root/root 2431 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/extend_web_ui/static/extend.js
drwxr-xr-x root/root 0 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/extend_web_ui/templates/
-rw-r--r-- root/root 2005 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/extend_web_ui/templates/extend.html
-rw-r--r-- root/root 554 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/fast_http_locust.py
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/share/doc/python3-locust/examples/grpc/
-rw-r--r-- root/root 1893 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/grpc/grpc_user.py
-rw-r--r-- root/root 219 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/grpc/hello.proto
-rw-r--r-- root/root 4673 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/grpc/hello_pb2.py
-rw-r--r-- root/root 2415 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/grpc/hello_pb2_grpc.py
-rw-r--r-- root/root 750 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/grpc/hello_server.py
-rw-r--r-- root/root 542 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/grpc/locustfile.py
-rw-r--r-- root/root 495 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/locustfile.py
-rw-r--r-- root/root 2145 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/manual_stats_reporting.py
-rw-r--r-- root/root 862 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/multiple_hosts.py
-rw-r--r-- root/root 581 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/nested_inline_tasksets.py
-rw-r--r-- root/root 4399 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/rest.py
drwxr-xr-x root/root 0 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/sdk_session_patching/
-rw-r--r-- root/root 761 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/sdk_session_patching/session_patch_locustfile.py
-rw-r--r-- root/root 623 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/semaphore_wait.py
-rw-r--r-- root/root 1041 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/stop_on_threshold.py
drwxr-xr-x root/root 0 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/terraform/
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/share/doc/python3-locust/examples/terraform/aws/
-rw-r--r-- root/root 1807 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/terraform/aws/README.md
-rw-r--r-- root/root 114 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/terraform/aws/data_subnet.tf
-rw-r--r-- root/root 935 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/terraform/aws/main.tf
-rw-r--r-- root/root 759 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/terraform/aws/output.tf
drwxr-xr-x root/root 0 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/terraform/aws/plan/
-rw-r--r-- root/root 503 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/terraform/aws/plan/basic.py
-rw-r--r-- root/root 47 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/terraform/aws/provisioner.tf
-rw-r--r-- root/root 504 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/terraform/aws/variables.tf
-rw-r--r-- root/root 4020 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/test_data_management.py
-rwxr-xr-x root/root 1117 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/use_as_lib.py
drwxr-xr-x root/root 0 2024-03-13 04:41 ./usr/share/doc/python3-locust/examples/vagrant/
-rw-r--r-- root/root 0 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/vagrant/README.md
-rw-r--r-- root/root 1569 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/vagrant/supervisord.conf
-rw-r--r-- root/root 2471 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/web_ui_auth.py
-rw-r--r-- root/root 644 2024-02-29 17:06 ./usr/share/doc/python3-locust/examples/worker_index.py
lintian
-------
Setup apt archive
-----------------
Merged Build-Depends: lintian
Filtered Build-Depends: lintian
dpkg-deb: building package 'sbuild-build-depends-lintian-dummy' in '/<<RESOLVERDIR>>/apt_archive/sbuild-build-depends-lintian-dummy.deb'.
Ign:1 copy:/<<RESOLVERDIR>>/apt_archive ./ InRelease
Get:2 copy:/<<RESOLVERDIR>>/apt_archive ./ Release [615 B]
Ign:3 copy:/<<RESOLVERDIR>>/apt_archive ./ Release.gpg
Get:4 copy:/<<RESOLVERDIR>>/apt_archive ./ Sources [1773 B]
Get:5 copy:/<<RESOLVERDIR>>/apt_archive ./ Packages [1682 B]
Fetched 4070 B in 0s (0 B/s)
Reading package lists...
Get:1 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ InRelease
Ign:1 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ InRelease
Get:2 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ Release [606 B]
Get:2 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ Release [606 B]
Get:3 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ Release.gpg
Ign:3 file:/<<BUILDDIR>>/resolver-OsCGsh/apt_archive ./ Release.gpg
Reading package lists...
Reading package lists...
Install lintian build dependencies (apt-based resolver)
-------------------------------------------------------
Installing build dependencies
Reading package lists...
Building dependency tree...
Reading state information...
The following NEW packages will be installed:
sbuild-build-depends-lintian-dummy
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 856 B of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 copy:/<<RESOLVERDIR>>/apt_archive ./ sbuild-build-depends-lintian-dummy 0.invalid.0 [856 B]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 856 B in 0s (0 B/s)
Selecting previously unselected package sbuild-build-depends-lintian-dummy.
(Reading database ... 26956 files and directories currently installed.)
Preparing to unpack .../sbuild-build-depends-lintian-dummy_0.invalid.0_amd64.deb ...
Unpacking sbuild-build-depends-lintian-dummy (0.invalid.0) ...
Setting up sbuild-build-depends-lintian-dummy (0.invalid.0) ...
Running lintian...
W: locust changes: distribution-and-changes-mismatch sid unstable
W: python3-locust: embedded-javascript-library please use libjs-jquery [usr/lib/python3/dist-packages/locust/static/jquery-1.11.3.min.js]
W: locust source: missing-field-in-dep5-copyright Copyright [debian/copyright:20]
W: locust source: missing-field-in-dep5-copyright Copyright [debian/copyright:9]
W: locust source: missing-field-in-dep5-copyright License [debian/copyright:20]
W: python3-locust: no-manual-page [usr/bin/locust]
I: Lintian run was successful.
+------------------------------------------------------------------------------+
| Post Build |
+------------------------------------------------------------------------------+
+------------------------------------------------------------------------------+
| Cleanup |
+------------------------------------------------------------------------------+
Purging /<<BUILDDIR>>
Not cleaning session: cloned chroot in use
+------------------------------------------------------------------------------+
| Summary |
+------------------------------------------------------------------------------+
Build Architecture: amd64
Build Type: binary
Build-Space: 30728
Build-Time: 478
Distribution: sid
Host Architecture: amd64
Install-Time: 38
Job: /tmp/debusine-fetch-exec-upload-006vdbx6/locust_2.24.0-1.dsc
Lintian: warn
Machine Architecture: amd64
Package: locust
Package-Time: 540
Source-Version: 2.24.0-1
Space: 30728
Status: successful
Version: 2.24.0-1
--------------------------------------------------------------------------------
Finished at 2024-11-15T12:03:23Z
Build needed 00:09:00, 30728k disk space