Running as unit: rb-build-amd64_1-22492.service ==================================================================================== Fri Nov 22 08:52:12 UTC 2024 - running /srv/jenkins/bin/reproducible_build.sh (for job reproducible_builder_amd64_1) on jenkins, called using "ionos1-amd64 ionos5-amd64" as arguments. Fri Nov 22 08:52:12 UTC 2024 - actually running "reproducible_build.sh" (md5sum 68e686e434c9ab7bc3ec047d8b309cbc) as "/tmp/jenkins-script-Lwh6GNnQ" $ git clone https://salsa.debian.org/qa/jenkins.debian.net.git ; more CONTRIBUTING Fri Nov 22 08:52:12 UTC 2024 - checking /var/lib/jenkins/offline_nodes if ionos1-amd64.debian.net is marked as down. Fri Nov 22 08:52:12 UTC 2024 - checking via ssh if ionos1-amd64.debian.net is up. removed '/tmp/read-only-fs-test-iEgGWw' Fri Nov 22 08:52:13 UTC 2024 - checking /var/lib/jenkins/offline_nodes if ionos5-amd64.debian.net is marked as down. Fri Nov 22 08:52:13 UTC 2024 - checking via ssh if ionos5-amd64.debian.net is up. removed '/tmp/read-only-fs-test-0WDEeO' ok, let's check if async-upnp-client is building anywhere yet… ok, async-upnp-client is not building anywhere… UPDATE 1 ============================================================================= Initialising reproducibly build of async-upnp-client in unstable on amd64 on jenkins now. 1st build will be done on ionos1-amd64.debian.net. 2nd build will be done on ionos5-amd64.debian.net. ============================================================================= Fri Nov 22 08:52:22 UTC 2024 I: starting to build async-upnp-client/unstable/amd64 on jenkins on '2024-11-22 08:52' Fri Nov 22 08:52:23 UTC 2024 I: The jenkins build log is/was available at https://jenkins.debian.net/userContent/reproducible/debian/build_service/amd64_1/22492/console.log 1732265543 amd64 unstable async-upnp-client Fri Nov 22 08:52:23 UTC 2024 I: Downloading source for unstable/async-upnp-client=0.40.0-1 --2024-11-22 08:52:23-- http://deb.debian.org/debian/pool/main/a/async-upnp-client/async-upnp-client_0.40.0-1.dsc Connecting to 46.16.76.132:3128... connected. Proxy request sent, awaiting response... 200 OK Length: 2497 (2.4K) [text/prs.lines.tag] Saving to: ‘async-upnp-client_0.40.0-1.dsc’ 0K .. 100% 354M=0s 2024-11-22 08:52:23 (354 MB/s) - ‘async-upnp-client_0.40.0-1.dsc’ saved [2497/2497] --2024-11-22 08:52:23-- http://deb.debian.org/debian/pool/main/a/async-upnp-client/async-upnp-client_0.40.0-1.dsc Connecting to 46.16.76.132:3128... connected. Proxy request sent, awaiting response... 200 OK Length: 2497 (2.4K) [text/prs.lines.tag] Saving to: ‘async-upnp-client_0.40.0-1.dsc’ 0K .. 100% 354M=0s 2024-11-22 08:52:23 (354 MB/s) - ‘async-upnp-client_0.40.0-1.dsc’ saved [2497/2497] Fri Nov 22 08:52:23 UTC 2024 I: async-upnp-client_0.40.0-1.dsc -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Format: 3.0 (quilt) Source: async-upnp-client Binary: python3-async-upnp-client Architecture: all Version: 0.40.0-1 Maintainer: Debian Python Team Uploaders: Edward Betts Homepage: https://github.com/StevenLooman/async_upnp_client Standards-Version: 4.7.0 Vcs-Browser: https://salsa.debian.org/python-team/packages/async-upnp-client Vcs-Git: https://salsa.debian.org/python-team/packages/async-upnp-client.git Testsuite: autopkgtest Testsuite-Triggers: python3-all, python3-pytest, python3-pytest-aiohttp, python3-pytest-asyncio, python3-pytest-cov Build-Depends: debhelper-compat (= 13), dh-sequence-python3, python3-all, python3-async-timeout , python3-defusedxml , python3-didl-lite , python3-pytest , python3-pytest-aiohttp , python3-pytest-asyncio , python3-pytest-cov , python3-setuptools, python3-voluptuous Package-List: python3-async-upnp-client deb python optional arch=all Checksums-Sha1: ee98034bd9949ed5d2a62235510797d501cec194 132136 async-upnp-client_0.40.0.orig.tar.gz 7467b882e44e41a1817939cf4a3c7026b5311117 2636 async-upnp-client_0.40.0-1.debian.tar.xz Checksums-Sha256: d14d9ec79c48a319db940c630b391bf3084d7e9a4d850cab2f0e1cb1cf85398f 132136 async-upnp-client_0.40.0.orig.tar.gz d461488108d560e2f032decd350300b9f9d6e3cf138c708c3a172510b9f96282 2636 async-upnp-client_0.40.0-1.debian.tar.xz Files: acce1cc356ab69e39cc33ecd259d7039 132136 async-upnp-client_0.40.0.orig.tar.gz 2c16c8bc579241534f3d1e0ab7bbf82f 2636 async-upnp-client_0.40.0-1.debian.tar.xz -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEE+4rPp4xyYInDitAmlgWhCYxjuSoFAmax/BkACgkQlgWhCYxj uSoxZhAAs2z/sTHHlHS2b5+umCIli8nHrvLpuY2bue1B70ORRvz/mglYrJydw6aL iDabu38yMPWWd4kaeMEX4WxS0Cm2k5Eeavcz+ZpuTeFyvVQ8m6EUEgQevctlZ9Uc 08/tyX2rz3CJ7DeBvDiLLN0n4bA8ci657l1iWpLBmywyaSGhT86RBiHkIuPYeJif FWVk+67ied7jvy9R20Bf562TKXb9L8QT19rVPo3lybPbN/gyQ1P42V3jdKkBwJ/E Uu7q+ojd64gPPwkUlk+bijj+W5tq5tykM3+bpxiJssRbc3J/VQQEmRLDrfl21PnI ygZ9uH9uBj1AVDHG/6ii3xZEy8XD00b7j3DfrKy3TBP/KK27mB7oiXWbYLXAczQU bkfLNr6c8iu2UDQyhEl7SwcrFZlnKwXmViT6VhXeWz73PJ8WNJp/MXn/vjL/zTsD pbDj8FW3WWMPOso0pjuXrpZScYAdDzmHSZjyayowYrmjxchPAXb3ds4HDMtEn0FU JNyAG4C565IK6ku2BsOitH/gGlGxlKUJ6V+BY6gf33rBV755hURNIi/mVbO4wWff 2OqgIKaySnri1VPgFv6pYn9/yguIdjbFKDwaLn9Q4rYLMG9wHLltPioSKmLegsB5 +90RU+3vUrQ41WuKX9hyM+Bg/TNiDIWzZbXEYyfgZxn/Wepz40E= =Q5zp -----END PGP SIGNATURE----- Fri Nov 22 08:52:23 UTC 2024 I: Checking whether the package is not for us Fri Nov 22 08:52:23 UTC 2024 I: Starting 1st build on remote node ionos1-amd64.debian.net. Fri Nov 22 08:52:23 UTC 2024 I: Preparing to do remote build '1' on ionos1-amd64.debian.net. Fri Nov 22 08:52:23 UTC 2024 - checking /var/lib/jenkins/offline_nodes if ionos1-amd64.debian.net is marked as down. Fri Nov 22 08:52:23 UTC 2024 - checking via ssh if ionos1-amd64.debian.net is up. removed '/tmp/read-only-fs-test-23vIAN' ==================================================================================== Fri Nov 22 08:52:25 UTC 2024 - running /srv/jenkins/bin/reproducible_build.sh (for job /srv/jenkins/bin/reproducible_build.sh) on ionos1-amd64, called using "1 async-upnp-client unstable /srv/reproducible-results/rbuild-debian/r-b-build.BQJy4ZlU 0.40.0-1" as arguments. Fri Nov 22 08:52:25 UTC 2024 - actually running "reproducible_build.sh" (md5sum 68e686e434c9ab7bc3ec047d8b309cbc) as "/tmp/jenkins-script-fXzae0sH" $ git clone https://salsa.debian.org/qa/jenkins.debian.net.git ; more CONTRIBUTING Fri Nov 22 08:52:25 UTC 2024 I: Downloading source for unstable/async-upnp-client=0.40.0-1 Reading package lists... NOTICE: 'async-upnp-client' packaging is maintained in the 'Git' version control system at: https://salsa.debian.org/python-team/packages/async-upnp-client.git Please use: git clone https://salsa.debian.org/python-team/packages/async-upnp-client.git to retrieve the latest (possibly unreleased) updates to the package. Need to get 137 kB of source archives. Get:1 http://deb.debian.org/debian unstable/main async-upnp-client 0.40.0-1 (dsc) [2497 B] Get:2 http://deb.debian.org/debian unstable/main async-upnp-client 0.40.0-1 (tar) [132 kB] Get:3 http://deb.debian.org/debian unstable/main async-upnp-client 0.40.0-1 (diff) [2636 B] Fetched 137 kB in 0s (3532 kB/s) Download complete and in download only mode Reading package lists... NOTICE: 'async-upnp-client' packaging is maintained in the 'Git' version control system at: https://salsa.debian.org/python-team/packages/async-upnp-client.git Please use: git clone https://salsa.debian.org/python-team/packages/async-upnp-client.git to retrieve the latest (possibly unreleased) updates to the package. Need to get 137 kB of source archives. Get:1 http://deb.debian.org/debian unstable/main async-upnp-client 0.40.0-1 (dsc) [2497 B] Get:2 http://deb.debian.org/debian unstable/main async-upnp-client 0.40.0-1 (tar) [132 kB] Get:3 http://deb.debian.org/debian unstable/main async-upnp-client 0.40.0-1 (diff) [2636 B] Fetched 137 kB in 0s (3532 kB/s) Download complete and in download only mode ============================================================================= Building async-upnp-client in unstable on amd64 on ionos1-amd64 now. Date: Fri Nov 22 08:52:25 UTC 2024 Date UTC: Fri Nov 22 08:52:25 UTC 2024 ============================================================================= W: /root/.pbuilderrc does not exist I: Logging to b1/build.log I: pbuilder: network access will be disabled during build I: Current time: Thu Nov 21 20:52:26 -12 2024 I: pbuilder-time-stamp: 1732265546 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/unstable-reproducible-base.tgz] I: copying local configuration W: --override-config is not set; not updating apt.conf Read the manpage for details. I: mounting /proc filesystem I: mounting /sys filesystem I: creating /{dev,run}/shm I: mounting /dev/pts filesystem I: redirecting /dev/ptmx to /dev/pts/ptmx I: policy-rc.d already exists I: Copying source file I: copying [async-upnp-client_0.40.0-1.dsc] I: copying [./async-upnp-client_0.40.0.orig.tar.gz] I: copying [./async-upnp-client_0.40.0-1.debian.tar.xz] I: Extracting source gpgv: Signature made Tue Aug 6 10:34:01 2024 gpgv: using RSA key FB8ACFA78C726089C38AD0269605A1098C63B92A gpgv: Can't check signature: No public key dpkg-source: warning: cannot verify inline signature for ./async-upnp-client_0.40.0-1.dsc: no acceptable signature found dpkg-source: info: extracting async-upnp-client in async-upnp-client-0.40.0 dpkg-source: info: unpacking async-upnp-client_0.40.0.orig.tar.gz dpkg-source: info: unpacking async-upnp-client_0.40.0-1.debian.tar.xz I: Not using root during the build. I: Installing the build-deps I: user script /srv/workspace/pbuilder/1545202/tmp/hooks/D02_print_environment starting I: set BUILDDIR='/build/reproducible-path' BUILDUSERGECOS='first user,first room,first work-phone,first home-phone,first other' BUILDUSERNAME='pbuilder1' BUILD_ARCH='amd64' DEBIAN_FRONTEND='noninteractive' DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=20 ' DISTRIBUTION='unstable' HOME='/root' HOST_ARCH='amd64' IFS=' ' INVOCATION_ID='917a34b2f81b4e499357ae5318e63d81' LANG='C' LANGUAGE='en_US:en' LC_ALL='C' MAIL='/var/mail/root' OPTIND='1' PATH='/usr/sbin:/usr/bin:/sbin:/bin:/usr/games' PBCURRENTCOMMANDLINEOPERATION='build' PBUILDER_OPERATION='build' PBUILDER_PKGDATADIR='/usr/share/pbuilder' PBUILDER_PKGLIBDIR='/usr/lib/pbuilder' PBUILDER_SYSCONFDIR='/etc' PPID='1545202' PS1='# ' PS2='> ' PS4='+ ' PWD='/' SHELL='/bin/bash' SHLVL='2' SUDO_COMMAND='/usr/bin/timeout -k 18.1h 18h /usr/bin/ionice -c 3 /usr/bin/nice /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.BQJy4ZlU/pbuilderrc_remt --distribution unstable --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/unstable-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.BQJy4ZlU/b1 --logfile b1/build.log async-upnp-client_0.40.0-1.dsc' SUDO_GID='110' SUDO_UID='105' SUDO_USER='jenkins' TERM='unknown' TZ='/usr/share/zoneinfo/Etc/GMT+12' USER='root' _='/usr/bin/systemd-run' http_proxy='http://46.16.76.132:3128' I: uname -a Linux ionos1-amd64 6.1.0-27-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.115-1 (2024-11-01) x86_64 GNU/Linux I: ls -l /bin lrwxrwxrwx 1 root root 7 Aug 4 21:30 /bin -> usr/bin I: user script /srv/workspace/pbuilder/1545202/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy Version: 0.invalid.0 Architecture: amd64 Maintainer: Debian Pbuilder Team Description: Dummy package to satisfy dependencies with aptitude - created by pbuilder This package was created automatically by pbuilder to satisfy the build-dependencies of the package being currently built. Depends: debhelper-compat (= 13), dh-sequence-python3, python3-all, python3-async-timeout, python3-defusedxml, python3-didl-lite, python3-pytest, python3-pytest-aiohttp, python3-pytest-asyncio, python3-pytest-cov, python3-setuptools, python3-voluptuous dpkg-deb: building package 'pbuilder-satisfydepends-dummy' in '/tmp/satisfydepends-aptitude/pbuilder-satisfydepends-dummy.deb'. Selecting previously unselected package pbuilder-satisfydepends-dummy. (Reading database ... 19966 files and directories currently installed.) Preparing to unpack .../pbuilder-satisfydepends-dummy.deb ... Unpacking pbuilder-satisfydepends-dummy (0.invalid.0) ... dpkg: pbuilder-satisfydepends-dummy: dependency problems, but configuring anyway as you requested: pbuilder-satisfydepends-dummy depends on debhelper-compat (= 13); however: Package debhelper-compat is not installed. pbuilder-satisfydepends-dummy depends on dh-sequence-python3; however: Package dh-sequence-python3 is not installed. pbuilder-satisfydepends-dummy depends on python3-all; however: Package python3-all is not installed. pbuilder-satisfydepends-dummy depends on python3-async-timeout; however: Package python3-async-timeout is not installed. pbuilder-satisfydepends-dummy depends on python3-defusedxml; however: Package python3-defusedxml is not installed. pbuilder-satisfydepends-dummy depends on python3-didl-lite; however: Package python3-didl-lite is not installed. pbuilder-satisfydepends-dummy depends on python3-pytest; however: Package python3-pytest is not installed. pbuilder-satisfydepends-dummy depends on python3-pytest-aiohttp; however: Package python3-pytest-aiohttp is not installed. pbuilder-satisfydepends-dummy depends on python3-pytest-asyncio; however: Package python3-pytest-asyncio is not installed. pbuilder-satisfydepends-dummy depends on python3-pytest-cov; however: Package python3-pytest-cov is not installed. pbuilder-satisfydepends-dummy depends on python3-setuptools; however: Package python3-setuptools is not installed. pbuilder-satisfydepends-dummy depends on python3-voluptuous; however: Package python3-voluptuous is not installed. Setting up pbuilder-satisfydepends-dummy (0.invalid.0) ... Reading package lists... Building dependency tree... Reading state information... Initializing package states... Writing extended state information... Building tag database... pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) The following NEW packages will be installed: autoconf{a} automake{a} autopoint{a} autotools-dev{a} bsdextrautils{a} debhelper{a} dh-autoreconf{a} dh-python{a} dh-strip-nondeterminism{a} dwz{a} file{a} gettext{a} gettext-base{a} groff-base{a} intltool-debian{a} libarchive-zip-perl{a} libcom-err2{a} libdebhelper-perl{a} libelf1t64{a} libexpat1{a} libfile-stripnondeterminism-perl{a} libgssapi-krb5-2{a} libicu72{a} libjs-jquery{a} libjs-jquery-hotkeys{a} libjs-jquery-isonscreen{a} libjs-jquery-metadata{a} libjs-jquery-tablesorter{a} libjs-jquery-throttle-debounce{a} libk5crypto3{a} libkeyutils1{a} libkrb5-3{a} libkrb5support0{a} libmagic-mgc{a} libmagic1t64{a} libnsl2{a} libpipeline1{a} libpython3-stdlib{a} libpython3.12-minimal{a} libpython3.12-stdlib{a} libpython3.13-minimal{a} libpython3.13-stdlib{a} libreadline8t64{a} libtirpc-common{a} libtirpc3t64{a} libtool{a} libuchardet0{a} libxml2{a} m4{a} man-db{a} media-types{a} netbase{a} po-debconf{a} python3{a} python3-aiohappyeyeballs{a} python3-aiohttp{a} python3-aiosignal{a} python3-all{a} python3-async-generator{a} python3-async-timeout{a} python3-attr{a} python3-autocommand{a} python3-coverage{a} python3-defusedxml{a} python3-didl-lite{a} python3-frozenlist{a} python3-idna{a} python3-inflect{a} python3-iniconfig{a} python3-jaraco.context{a} python3-jaraco.functools{a} python3-jaraco.text{a} python3-minimal{a} python3-more-itertools{a} python3-multidict{a} python3-packaging{a} python3-pkg-resources{a} python3-pluggy{a} python3-pytest{a} python3-pytest-aiohttp{a} python3-pytest-asyncio{a} python3-pytest-cov{a} python3-setuptools{a} python3-typeguard{a} python3-typing-extensions{a} python3-voluptuous{a} python3-yarl{a} python3-zipp{a} python3.12{a} python3.12-minimal{a} python3.13{a} python3.13-minimal{a} readline-common{a} sensible-utils{a} tzdata{a} The following packages are RECOMMENDED but will NOT be installed: ca-certificates curl javascript-common krb5-locales libarchive-cpio-perl libltdl-dev libmail-sendmail-perl lynx python3-aiodns python3-pygments wget 0 packages upgraded, 95 newly installed, 0 to remove and 0 not upgraded. Need to get 35.8 MB of archives. After unpacking 142 MB will be used. Writing extended state information... Get: 1 http://deb.debian.org/debian unstable/main amd64 libjs-jquery all 3.6.1+dfsg+~3.5.14-1 [326 kB] Get: 2 http://deb.debian.org/debian unstable/main amd64 libjs-jquery-hotkeys all 0~20130707+git2d51e3a9+dfsg-2.1 [11.5 kB] Get: 3 http://deb.debian.org/debian unstable/main amd64 libpython3.12-minimal amd64 3.12.7-3 [815 kB] Get: 4 http://deb.debian.org/debian unstable/main amd64 libexpat1 amd64 2.6.4-1 [106 kB] Get: 5 http://deb.debian.org/debian unstable/main amd64 python3.12-minimal amd64 3.12.7-3 [2162 kB] Get: 6 http://deb.debian.org/debian unstable/main amd64 python3-minimal amd64 3.12.7-1 [26.8 kB] Get: 7 http://deb.debian.org/debian unstable/main amd64 media-types all 10.1.0 [26.9 kB] Get: 8 http://deb.debian.org/debian unstable/main amd64 netbase all 6.4 [12.8 kB] Get: 9 http://deb.debian.org/debian unstable/main amd64 tzdata all 2024b-3 [255 kB] Get: 10 http://deb.debian.org/debian unstable/main amd64 libkrb5support0 amd64 1.21.3-3 [32.5 kB] Get: 11 http://deb.debian.org/debian unstable/main amd64 libcom-err2 amd64 1.47.1-1+b1 [23.2 kB] Get: 12 http://deb.debian.org/debian unstable/main amd64 libk5crypto3 amd64 1.21.3-3 [79.9 kB] Get: 13 http://deb.debian.org/debian unstable/main amd64 libkeyutils1 amd64 1.6.3-4 [9092 B] Get: 14 http://deb.debian.org/debian unstable/main amd64 libkrb5-3 amd64 1.21.3-3 [324 kB] Get: 15 http://deb.debian.org/debian unstable/main amd64 libgssapi-krb5-2 amd64 1.21.3-3 [136 kB] Get: 16 http://deb.debian.org/debian unstable/main amd64 libtirpc-common all 1.3.4+ds-1.3 [10.9 kB] Get: 17 http://deb.debian.org/debian unstable/main amd64 libtirpc3t64 amd64 1.3.4+ds-1.3+b1 [83.1 kB] Get: 18 http://deb.debian.org/debian unstable/main amd64 libnsl2 amd64 1.3.0-3+b3 [40.6 kB] Get: 19 http://deb.debian.org/debian unstable/main amd64 readline-common all 8.2-5 [69.3 kB] Get: 20 http://deb.debian.org/debian unstable/main amd64 libreadline8t64 amd64 8.2-5 [169 kB] Get: 21 http://deb.debian.org/debian unstable/main amd64 libpython3.12-stdlib amd64 3.12.7-3 [1966 kB] Get: 22 http://deb.debian.org/debian unstable/main amd64 python3.12 amd64 3.12.7-3 [671 kB] Get: 23 http://deb.debian.org/debian unstable/main amd64 libpython3-stdlib amd64 3.12.7-1 [9712 B] Get: 24 http://deb.debian.org/debian unstable/main amd64 python3 amd64 3.12.7-1 [27.8 kB] Get: 25 http://deb.debian.org/debian unstable/main amd64 libpython3.13-minimal amd64 3.13.0-2 [856 kB] Get: 26 http://deb.debian.org/debian unstable/main amd64 python3.13-minimal amd64 3.13.0-2 [2038 kB] Get: 27 http://deb.debian.org/debian unstable/main amd64 sensible-utils all 0.0.24 [24.8 kB] Get: 28 http://deb.debian.org/debian unstable/main amd64 libmagic-mgc amd64 1:5.45-3+b1 [314 kB] Get: 29 http://deb.debian.org/debian unstable/main amd64 libmagic1t64 amd64 1:5.45-3+b1 [108 kB] Get: 30 http://deb.debian.org/debian unstable/main amd64 file amd64 1:5.45-3+b1 [43.3 kB] Get: 31 http://deb.debian.org/debian unstable/main amd64 gettext-base amd64 0.22.5-2 [200 kB] Get: 32 http://deb.debian.org/debian unstable/main amd64 libuchardet0 amd64 0.0.8-1+b2 [68.9 kB] Get: 33 http://deb.debian.org/debian unstable/main amd64 groff-base amd64 1.23.0-5 [1181 kB] Get: 34 http://deb.debian.org/debian unstable/main amd64 bsdextrautils amd64 2.40.2-11 [91.5 kB] Get: 35 http://deb.debian.org/debian unstable/main amd64 libpipeline1 amd64 1.5.8-1 [42.0 kB] Get: 36 http://deb.debian.org/debian unstable/main amd64 man-db amd64 2.13.0-1 [1420 kB] Get: 37 http://deb.debian.org/debian unstable/main amd64 m4 amd64 1.4.19-4 [287 kB] Get: 38 http://deb.debian.org/debian unstable/main amd64 autoconf all 2.72-3 [493 kB] Get: 39 http://deb.debian.org/debian unstable/main amd64 autotools-dev all 20220109.1 [51.6 kB] Get: 40 http://deb.debian.org/debian unstable/main amd64 automake all 1:1.16.5-1.3 [823 kB] Get: 41 http://deb.debian.org/debian unstable/main amd64 autopoint all 0.22.5-2 [723 kB] Get: 42 http://deb.debian.org/debian unstable/main amd64 libdebhelper-perl all 13.20 [89.7 kB] Get: 43 http://deb.debian.org/debian unstable/main amd64 libtool all 2.4.7-8 [517 kB] Get: 44 http://deb.debian.org/debian unstable/main amd64 dh-autoreconf all 20 [17.1 kB] Get: 45 http://deb.debian.org/debian unstable/main amd64 libarchive-zip-perl all 1.68-1 [104 kB] Get: 46 http://deb.debian.org/debian unstable/main amd64 libfile-stripnondeterminism-perl all 1.14.0-1 [19.5 kB] Get: 47 http://deb.debian.org/debian unstable/main amd64 dh-strip-nondeterminism all 1.14.0-1 [8448 B] Get: 48 http://deb.debian.org/debian unstable/main amd64 libelf1t64 amd64 0.192-4 [189 kB] Get: 49 http://deb.debian.org/debian unstable/main amd64 dwz amd64 0.15-1+b1 [110 kB] Get: 50 http://deb.debian.org/debian unstable/main amd64 libicu72 amd64 72.1-5+b1 [9423 kB] Get: 51 http://deb.debian.org/debian unstable/main amd64 libxml2 amd64 2.12.7+dfsg+really2.9.14-0.2+b1 [699 kB] Get: 52 http://deb.debian.org/debian unstable/main amd64 gettext amd64 0.22.5-2 [1601 kB] Get: 53 http://deb.debian.org/debian unstable/main amd64 intltool-debian all 0.35.0+20060710.6 [22.9 kB] Get: 54 http://deb.debian.org/debian unstable/main amd64 po-debconf all 1.0.21+nmu1 [248 kB] Get: 55 http://deb.debian.org/debian unstable/main amd64 debhelper all 13.20 [915 kB] Get: 56 http://deb.debian.org/debian unstable/main amd64 python3-autocommand all 2.2.2-3 [13.6 kB] Get: 57 http://deb.debian.org/debian unstable/main amd64 python3-more-itertools all 10.5.0-1 [63.8 kB] Get: 58 http://deb.debian.org/debian unstable/main amd64 python3-typing-extensions all 4.12.2-2 [73.0 kB] Get: 59 http://deb.debian.org/debian unstable/main amd64 python3-typeguard all 4.4.1-1 [37.0 kB] Get: 60 http://deb.debian.org/debian unstable/main amd64 python3-inflect all 7.3.1-2 [32.4 kB] Get: 61 http://deb.debian.org/debian unstable/main amd64 python3-jaraco.context all 6.0.0-1 [7984 B] Get: 62 http://deb.debian.org/debian unstable/main amd64 python3-jaraco.functools all 4.1.0-1 [12.0 kB] Get: 63 http://deb.debian.org/debian unstable/main amd64 python3-pkg-resources all 75.2.0-1 [213 kB] Get: 64 http://deb.debian.org/debian unstable/main amd64 python3-jaraco.text all 4.0.0-1 [11.4 kB] Get: 65 http://deb.debian.org/debian unstable/main amd64 python3-zipp all 3.21.0-1 [10.6 kB] Get: 66 http://deb.debian.org/debian unstable/main amd64 python3-setuptools all 75.2.0-1 [731 kB] Get: 67 http://deb.debian.org/debian unstable/main amd64 dh-python all 6.20241024 [109 kB] Get: 68 http://deb.debian.org/debian unstable/main amd64 libjs-jquery-isonscreen all 1.2.0-1.1 [3196 B] Get: 69 http://deb.debian.org/debian unstable/main amd64 libjs-jquery-metadata all 12-4 [6532 B] Get: 70 http://deb.debian.org/debian unstable/main amd64 libjs-jquery-tablesorter all 1:2.31.3+dfsg1-4 [184 kB] Get: 71 http://deb.debian.org/debian unstable/main amd64 libjs-jquery-throttle-debounce all 1.1+dfsg.1-2 [12.2 kB] Get: 72 http://deb.debian.org/debian unstable/main amd64 libpython3.13-stdlib amd64 3.13.0-2 [1992 kB] Get: 73 http://deb.debian.org/debian unstable/main amd64 python3-aiohappyeyeballs all 2.4.3-1 [13.3 kB] Get: 74 http://deb.debian.org/debian unstable/main amd64 python3-idna all 3.8-2 [41.6 kB] Get: 75 http://deb.debian.org/debian unstable/main amd64 python3-multidict amd64 6.1.0-1+b1 [39.8 kB] Get: 76 http://deb.debian.org/debian unstable/main amd64 python3-yarl amd64 1.13.1-1+b1 [118 kB] Get: 77 http://deb.debian.org/debian unstable/main amd64 python3-async-timeout all 5.0.1-1 [8324 B] Get: 78 http://deb.debian.org/debian unstable/main amd64 python3-frozenlist amd64 1.5.0-1+b1 [58.6 kB] Get: 79 http://deb.debian.org/debian unstable/main amd64 python3-aiosignal all 1.3.1-1 [6016 B] Get: 80 http://deb.debian.org/debian unstable/main amd64 python3-attr all 24.2.0-1 [68.4 kB] Get: 81 http://deb.debian.org/debian unstable/main amd64 python3-aiohttp amd64 3.10.10-2 [364 kB] Get: 82 http://deb.debian.org/debian unstable/main amd64 python3.13 amd64 3.13.0-2 [730 kB] Get: 83 http://deb.debian.org/debian unstable/main amd64 python3-all amd64 3.12.7-1 [1052 B] Get: 84 http://deb.debian.org/debian unstable/main amd64 python3-async-generator all 1.10-4 [17.4 kB] Get: 85 http://deb.debian.org/debian unstable/main amd64 python3-coverage amd64 7.6.0+dfsg1-2+b1 [177 kB] Get: 86 http://deb.debian.org/debian unstable/main amd64 python3-defusedxml all 0.7.1-2 [43.3 kB] Get: 87 http://deb.debian.org/debian unstable/main amd64 python3-didl-lite all 1.4.1-1 [10.8 kB] Get: 88 http://deb.debian.org/debian unstable/main amd64 python3-iniconfig all 1.1.1-2 [6396 B] Get: 89 http://deb.debian.org/debian unstable/main amd64 python3-packaging all 24.2-1 [55.3 kB] Get: 90 http://deb.debian.org/debian unstable/main amd64 python3-pluggy all 1.5.0-1 [26.9 kB] Get: 91 http://deb.debian.org/debian unstable/main amd64 python3-pytest all 8.3.3-1 [249 kB] Get: 92 http://deb.debian.org/debian unstable/main amd64 python3-pytest-asyncio all 0.24.0a1-1 [15.6 kB] Get: 93 http://deb.debian.org/debian unstable/main amd64 python3-pytest-aiohttp all 1.0.5-1 [5676 B] Get: 94 http://deb.debian.org/debian unstable/main amd64 python3-pytest-cov all 5.0.0-1 [26.8 kB] Get: 95 http://deb.debian.org/debian unstable/main amd64 python3-voluptuous all 0.14.2-1 [45.8 kB] Fetched 35.8 MB in 1s (59.3 MB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libjs-jquery. (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 ... 19966 files and directories currently installed.) Preparing to unpack .../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-jquery-hotkeys. Preparing to unpack .../libjs-jquery-hotkeys_0~20130707+git2d51e3a9+dfsg-2.1_all.deb ... Unpacking libjs-jquery-hotkeys (0~20130707+git2d51e3a9+dfsg-2.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 ... (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 ... 20312 files and directories currently installed.) Preparing to unpack .../00-python3-minimal_3.12.7-1_amd64.deb ... Unpacking python3-minimal (3.12.7-1) ... Selecting previously unselected package media-types. Preparing to unpack .../01-media-types_10.1.0_all.deb ... Unpacking media-types (10.1.0) ... Selecting previously unselected package netbase. Preparing to unpack .../02-netbase_6.4_all.deb ... Unpacking netbase (6.4) ... Selecting previously unselected package tzdata. Preparing to unpack .../03-tzdata_2024b-3_all.deb ... Unpacking tzdata (2024b-3) ... Selecting previously unselected package libkrb5support0:amd64. Preparing to unpack .../04-libkrb5support0_1.21.3-3_amd64.deb ... Unpacking libkrb5support0:amd64 (1.21.3-3) ... Selecting previously unselected package libcom-err2:amd64. Preparing to unpack .../05-libcom-err2_1.47.1-1+b1_amd64.deb ... Unpacking libcom-err2:amd64 (1.47.1-1+b1) ... Selecting previously unselected package libk5crypto3:amd64. Preparing to unpack .../06-libk5crypto3_1.21.3-3_amd64.deb ... Unpacking libk5crypto3:amd64 (1.21.3-3) ... Selecting previously unselected package libkeyutils1:amd64. Preparing to unpack .../07-libkeyutils1_1.6.3-4_amd64.deb ... Unpacking libkeyutils1:amd64 (1.6.3-4) ... Selecting previously unselected package libkrb5-3:amd64. Preparing to unpack .../08-libkrb5-3_1.21.3-3_amd64.deb ... Unpacking libkrb5-3:amd64 (1.21.3-3) ... Selecting previously unselected package libgssapi-krb5-2:amd64. Preparing to unpack .../09-libgssapi-krb5-2_1.21.3-3_amd64.deb ... Unpacking libgssapi-krb5-2:amd64 (1.21.3-3) ... Selecting previously unselected package libtirpc-common. Preparing to unpack .../10-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 .../11-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 .../12-libnsl2_1.3.0-3+b3_amd64.deb ... Unpacking libnsl2:amd64 (1.3.0-3+b3) ... Selecting previously unselected package readline-common. Preparing to unpack .../13-readline-common_8.2-5_all.deb ... Unpacking readline-common (8.2-5) ... Selecting previously unselected package libreadline8t64:amd64. Preparing to unpack .../14-libreadline8t64_8.2-5_amd64.deb ... Adding 'diversion of /lib/x86_64-linux-gnu/libhistory.so.8 to /lib/x86_64-linux-gnu/libhistory.so.8.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libhistory.so.8.2 to /lib/x86_64-linux-gnu/libhistory.so.8.2.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libreadline.so.8 to /lib/x86_64-linux-gnu/libreadline.so.8.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libreadline.so.8.2 to /lib/x86_64-linux-gnu/libreadline.so.8.2.usr-is-merged by libreadline8t64' Unpacking libreadline8t64:amd64 (8.2-5) ... Selecting previously unselected package libpython3.12-stdlib:amd64. Preparing to unpack .../15-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 .../16-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 .../17-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 ... (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 ... 21374 files and directories currently installed.) Preparing to unpack .../00-python3_3.12.7-1_amd64.deb ... Unpacking python3 (3.12.7-1) ... Selecting previously unselected package libpython3.13-minimal:amd64. Preparing to unpack .../01-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 .../02-python3.13-minimal_3.13.0-2_amd64.deb ... Unpacking python3.13-minimal (3.13.0-2) ... Selecting previously unselected package sensible-utils. Preparing to unpack .../03-sensible-utils_0.0.24_all.deb ... Unpacking sensible-utils (0.0.24) ... Selecting previously unselected package libmagic-mgc. Preparing to unpack .../04-libmagic-mgc_1%3a5.45-3+b1_amd64.deb ... Unpacking libmagic-mgc (1:5.45-3+b1) ... Selecting previously unselected package libmagic1t64:amd64. Preparing to unpack .../05-libmagic1t64_1%3a5.45-3+b1_amd64.deb ... Unpacking libmagic1t64:amd64 (1:5.45-3+b1) ... Selecting previously unselected package file. Preparing to unpack .../06-file_1%3a5.45-3+b1_amd64.deb ... Unpacking file (1:5.45-3+b1) ... Selecting previously unselected package gettext-base. Preparing to unpack .../07-gettext-base_0.22.5-2_amd64.deb ... Unpacking gettext-base (0.22.5-2) ... Selecting previously unselected package libuchardet0:amd64. Preparing to unpack .../08-libuchardet0_0.0.8-1+b2_amd64.deb ... Unpacking libuchardet0:amd64 (0.0.8-1+b2) ... Selecting previously unselected package groff-base. Preparing to unpack .../09-groff-base_1.23.0-5_amd64.deb ... Unpacking groff-base (1.23.0-5) ... Selecting previously unselected package bsdextrautils. Preparing to unpack .../10-bsdextrautils_2.40.2-11_amd64.deb ... Unpacking bsdextrautils (2.40.2-11) ... Selecting previously unselected package libpipeline1:amd64. Preparing to unpack .../11-libpipeline1_1.5.8-1_amd64.deb ... Unpacking libpipeline1:amd64 (1.5.8-1) ... Selecting previously unselected package man-db. Preparing to unpack .../12-man-db_2.13.0-1_amd64.deb ... Unpacking man-db (2.13.0-1) ... Selecting previously unselected package m4. Preparing to unpack .../13-m4_1.4.19-4_amd64.deb ... Unpacking m4 (1.4.19-4) ... Selecting previously unselected package autoconf. Preparing to unpack .../14-autoconf_2.72-3_all.deb ... Unpacking autoconf (2.72-3) ... Selecting previously unselected package autotools-dev. Preparing to unpack .../15-autotools-dev_20220109.1_all.deb ... Unpacking autotools-dev (20220109.1) ... Selecting previously unselected package automake. Preparing to unpack .../16-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 .../17-autopoint_0.22.5-2_all.deb ... Unpacking autopoint (0.22.5-2) ... Selecting previously unselected package libdebhelper-perl. Preparing to unpack .../18-libdebhelper-perl_13.20_all.deb ... Unpacking libdebhelper-perl (13.20) ... Selecting previously unselected package libtool. Preparing to unpack .../19-libtool_2.4.7-8_all.deb ... Unpacking libtool (2.4.7-8) ... Selecting previously unselected package dh-autoreconf. Preparing to unpack .../20-dh-autoreconf_20_all.deb ... Unpacking dh-autoreconf (20) ... Selecting previously unselected package libarchive-zip-perl. Preparing to unpack .../21-libarchive-zip-perl_1.68-1_all.deb ... Unpacking libarchive-zip-perl (1.68-1) ... Selecting previously unselected package libfile-stripnondeterminism-perl. Preparing to unpack .../22-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 .../23-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 .../24-libelf1t64_0.192-4_amd64.deb ... Unpacking libelf1t64:amd64 (0.192-4) ... Selecting previously unselected package dwz. Preparing to unpack .../25-dwz_0.15-1+b1_amd64.deb ... Unpacking dwz (0.15-1+b1) ... Selecting previously unselected package libicu72:amd64. Preparing to unpack .../26-libicu72_72.1-5+b1_amd64.deb ... Unpacking libicu72:amd64 (72.1-5+b1) ... Selecting previously unselected package libxml2:amd64. Preparing to unpack .../27-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) ... Selecting previously unselected package gettext. Preparing to unpack .../28-gettext_0.22.5-2_amd64.deb ... Unpacking gettext (0.22.5-2) ... Selecting previously unselected package intltool-debian. Preparing to unpack .../29-intltool-debian_0.35.0+20060710.6_all.deb ... Unpacking intltool-debian (0.35.0+20060710.6) ... Selecting previously unselected package po-debconf. Preparing to unpack .../30-po-debconf_1.0.21+nmu1_all.deb ... Unpacking po-debconf (1.0.21+nmu1) ... Selecting previously unselected package debhelper. Preparing to unpack .../31-debhelper_13.20_all.deb ... Unpacking debhelper (13.20) ... Selecting previously unselected package python3-autocommand. Preparing to unpack .../32-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 .../33-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 .../34-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 .../35-python3-typeguard_4.4.1-1_all.deb ... Unpacking python3-typeguard (4.4.1-1) ... Selecting previously unselected package python3-inflect. Preparing to unpack .../36-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 .../37-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 .../38-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 .../39-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 .../40-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 .../41-python3-zipp_3.21.0-1_all.deb ... Unpacking python3-zipp (3.21.0-1) ... Selecting previously unselected package python3-setuptools. Preparing to unpack .../42-python3-setuptools_75.2.0-1_all.deb ... Unpacking python3-setuptools (75.2.0-1) ... Selecting previously unselected package dh-python. Preparing to unpack .../43-dh-python_6.20241024_all.deb ... Unpacking dh-python (6.20241024) ... Selecting previously unselected package libjs-jquery-isonscreen. Preparing to unpack .../44-libjs-jquery-isonscreen_1.2.0-1.1_all.deb ... Unpacking libjs-jquery-isonscreen (1.2.0-1.1) ... Selecting previously unselected package libjs-jquery-metadata. Preparing to unpack .../45-libjs-jquery-metadata_12-4_all.deb ... Unpacking libjs-jquery-metadata (12-4) ... Selecting previously unselected package libjs-jquery-tablesorter. Preparing to unpack .../46-libjs-jquery-tablesorter_1%3a2.31.3+dfsg1-4_all.deb ... Unpacking libjs-jquery-tablesorter (1:2.31.3+dfsg1-4) ... Selecting previously unselected package libjs-jquery-throttle-debounce. Preparing to unpack .../47-libjs-jquery-throttle-debounce_1.1+dfsg.1-2_all.deb ... Unpacking libjs-jquery-throttle-debounce (1.1+dfsg.1-2) ... Selecting previously unselected package libpython3.13-stdlib:amd64. Preparing to unpack .../48-libpython3.13-stdlib_3.13.0-2_amd64.deb ... Unpacking libpython3.13-stdlib:amd64 (3.13.0-2) ... Selecting previously unselected package python3-aiohappyeyeballs. Preparing to unpack .../49-python3-aiohappyeyeballs_2.4.3-1_all.deb ... Unpacking python3-aiohappyeyeballs (2.4.3-1) ... Selecting previously unselected package python3-idna. Preparing to unpack .../50-python3-idna_3.8-2_all.deb ... Unpacking python3-idna (3.8-2) ... Selecting previously unselected package python3-multidict. Preparing to unpack .../51-python3-multidict_6.1.0-1+b1_amd64.deb ... Unpacking python3-multidict (6.1.0-1+b1) ... Selecting previously unselected package python3-yarl. Preparing to unpack .../52-python3-yarl_1.13.1-1+b1_amd64.deb ... Unpacking python3-yarl (1.13.1-1+b1) ... Selecting previously unselected package python3-async-timeout. Preparing to unpack .../53-python3-async-timeout_5.0.1-1_all.deb ... Unpacking python3-async-timeout (5.0.1-1) ... Selecting previously unselected package python3-frozenlist. Preparing to unpack .../54-python3-frozenlist_1.5.0-1+b1_amd64.deb ... Unpacking python3-frozenlist (1.5.0-1+b1) ... Selecting previously unselected package python3-aiosignal. Preparing to unpack .../55-python3-aiosignal_1.3.1-1_all.deb ... Unpacking python3-aiosignal (1.3.1-1) ... Selecting previously unselected package python3-attr. Preparing to unpack .../56-python3-attr_24.2.0-1_all.deb ... Unpacking python3-attr (24.2.0-1) ... Selecting previously unselected package python3-aiohttp. Preparing to unpack .../57-python3-aiohttp_3.10.10-2_amd64.deb ... Unpacking python3-aiohttp (3.10.10-2) ... Selecting previously unselected package python3.13. Preparing to unpack .../58-python3.13_3.13.0-2_amd64.deb ... Unpacking python3.13 (3.13.0-2) ... Selecting previously unselected package python3-all. Preparing to unpack .../59-python3-all_3.12.7-1_amd64.deb ... Unpacking python3-all (3.12.7-1) ... Selecting previously unselected package python3-async-generator. Preparing to unpack .../60-python3-async-generator_1.10-4_all.deb ... Unpacking python3-async-generator (1.10-4) ... Selecting previously unselected package python3-coverage. Preparing to unpack .../61-python3-coverage_7.6.0+dfsg1-2+b1_amd64.deb ... Unpacking python3-coverage (7.6.0+dfsg1-2+b1) ... Selecting previously unselected package python3-defusedxml. Preparing to unpack .../62-python3-defusedxml_0.7.1-2_all.deb ... Unpacking python3-defusedxml (0.7.1-2) ... Selecting previously unselected package python3-didl-lite. Preparing to unpack .../63-python3-didl-lite_1.4.1-1_all.deb ... Unpacking python3-didl-lite (1.4.1-1) ... Selecting previously unselected package python3-iniconfig. Preparing to unpack .../64-python3-iniconfig_1.1.1-2_all.deb ... Unpacking python3-iniconfig (1.1.1-2) ... Selecting previously unselected package python3-packaging. Preparing to unpack .../65-python3-packaging_24.2-1_all.deb ... Unpacking python3-packaging (24.2-1) ... Selecting previously unselected package python3-pluggy. Preparing to unpack .../66-python3-pluggy_1.5.0-1_all.deb ... Unpacking python3-pluggy (1.5.0-1) ... Selecting previously unselected package python3-pytest. Preparing to unpack .../67-python3-pytest_8.3.3-1_all.deb ... Unpacking python3-pytest (8.3.3-1) ... Selecting previously unselected package python3-pytest-asyncio. Preparing to unpack .../68-python3-pytest-asyncio_0.24.0a1-1_all.deb ... Unpacking python3-pytest-asyncio (0.24.0a1-1) ... Selecting previously unselected package python3-pytest-aiohttp. Preparing to unpack .../69-python3-pytest-aiohttp_1.0.5-1_all.deb ... Unpacking python3-pytest-aiohttp (1.0.5-1) ... Selecting previously unselected package python3-pytest-cov. Preparing to unpack .../70-python3-pytest-cov_5.0.0-1_all.deb ... Unpacking python3-pytest-cov (5.0.0-1) ... Selecting previously unselected package python3-voluptuous. Preparing to unpack .../71-python3-voluptuous_0.14.2-1_all.deb ... Unpacking python3-voluptuous (0.14.2-1) ... Setting up media-types (10.1.0) ... Setting up libpipeline1:amd64 (1.5.8-1) ... Setting up libkeyutils1:amd64 (1.6.3-4) ... Setting up libicu72:amd64 (72.1-5+b1) ... Setting up bsdextrautils (2.40.2-11) ... Setting up libmagic-mgc (1:5.45-3+b1) ... Setting up libarchive-zip-perl (1.68-1) ... Setting up libtirpc-common (1.3.4+ds-1.3) ... Setting up libdebhelper-perl (13.20) ... Setting up libmagic1t64:amd64 (1:5.45-3+b1) ... Setting up gettext-base (0.22.5-2) ... Setting up m4 (1.4.19-4) ... Setting up libcom-err2:amd64 (1.47.1-1+b1) ... Setting up file (1:5.45-3+b1) ... Setting up libjs-jquery-throttle-debounce (1.1+dfsg.1-2) ... Setting up libelf1t64:amd64 (0.192-4) ... Setting up libkrb5support0:amd64 (1.21.3-3) ... Setting up tzdata (2024b-3) ... Current default time zone: 'Etc/UTC' Local time is now: Fri Nov 22 08:53:13 UTC 2024. Universal Time is now: Fri Nov 22 08:53:13 UTC 2024. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up libpython3.13-minimal:amd64 (3.13.0-2) ... Setting up autotools-dev (20220109.1) ... Setting up autopoint (0.22.5-2) ... Setting up libk5crypto3:amd64 (1.21.3-3) ... Setting up autoconf (2.72-3) ... Setting up dwz (0.15-1+b1) ... Setting up sensible-utils (0.0.24) ... Setting up libuchardet0:amd64 (0.0.8-1+b2) ... Setting up python3.13-minimal (3.13.0-2) ... Setting up netbase (6.4) ... Setting up libkrb5-3:amd64 (1.21.3-3) ... Setting up libjs-jquery (3.6.1+dfsg+~3.5.14-1) ... Setting up libjs-jquery-hotkeys (0~20130707+git2d51e3a9+dfsg-2.1) ... Setting up readline-common (8.2-5) ... Setting up libxml2:amd64 (2.12.7+dfsg+really2.9.14-0.2+b1) ... 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 libfile-stripnondeterminism-perl (1.14.0-1) ... Setting up gettext (0.22.5-2) ... Setting up libtool (2.4.7-8) ... Setting up intltool-debian (0.35.0+20060710.6) ... Setting up dh-autoreconf (20) ... Setting up libjs-jquery-metadata (12-4) ... Setting up libjs-jquery-isonscreen (1.2.0-1.1) ... Setting up libgssapi-krb5-2:amd64 (1.21.3-3) ... Setting up libreadline8t64:amd64 (8.2-5) ... Setting up dh-strip-nondeterminism (1.14.0-1) ... Setting up libjs-jquery-tablesorter (1:2.31.3+dfsg1-4) ... Setting up groff-base (1.23.0-5) ... Setting up libpython3.13-stdlib:amd64 (3.13.0-2) ... Setting up libtirpc3t64:amd64 (1.3.4+ds-1.3+b1) ... Setting up python3.13 (3.13.0-2) ... Setting up po-debconf (1.0.21+nmu1) ... Setting up man-db (2.13.0-1) ... Not building database; man-db/auto-update is not 'true'. Setting up libnsl2:amd64 (1.3.0-3+b3) ... Setting up libpython3.12-stdlib:amd64 (3.12.7-3) ... Setting up python3.12 (3.12.7-3) ... Setting up debhelper (13.20) ... Setting up libpython3-stdlib:amd64 (3.12.7-1) ... Setting up python3 (3.12.7-1) ... Setting up python3-zipp (3.21.0-1) ... Setting up python3-autocommand (2.2.2-3) ... Setting up python3-multidict (6.1.0-1+b1) ... Setting up python3-frozenlist (1.5.0-1+b1) ... Setting up python3-aiosignal (1.3.1-1) ... Setting up python3-async-timeout (5.0.1-1) ... Setting up python3-packaging (24.2-1) ... Setting up python3-idna (3.8-2) ... Setting up python3-typing-extensions (4.12.2-2) ... Setting up python3-aiohappyeyeballs (2.4.3-1) ... Setting up python3-pluggy (1.5.0-1) ... Setting up python3-voluptuous (0.14.2-1) ... Setting up python3-yarl (1.13.1-1+b1) ... Setting up python3-more-itertools (10.5.0-1) ... Setting up python3-iniconfig (1.1.1-2) ... Setting up python3-attr (24.2.0-1) ... Setting up python3-jaraco.functools (4.1.0-1) ... Setting up python3-async-generator (1.10-4) ... Setting up python3-jaraco.context (6.0.0-1) ... Setting up python3-defusedxml (0.7.1-2) ... Setting up python3-pytest (8.3.3-1) ... Setting up python3-typeguard (4.4.1-1) ... Setting up python3-aiohttp (3.10.10-2) ... Setting up python3-all (3.12.7-1) ... Setting up python3-coverage (7.6.0+dfsg1-2+b1) ... Setting up python3-pytest-cov (5.0.0-1) ... Setting up python3-inflect (7.3.1-2) ... Setting up python3-jaraco.text (4.0.0-1) ... Setting up python3-pytest-asyncio (0.24.0a1-1) ... Setting up python3-pkg-resources (75.2.0-1) ... Setting up python3-pytest-aiohttp (1.0.5-1) ... Setting up python3-setuptools (75.2.0-1) ... Setting up python3-didl-lite (1.4.1-1) ... Setting up dh-python (6.20241024) ... Processing triggers for libc-bin (2.40-3) ... Reading package lists... Building dependency tree... Reading state information... Reading extended state information... Initializing package states... Writing extended state information... Building tag database... -> Finished parsing the build-deps I: Building the package I: Running cd /build/reproducible-path/async-upnp-client-0.40.0/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-genchanges -S > ../async-upnp-client_0.40.0-1_source.changes dpkg-buildpackage: info: source package async-upnp-client dpkg-buildpackage: info: source version 0.40.0-1 dpkg-buildpackage: info: source distribution unstable dpkg-buildpackage: info: source changed by Edward Betts dpkg-source --before-build . dpkg-buildpackage: info: host architecture amd64 debian/rules clean dh clean --buildsystem=pybuild debian/rules override_dh_auto_clean make[1]: Entering directory '/build/reproducible-path/async-upnp-client-0.40.0' dh_auto_clean I: pybuild base:311: python3.13 setup.py clean /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running clean removing '/build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build' (and everything under it) 'build/bdist.linux-x86_64' does not exist -- can't clean it 'build/scripts-3.13' does not exist -- can't clean it I: pybuild base:311: python3.12 setup.py clean /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running clean removing '/build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build' (and everything under it) 'build/bdist.linux-x86_64' does not exist -- can't clean it 'build/scripts-3.12' does not exist -- can't clean it rm -rf async_upnp_client.egg-info/ make[1]: Leaving directory '/build/reproducible-path/async-upnp-client-0.40.0' dh_autoreconf_clean -O--buildsystem=pybuild dh_clean -O--buildsystem=pybuild debian/rules binary dh binary --buildsystem=pybuild dh_update_autotools_config -O--buildsystem=pybuild dh_autoreconf -O--buildsystem=pybuild dh_auto_configure -O--buildsystem=pybuild I: pybuild base:311: python3.13 setup.py config /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running config I: pybuild base:311: python3.12 setup.py config /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running config dh_auto_build -O--buildsystem=pybuild I: pybuild base:311: /usr/bin/python3.13 setup.py build /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running build running build_py creating /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/client.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/advertisement.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/aiohttp.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/device_updater.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/exceptions.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/__init__.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/const.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/event_handler.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/client_factory.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/description_cache.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/server.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/search.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/ssdp.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/ssdp_listener.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/cli.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/utils.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client creating /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/igd.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/__init__.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/profile.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/printer.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/dlna.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/py.typed -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client I: pybuild base:311: /usr/bin/python3 setup.py build /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running build running build_py creating /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/client.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/advertisement.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/aiohttp.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/device_updater.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/exceptions.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/__init__.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/const.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/event_handler.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/client_factory.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/description_cache.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/server.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/search.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/ssdp.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/ssdp_listener.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/cli.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/utils.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client creating /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/igd.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/__init__.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/profile.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/printer.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/dlna.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/py.typed -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client dh_auto_test -O--buildsystem=pybuild I: pybuild base:311: cd /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build; python3.13 -m pytest -k "not test_get_local_ip and not test_async_get_local_ip" /usr/lib/python3/dist-packages/pytest_asyncio/plugin.py:208: PytestDeprecationWarning: The configuration option "asyncio_default_fixture_loop_scope" is unset. The event loop scope for asynchronous fixtures will default to the fixture caching scope. Future versions of pytest-asyncio will default the loop scope for asynchronous fixtures to function scope. Set the default fixture loop scope explicitly in order to avoid unexpected behavior in the future. Valid fixture loop scopes are: "function", "class", "module", "package", "session" warnings.warn(PytestDeprecationWarning(_DEFAULT_FIXTURE_LOOP_SCOPE_UNSET)) ============================= test session starts ============================== platform linux -- Python 3.13.0, pytest-8.3.3, pluggy-1.5.0 rootdir: /build/reproducible-path/async-upnp-client-0.40.0 plugins: asyncio-0.24.0a1, cov-5.0.0, typeguard-4.4.1, aiohttp-1.0.5 asyncio: mode=Mode.STRICT, default_loop_scope=None collected 156 items / 14 deselected / 142 selected tests/profiles/test_dlna_dmr.py ................ [ 11%] tests/profiles/test_dlna_dms.py .. [ 12%] tests/profiles/test_igd.py ..... [ 16%] tests/profiles/test_profile.py .............. [ 26%] tests/test_advertisement.py .... [ 28%] tests/test_aiohttp.py ... [ 30%] tests/test_client.py ........................................ [ 59%] tests/test_description_cache.py ...... [ 63%] tests/test_event_handler.py ....... [ 68%] tests/test_search.py ... [ 70%] tests/test_server.py ... [ 72%] tests/test_ssdp.py .............. [ 82%] tests/test_ssdp_listener.py FFFFFFFFFFF.FFFFFFF [ 95%] tests/test_utils.py ...... [100%] =================================== FAILURES =================================== _________________________ test_see_advertisement_alive _________________________ @pytest.mark.asyncio async def test_see_advertisement_alive() -> None: """Test seeing a device through an ssdp:alive-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:87: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ________________________ test_see_advertisement_byebye _________________________ @pytest.mark.asyncio async def test_see_advertisement_byebye() -> None: """Test seeing a device through an ssdp:byebye-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ________________________ test_see_advertisement_update _________________________ @pytest.mark.asyncio async def test_see_advertisement_update() -> None: """Test seeing a device through a ssdp:update-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:170: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______________________________ test_see_search ________________________________ @pytest.mark.asyncio async def test_see_search() -> None: """Test seeing a device through an search.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:208: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________________ test_see_search_sync _____________________________ @pytest.mark.asyncio async def test_see_search_sync() -> None: """Test seeing a device through an search.""" # pylint: disable=protected-access callback = Mock() listener = SsdpListener(callback=callback) > await listener.async_start() tests/test_ssdp_listener.py:243: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError __________________________ test_see_search_then_alive __________________________ @pytest.mark.asyncio async def test_see_search_then_alive() -> None: """Test seeing a device through a search, then a ssdp:alive-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:278: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_then_update __________________________ @pytest.mark.asyncio async def test_see_search_then_update() -> None: """Test seeing a device through a search, then a ssdp:update-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:310: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_then_byebye __________________________ @pytest.mark.asyncio async def test_see_search_then_byebye() -> None: """Test seeing a device through a search, then a ssdp:byebye-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:346: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ____________________ test_see_search_then_byebye_then_alive ____________________ @pytest.mark.asyncio async def test_see_search_then_byebye_then_alive() -> None: """Test seeing a device by search, then ssdp:byebye, then ssdp:alive.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:382: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ______________________________ test_purge_devices ______________________________ @pytest.mark.asyncio async def test_purge_devices() -> None: """Test if a device is purged when it times out given the value of the CACHE-CONTROL header.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:432: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________________ test_purge_devices_2 _____________________________ @pytest.mark.asyncio async def test_purge_devices_2() -> None: """Test if a device is purged when it times out, part 2.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:460: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_invalid_usn __________________________ @pytest.mark.asyncio async def test_see_search_invalid_usn() -> None: """Test invalid USN is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:545: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______________________ test_see_search_invalid_location _______________________ @pytest.mark.asyncio async def test_see_search_invalid_location() -> None: """Test headers with invalid location is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:568: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____ test_see_search_localhost_location[http://127.0.0.1:1234/device.xml] _____ location = 'http://127.0.0.1:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______ test_see_search_localhost_location[http://[::1]:1234/device.xml] _______ location = 'http://[::1]:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ___ test_see_search_localhost_location[http://169.254.12.1:1234/device.xml] ____ location = 'http://169.254.12.1:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ____________________________ test_combined_headers _____________________________ @pytest.mark.asyncio async def test_combined_headers() -> None: """Test combined headers.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:616: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________ test_see_search_device_ipv4_and_ipv6 _____________________ @pytest.mark.asyncio async def test_see_search_device_ipv4_and_ipv6() -> None: """Test seeing the same device via IPv4, then via IPv6.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:686: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError =============================== warnings summary =============================== .pybuild/cpython3_3.13_async-upnp-client/build/tests/test_server.py::test_init .pybuild/cpython3_3.13_async-upnp-client/build/tests/test_server.py::test_action .pybuild/cpython3_3.13_async-upnp-client/build/tests/test_server.py::test_subscribe /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/server.py:291: DeprecationWarning: Testing an element's truth value will always return True in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. if not thing or not hasattr(thing, "__upnp_action__"): .pybuild/cpython3_3.13_async-upnp-client/build/tests/test_server.py::test_action /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/server.py:1081: DeprecationWarning: Testing an element's truth value will always return True in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. assert body_el -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED tests/test_ssdp_listener.py::test_see_advertisement_alive - OSError: [... FAILED tests/test_ssdp_listener.py::test_see_advertisement_byebye - OSError: ... FAILED tests/test_ssdp_listener.py::test_see_advertisement_update - OSError: ... FAILED tests/test_ssdp_listener.py::test_see_search - OSError: [Errno 19] No ... FAILED tests/test_ssdp_listener.py::test_see_search_sync - OSError: [Errno 19... FAILED tests/test_ssdp_listener.py::test_see_search_then_alive - OSError: [Er... FAILED tests/test_ssdp_listener.py::test_see_search_then_update - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_then_byebye - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_then_byebye_then_alive - ... FAILED tests/test_ssdp_listener.py::test_purge_devices - OSError: [Errno 19] ... FAILED tests/test_ssdp_listener.py::test_purge_devices_2 - OSError: [Errno 19... FAILED tests/test_ssdp_listener.py::test_see_search_invalid_usn - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_invalid_location - OSErro... FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://127.0.0.1:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://[::1]:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://169.254.12.1:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_combined_headers - OSError: [Errno 1... FAILED tests/test_ssdp_listener.py::test_see_search_device_ipv4_and_ipv6 - OS... ========== 18 failed, 124 passed, 14 deselected, 4 warnings in 13.38s ========== E: pybuild pybuild:389: test: plugin distutils failed with: exit code=1: cd /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build; python3.13 -m pytest -k "not test_get_local_ip and not test_async_get_local_ip" I: pybuild base:311: cd /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build; python3.12 -m pytest -k "not test_get_local_ip and not test_async_get_local_ip" /usr/lib/python3/dist-packages/pytest_asyncio/plugin.py:208: PytestDeprecationWarning: The configuration option "asyncio_default_fixture_loop_scope" is unset. The event loop scope for asynchronous fixtures will default to the fixture caching scope. Future versions of pytest-asyncio will default the loop scope for asynchronous fixtures to function scope. Set the default fixture loop scope explicitly in order to avoid unexpected behavior in the future. Valid fixture loop scopes are: "function", "class", "module", "package", "session" warnings.warn(PytestDeprecationWarning(_DEFAULT_FIXTURE_LOOP_SCOPE_UNSET)) ============================= test session starts ============================== platform linux -- Python 3.12.7, pytest-8.3.3, pluggy-1.5.0 rootdir: /build/reproducible-path/async-upnp-client-0.40.0 plugins: asyncio-0.24.0a1, cov-5.0.0, typeguard-4.4.1, aiohttp-1.0.5 asyncio: mode=Mode.STRICT, default_loop_scope=None collected 156 items / 14 deselected / 142 selected tests/profiles/test_dlna_dmr.py ................ [ 11%] tests/profiles/test_dlna_dms.py .. [ 12%] tests/profiles/test_igd.py ..... [ 16%] tests/profiles/test_profile.py .............. [ 26%] tests/test_advertisement.py .... [ 28%] tests/test_aiohttp.py ... [ 30%] tests/test_client.py ........................................ [ 59%] tests/test_description_cache.py ...... [ 63%] tests/test_event_handler.py ....... [ 68%] tests/test_search.py ... [ 70%] tests/test_server.py ... [ 72%] tests/test_ssdp.py .............. [ 82%] tests/test_ssdp_listener.py FFFFFFFFFFF.FFFFFFF [ 95%] tests/test_utils.py ...... [100%] =================================== FAILURES =================================== _________________________ test_see_advertisement_alive _________________________ @pytest.mark.asyncio async def test_see_advertisement_alive() -> None: """Test seeing a device through an ssdp:alive-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:87: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ________________________ test_see_advertisement_byebye _________________________ @pytest.mark.asyncio async def test_see_advertisement_byebye() -> None: """Test seeing a device through an ssdp:byebye-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ________________________ test_see_advertisement_update _________________________ @pytest.mark.asyncio async def test_see_advertisement_update() -> None: """Test seeing a device through a ssdp:update-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:170: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______________________________ test_see_search ________________________________ @pytest.mark.asyncio async def test_see_search() -> None: """Test seeing a device through an search.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:208: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________________ test_see_search_sync _____________________________ @pytest.mark.asyncio async def test_see_search_sync() -> None: """Test seeing a device through an search.""" # pylint: disable=protected-access callback = Mock() listener = SsdpListener(callback=callback) > await listener.async_start() tests/test_ssdp_listener.py:243: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError __________________________ test_see_search_then_alive __________________________ @pytest.mark.asyncio async def test_see_search_then_alive() -> None: """Test seeing a device through a search, then a ssdp:alive-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:278: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_then_update __________________________ @pytest.mark.asyncio async def test_see_search_then_update() -> None: """Test seeing a device through a search, then a ssdp:update-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:310: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_then_byebye __________________________ @pytest.mark.asyncio async def test_see_search_then_byebye() -> None: """Test seeing a device through a search, then a ssdp:byebye-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:346: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ____________________ test_see_search_then_byebye_then_alive ____________________ @pytest.mark.asyncio async def test_see_search_then_byebye_then_alive() -> None: """Test seeing a device by search, then ssdp:byebye, then ssdp:alive.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:382: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ______________________________ test_purge_devices ______________________________ @pytest.mark.asyncio async def test_purge_devices() -> None: """Test if a device is purged when it times out given the value of the CACHE-CONTROL header.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:432: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________________ test_purge_devices_2 _____________________________ @pytest.mark.asyncio async def test_purge_devices_2() -> None: """Test if a device is purged when it times out, part 2.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:460: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_invalid_usn __________________________ @pytest.mark.asyncio async def test_see_search_invalid_usn() -> None: """Test invalid USN is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:545: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______________________ test_see_search_invalid_location _______________________ @pytest.mark.asyncio async def test_see_search_invalid_location() -> None: """Test headers with invalid location is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:568: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____ test_see_search_localhost_location[http://127.0.0.1:1234/device.xml] _____ location = 'http://127.0.0.1:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______ test_see_search_localhost_location[http://[::1]:1234/device.xml] _______ location = 'http://[::1]:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ___ test_see_search_localhost_location[http://169.254.12.1:1234/device.xml] ____ location = 'http://169.254.12.1:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ____________________________ test_combined_headers _____________________________ @pytest.mark.asyncio async def test_combined_headers() -> None: """Test combined headers.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:616: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________ test_see_search_device_ipv4_and_ipv6 _____________________ @pytest.mark.asyncio async def test_see_search_device_ipv4_and_ipv6() -> None: """Test seeing the same device via IPv4, then via IPv6.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:686: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError =============================== warnings summary =============================== .pybuild/cpython3_3.12_async-upnp-client/build/tests/test_server.py::test_init .pybuild/cpython3_3.12_async-upnp-client/build/tests/test_server.py::test_action .pybuild/cpython3_3.12_async-upnp-client/build/tests/test_server.py::test_subscribe /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/server.py:291: DeprecationWarning: Testing an element's truth value will always return True in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. if not thing or not hasattr(thing, "__upnp_action__"): .pybuild/cpython3_3.12_async-upnp-client/build/tests/test_server.py::test_action /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/server.py:1081: DeprecationWarning: Testing an element's truth value will always return True in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. assert body_el -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED tests/test_ssdp_listener.py::test_see_advertisement_alive - OSError: [... FAILED tests/test_ssdp_listener.py::test_see_advertisement_byebye - OSError: ... FAILED tests/test_ssdp_listener.py::test_see_advertisement_update - OSError: ... FAILED tests/test_ssdp_listener.py::test_see_search - OSError: [Errno 19] No ... FAILED tests/test_ssdp_listener.py::test_see_search_sync - OSError: [Errno 19... FAILED tests/test_ssdp_listener.py::test_see_search_then_alive - OSError: [Er... FAILED tests/test_ssdp_listener.py::test_see_search_then_update - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_then_byebye - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_then_byebye_then_alive - ... FAILED tests/test_ssdp_listener.py::test_purge_devices - OSError: [Errno 19] ... FAILED tests/test_ssdp_listener.py::test_purge_devices_2 - OSError: [Errno 19... FAILED tests/test_ssdp_listener.py::test_see_search_invalid_usn - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_invalid_location - OSErro... FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://127.0.0.1:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://[::1]:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://169.254.12.1:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_combined_headers - OSError: [Errno 1... FAILED tests/test_ssdp_listener.py::test_see_search_device_ipv4_and_ipv6 - OS... ========== 18 failed, 124 passed, 14 deselected, 4 warnings in 15.10s ========== E: pybuild pybuild:389: test: plugin distutils failed with: exit code=1: cd /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build; python3.12 -m pytest -k "not test_get_local_ip and not test_async_get_local_ip" dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p "3.13 3.12" returned exit code 13 make: *** [debian/rules:8: binary] Error 25 dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2 I: copying local configuration E: Failed autobuilding of package I: unmounting dev/ptmx filesystem I: unmounting dev/pts filesystem I: unmounting dev/shm filesystem I: unmounting proc filesystem I: unmounting sys filesystem I: cleaning the build env I: removing directory /srv/workspace/pbuilder/1545202 and its subdirectories Starting cleanup. All cleanup done. Fri Nov 22 08:54:53 UTC 2024 - reproducible_build.sh stopped running as /tmp/jenkins-script-fXzae0sH, removing. /srv/reproducible-results/rbuild-debian/r-b-build.BQJy4ZlU: total 16 -rw-r--r-- 1 jenkins jenkins 2497 Aug 6 10:41 async-upnp-client_0.40.0-1.dsc drwxr-xr-x 2 jenkins jenkins 4096 Nov 22 08:54 b1 drwxr-xr-x 2 jenkins jenkins 4096 Nov 22 08:52 b2 -rw------- 1 jenkins jenkins 3671 Nov 22 08:52 rbuildlog.GGTh6B9 /srv/reproducible-results/rbuild-debian/r-b-build.BQJy4ZlU/b1: total 200 -rw-r--r-- 1 jenkins jenkins 203594 Nov 22 08:54 build.log /srv/reproducible-results/rbuild-debian/r-b-build.BQJy4ZlU/b2: total 0 Fri Nov 22 08:54:54 UTC 2024 I: Deleting $TMPDIR on ionos1-amd64.debian.net. I: pbuilder: network access will be disabled during build I: Current time: Thu Nov 21 20:52:26 -12 2024 I: pbuilder-time-stamp: 1732265546 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/unstable-reproducible-base.tgz] I: copying local configuration W: --override-config is not set; not updating apt.conf Read the manpage for details. I: mounting /proc filesystem I: mounting /sys filesystem I: creating /{dev,run}/shm I: mounting /dev/pts filesystem I: redirecting /dev/ptmx to /dev/pts/ptmx I: policy-rc.d already exists I: Copying source file I: copying [async-upnp-client_0.40.0-1.dsc] I: copying [./async-upnp-client_0.40.0.orig.tar.gz] I: copying [./async-upnp-client_0.40.0-1.debian.tar.xz] I: Extracting source gpgv: Signature made Tue Aug 6 10:34:01 2024 gpgv: using RSA key FB8ACFA78C726089C38AD0269605A1098C63B92A gpgv: Can't check signature: No public key dpkg-source: warning: cannot verify inline signature for ./async-upnp-client_0.40.0-1.dsc: no acceptable signature found dpkg-source: info: extracting async-upnp-client in async-upnp-client-0.40.0 dpkg-source: info: unpacking async-upnp-client_0.40.0.orig.tar.gz dpkg-source: info: unpacking async-upnp-client_0.40.0-1.debian.tar.xz I: Not using root during the build. I: Installing the build-deps I: user script /srv/workspace/pbuilder/1545202/tmp/hooks/D02_print_environment starting I: set BUILDDIR='/build/reproducible-path' BUILDUSERGECOS='first user,first room,first work-phone,first home-phone,first other' BUILDUSERNAME='pbuilder1' BUILD_ARCH='amd64' DEBIAN_FRONTEND='noninteractive' DEB_BUILD_OPTIONS='buildinfo=+all reproducible=+all parallel=20 ' DISTRIBUTION='unstable' HOME='/root' HOST_ARCH='amd64' IFS=' ' INVOCATION_ID='917a34b2f81b4e499357ae5318e63d81' LANG='C' LANGUAGE='en_US:en' LC_ALL='C' MAIL='/var/mail/root' OPTIND='1' PATH='/usr/sbin:/usr/bin:/sbin:/bin:/usr/games' PBCURRENTCOMMANDLINEOPERATION='build' PBUILDER_OPERATION='build' PBUILDER_PKGDATADIR='/usr/share/pbuilder' PBUILDER_PKGLIBDIR='/usr/lib/pbuilder' PBUILDER_SYSCONFDIR='/etc' PPID='1545202' PS1='# ' PS2='> ' PS4='+ ' PWD='/' SHELL='/bin/bash' SHLVL='2' SUDO_COMMAND='/usr/bin/timeout -k 18.1h 18h /usr/bin/ionice -c 3 /usr/bin/nice /usr/sbin/pbuilder --build --configfile /srv/reproducible-results/rbuild-debian/r-b-build.BQJy4ZlU/pbuilderrc_remt --distribution unstable --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/unstable-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.BQJy4ZlU/b1 --logfile b1/build.log async-upnp-client_0.40.0-1.dsc' SUDO_GID='110' SUDO_UID='105' SUDO_USER='jenkins' TERM='unknown' TZ='/usr/share/zoneinfo/Etc/GMT+12' USER='root' _='/usr/bin/systemd-run' http_proxy='http://46.16.76.132:3128' I: uname -a Linux ionos1-amd64 6.1.0-27-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.115-1 (2024-11-01) x86_64 GNU/Linux I: ls -l /bin lrwxrwxrwx 1 root root 7 Aug 4 21:30 /bin -> usr/bin I: user script /srv/workspace/pbuilder/1545202/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy Version: 0.invalid.0 Architecture: amd64 Maintainer: Debian Pbuilder Team Description: Dummy package to satisfy dependencies with aptitude - created by pbuilder This package was created automatically by pbuilder to satisfy the build-dependencies of the package being currently built. Depends: debhelper-compat (= 13), dh-sequence-python3, python3-all, python3-async-timeout, python3-defusedxml, python3-didl-lite, python3-pytest, python3-pytest-aiohttp, python3-pytest-asyncio, python3-pytest-cov, python3-setuptools, python3-voluptuous dpkg-deb: building package 'pbuilder-satisfydepends-dummy' in '/tmp/satisfydepends-aptitude/pbuilder-satisfydepends-dummy.deb'. Selecting previously unselected package pbuilder-satisfydepends-dummy. (Reading database ... 19966 files and directories currently installed.) Preparing to unpack .../pbuilder-satisfydepends-dummy.deb ... Unpacking pbuilder-satisfydepends-dummy (0.invalid.0) ... dpkg: pbuilder-satisfydepends-dummy: dependency problems, but configuring anyway as you requested: pbuilder-satisfydepends-dummy depends on debhelper-compat (= 13); however: Package debhelper-compat is not installed. pbuilder-satisfydepends-dummy depends on dh-sequence-python3; however: Package dh-sequence-python3 is not installed. pbuilder-satisfydepends-dummy depends on python3-all; however: Package python3-all is not installed. pbuilder-satisfydepends-dummy depends on python3-async-timeout; however: Package python3-async-timeout is not installed. pbuilder-satisfydepends-dummy depends on python3-defusedxml; however: Package python3-defusedxml is not installed. pbuilder-satisfydepends-dummy depends on python3-didl-lite; however: Package python3-didl-lite is not installed. pbuilder-satisfydepends-dummy depends on python3-pytest; however: Package python3-pytest is not installed. pbuilder-satisfydepends-dummy depends on python3-pytest-aiohttp; however: Package python3-pytest-aiohttp is not installed. pbuilder-satisfydepends-dummy depends on python3-pytest-asyncio; however: Package python3-pytest-asyncio is not installed. pbuilder-satisfydepends-dummy depends on python3-pytest-cov; however: Package python3-pytest-cov is not installed. pbuilder-satisfydepends-dummy depends on python3-setuptools; however: Package python3-setuptools is not installed. pbuilder-satisfydepends-dummy depends on python3-voluptuous; however: Package python3-voluptuous is not installed. Setting up pbuilder-satisfydepends-dummy (0.invalid.0) ... Reading package lists... Building dependency tree... Reading state information... Initializing package states... Writing extended state information... Building tag database... pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) The following NEW packages will be installed: autoconf{a} automake{a} autopoint{a} autotools-dev{a} bsdextrautils{a} debhelper{a} dh-autoreconf{a} dh-python{a} dh-strip-nondeterminism{a} dwz{a} file{a} gettext{a} gettext-base{a} groff-base{a} intltool-debian{a} libarchive-zip-perl{a} libcom-err2{a} libdebhelper-perl{a} libelf1t64{a} libexpat1{a} libfile-stripnondeterminism-perl{a} libgssapi-krb5-2{a} libicu72{a} libjs-jquery{a} libjs-jquery-hotkeys{a} libjs-jquery-isonscreen{a} libjs-jquery-metadata{a} libjs-jquery-tablesorter{a} libjs-jquery-throttle-debounce{a} libk5crypto3{a} libkeyutils1{a} libkrb5-3{a} libkrb5support0{a} libmagic-mgc{a} libmagic1t64{a} libnsl2{a} libpipeline1{a} libpython3-stdlib{a} libpython3.12-minimal{a} libpython3.12-stdlib{a} libpython3.13-minimal{a} libpython3.13-stdlib{a} libreadline8t64{a} libtirpc-common{a} libtirpc3t64{a} libtool{a} libuchardet0{a} libxml2{a} m4{a} man-db{a} media-types{a} netbase{a} po-debconf{a} python3{a} python3-aiohappyeyeballs{a} python3-aiohttp{a} python3-aiosignal{a} python3-all{a} python3-async-generator{a} python3-async-timeout{a} python3-attr{a} python3-autocommand{a} python3-coverage{a} python3-defusedxml{a} python3-didl-lite{a} python3-frozenlist{a} python3-idna{a} python3-inflect{a} python3-iniconfig{a} python3-jaraco.context{a} python3-jaraco.functools{a} python3-jaraco.text{a} python3-minimal{a} python3-more-itertools{a} python3-multidict{a} python3-packaging{a} python3-pkg-resources{a} python3-pluggy{a} python3-pytest{a} python3-pytest-aiohttp{a} python3-pytest-asyncio{a} python3-pytest-cov{a} python3-setuptools{a} python3-typeguard{a} python3-typing-extensions{a} python3-voluptuous{a} python3-yarl{a} python3-zipp{a} python3.12{a} python3.12-minimal{a} python3.13{a} python3.13-minimal{a} readline-common{a} sensible-utils{a} tzdata{a} The following packages are RECOMMENDED but will NOT be installed: ca-certificates curl javascript-common krb5-locales libarchive-cpio-perl libltdl-dev libmail-sendmail-perl lynx python3-aiodns python3-pygments wget 0 packages upgraded, 95 newly installed, 0 to remove and 0 not upgraded. Need to get 35.8 MB of archives. After unpacking 142 MB will be used. Writing extended state information... Get: 1 http://deb.debian.org/debian unstable/main amd64 libjs-jquery all 3.6.1+dfsg+~3.5.14-1 [326 kB] Get: 2 http://deb.debian.org/debian unstable/main amd64 libjs-jquery-hotkeys all 0~20130707+git2d51e3a9+dfsg-2.1 [11.5 kB] Get: 3 http://deb.debian.org/debian unstable/main amd64 libpython3.12-minimal amd64 3.12.7-3 [815 kB] Get: 4 http://deb.debian.org/debian unstable/main amd64 libexpat1 amd64 2.6.4-1 [106 kB] Get: 5 http://deb.debian.org/debian unstable/main amd64 python3.12-minimal amd64 3.12.7-3 [2162 kB] Get: 6 http://deb.debian.org/debian unstable/main amd64 python3-minimal amd64 3.12.7-1 [26.8 kB] Get: 7 http://deb.debian.org/debian unstable/main amd64 media-types all 10.1.0 [26.9 kB] Get: 8 http://deb.debian.org/debian unstable/main amd64 netbase all 6.4 [12.8 kB] Get: 9 http://deb.debian.org/debian unstable/main amd64 tzdata all 2024b-3 [255 kB] Get: 10 http://deb.debian.org/debian unstable/main amd64 libkrb5support0 amd64 1.21.3-3 [32.5 kB] Get: 11 http://deb.debian.org/debian unstable/main amd64 libcom-err2 amd64 1.47.1-1+b1 [23.2 kB] Get: 12 http://deb.debian.org/debian unstable/main amd64 libk5crypto3 amd64 1.21.3-3 [79.9 kB] Get: 13 http://deb.debian.org/debian unstable/main amd64 libkeyutils1 amd64 1.6.3-4 [9092 B] Get: 14 http://deb.debian.org/debian unstable/main amd64 libkrb5-3 amd64 1.21.3-3 [324 kB] Get: 15 http://deb.debian.org/debian unstable/main amd64 libgssapi-krb5-2 amd64 1.21.3-3 [136 kB] Get: 16 http://deb.debian.org/debian unstable/main amd64 libtirpc-common all 1.3.4+ds-1.3 [10.9 kB] Get: 17 http://deb.debian.org/debian unstable/main amd64 libtirpc3t64 amd64 1.3.4+ds-1.3+b1 [83.1 kB] Get: 18 http://deb.debian.org/debian unstable/main amd64 libnsl2 amd64 1.3.0-3+b3 [40.6 kB] Get: 19 http://deb.debian.org/debian unstable/main amd64 readline-common all 8.2-5 [69.3 kB] Get: 20 http://deb.debian.org/debian unstable/main amd64 libreadline8t64 amd64 8.2-5 [169 kB] Get: 21 http://deb.debian.org/debian unstable/main amd64 libpython3.12-stdlib amd64 3.12.7-3 [1966 kB] Get: 22 http://deb.debian.org/debian unstable/main amd64 python3.12 amd64 3.12.7-3 [671 kB] Get: 23 http://deb.debian.org/debian unstable/main amd64 libpython3-stdlib amd64 3.12.7-1 [9712 B] Get: 24 http://deb.debian.org/debian unstable/main amd64 python3 amd64 3.12.7-1 [27.8 kB] Get: 25 http://deb.debian.org/debian unstable/main amd64 libpython3.13-minimal amd64 3.13.0-2 [856 kB] Get: 26 http://deb.debian.org/debian unstable/main amd64 python3.13-minimal amd64 3.13.0-2 [2038 kB] Get: 27 http://deb.debian.org/debian unstable/main amd64 sensible-utils all 0.0.24 [24.8 kB] Get: 28 http://deb.debian.org/debian unstable/main amd64 libmagic-mgc amd64 1:5.45-3+b1 [314 kB] Get: 29 http://deb.debian.org/debian unstable/main amd64 libmagic1t64 amd64 1:5.45-3+b1 [108 kB] Get: 30 http://deb.debian.org/debian unstable/main amd64 file amd64 1:5.45-3+b1 [43.3 kB] Get: 31 http://deb.debian.org/debian unstable/main amd64 gettext-base amd64 0.22.5-2 [200 kB] Get: 32 http://deb.debian.org/debian unstable/main amd64 libuchardet0 amd64 0.0.8-1+b2 [68.9 kB] Get: 33 http://deb.debian.org/debian unstable/main amd64 groff-base amd64 1.23.0-5 [1181 kB] Get: 34 http://deb.debian.org/debian unstable/main amd64 bsdextrautils amd64 2.40.2-11 [91.5 kB] Get: 35 http://deb.debian.org/debian unstable/main amd64 libpipeline1 amd64 1.5.8-1 [42.0 kB] Get: 36 http://deb.debian.org/debian unstable/main amd64 man-db amd64 2.13.0-1 [1420 kB] Get: 37 http://deb.debian.org/debian unstable/main amd64 m4 amd64 1.4.19-4 [287 kB] Get: 38 http://deb.debian.org/debian unstable/main amd64 autoconf all 2.72-3 [493 kB] Get: 39 http://deb.debian.org/debian unstable/main amd64 autotools-dev all 20220109.1 [51.6 kB] Get: 40 http://deb.debian.org/debian unstable/main amd64 automake all 1:1.16.5-1.3 [823 kB] Get: 41 http://deb.debian.org/debian unstable/main amd64 autopoint all 0.22.5-2 [723 kB] Get: 42 http://deb.debian.org/debian unstable/main amd64 libdebhelper-perl all 13.20 [89.7 kB] Get: 43 http://deb.debian.org/debian unstable/main amd64 libtool all 2.4.7-8 [517 kB] Get: 44 http://deb.debian.org/debian unstable/main amd64 dh-autoreconf all 20 [17.1 kB] Get: 45 http://deb.debian.org/debian unstable/main amd64 libarchive-zip-perl all 1.68-1 [104 kB] Get: 46 http://deb.debian.org/debian unstable/main amd64 libfile-stripnondeterminism-perl all 1.14.0-1 [19.5 kB] Get: 47 http://deb.debian.org/debian unstable/main amd64 dh-strip-nondeterminism all 1.14.0-1 [8448 B] Get: 48 http://deb.debian.org/debian unstable/main amd64 libelf1t64 amd64 0.192-4 [189 kB] Get: 49 http://deb.debian.org/debian unstable/main amd64 dwz amd64 0.15-1+b1 [110 kB] Get: 50 http://deb.debian.org/debian unstable/main amd64 libicu72 amd64 72.1-5+b1 [9423 kB] Get: 51 http://deb.debian.org/debian unstable/main amd64 libxml2 amd64 2.12.7+dfsg+really2.9.14-0.2+b1 [699 kB] Get: 52 http://deb.debian.org/debian unstable/main amd64 gettext amd64 0.22.5-2 [1601 kB] Get: 53 http://deb.debian.org/debian unstable/main amd64 intltool-debian all 0.35.0+20060710.6 [22.9 kB] Get: 54 http://deb.debian.org/debian unstable/main amd64 po-debconf all 1.0.21+nmu1 [248 kB] Get: 55 http://deb.debian.org/debian unstable/main amd64 debhelper all 13.20 [915 kB] Get: 56 http://deb.debian.org/debian unstable/main amd64 python3-autocommand all 2.2.2-3 [13.6 kB] Get: 57 http://deb.debian.org/debian unstable/main amd64 python3-more-itertools all 10.5.0-1 [63.8 kB] Get: 58 http://deb.debian.org/debian unstable/main amd64 python3-typing-extensions all 4.12.2-2 [73.0 kB] Get: 59 http://deb.debian.org/debian unstable/main amd64 python3-typeguard all 4.4.1-1 [37.0 kB] Get: 60 http://deb.debian.org/debian unstable/main amd64 python3-inflect all 7.3.1-2 [32.4 kB] Get: 61 http://deb.debian.org/debian unstable/main amd64 python3-jaraco.context all 6.0.0-1 [7984 B] Get: 62 http://deb.debian.org/debian unstable/main amd64 python3-jaraco.functools all 4.1.0-1 [12.0 kB] Get: 63 http://deb.debian.org/debian unstable/main amd64 python3-pkg-resources all 75.2.0-1 [213 kB] Get: 64 http://deb.debian.org/debian unstable/main amd64 python3-jaraco.text all 4.0.0-1 [11.4 kB] Get: 65 http://deb.debian.org/debian unstable/main amd64 python3-zipp all 3.21.0-1 [10.6 kB] Get: 66 http://deb.debian.org/debian unstable/main amd64 python3-setuptools all 75.2.0-1 [731 kB] Get: 67 http://deb.debian.org/debian unstable/main amd64 dh-python all 6.20241024 [109 kB] Get: 68 http://deb.debian.org/debian unstable/main amd64 libjs-jquery-isonscreen all 1.2.0-1.1 [3196 B] Get: 69 http://deb.debian.org/debian unstable/main amd64 libjs-jquery-metadata all 12-4 [6532 B] Get: 70 http://deb.debian.org/debian unstable/main amd64 libjs-jquery-tablesorter all 1:2.31.3+dfsg1-4 [184 kB] Get: 71 http://deb.debian.org/debian unstable/main amd64 libjs-jquery-throttle-debounce all 1.1+dfsg.1-2 [12.2 kB] Get: 72 http://deb.debian.org/debian unstable/main amd64 libpython3.13-stdlib amd64 3.13.0-2 [1992 kB] Get: 73 http://deb.debian.org/debian unstable/main amd64 python3-aiohappyeyeballs all 2.4.3-1 [13.3 kB] Get: 74 http://deb.debian.org/debian unstable/main amd64 python3-idna all 3.8-2 [41.6 kB] Get: 75 http://deb.debian.org/debian unstable/main amd64 python3-multidict amd64 6.1.0-1+b1 [39.8 kB] Get: 76 http://deb.debian.org/debian unstable/main amd64 python3-yarl amd64 1.13.1-1+b1 [118 kB] Get: 77 http://deb.debian.org/debian unstable/main amd64 python3-async-timeout all 5.0.1-1 [8324 B] Get: 78 http://deb.debian.org/debian unstable/main amd64 python3-frozenlist amd64 1.5.0-1+b1 [58.6 kB] Get: 79 http://deb.debian.org/debian unstable/main amd64 python3-aiosignal all 1.3.1-1 [6016 B] Get: 80 http://deb.debian.org/debian unstable/main amd64 python3-attr all 24.2.0-1 [68.4 kB] Get: 81 http://deb.debian.org/debian unstable/main amd64 python3-aiohttp amd64 3.10.10-2 [364 kB] Get: 82 http://deb.debian.org/debian unstable/main amd64 python3.13 amd64 3.13.0-2 [730 kB] Get: 83 http://deb.debian.org/debian unstable/main amd64 python3-all amd64 3.12.7-1 [1052 B] Get: 84 http://deb.debian.org/debian unstable/main amd64 python3-async-generator all 1.10-4 [17.4 kB] Get: 85 http://deb.debian.org/debian unstable/main amd64 python3-coverage amd64 7.6.0+dfsg1-2+b1 [177 kB] Get: 86 http://deb.debian.org/debian unstable/main amd64 python3-defusedxml all 0.7.1-2 [43.3 kB] Get: 87 http://deb.debian.org/debian unstable/main amd64 python3-didl-lite all 1.4.1-1 [10.8 kB] Get: 88 http://deb.debian.org/debian unstable/main amd64 python3-iniconfig all 1.1.1-2 [6396 B] Get: 89 http://deb.debian.org/debian unstable/main amd64 python3-packaging all 24.2-1 [55.3 kB] Get: 90 http://deb.debian.org/debian unstable/main amd64 python3-pluggy all 1.5.0-1 [26.9 kB] Get: 91 http://deb.debian.org/debian unstable/main amd64 python3-pytest all 8.3.3-1 [249 kB] Get: 92 http://deb.debian.org/debian unstable/main amd64 python3-pytest-asyncio all 0.24.0a1-1 [15.6 kB] Get: 93 http://deb.debian.org/debian unstable/main amd64 python3-pytest-aiohttp all 1.0.5-1 [5676 B] Get: 94 http://deb.debian.org/debian unstable/main amd64 python3-pytest-cov all 5.0.0-1 [26.8 kB] Get: 95 http://deb.debian.org/debian unstable/main amd64 python3-voluptuous all 0.14.2-1 [45.8 kB] Fetched 35.8 MB in 1s (59.3 MB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libjs-jquery. (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 ... 19966 files and directories currently installed.) Preparing to unpack .../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-jquery-hotkeys. Preparing to unpack .../libjs-jquery-hotkeys_0~20130707+git2d51e3a9+dfsg-2.1_all.deb ... Unpacking libjs-jquery-hotkeys (0~20130707+git2d51e3a9+dfsg-2.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 ... (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 ... 20312 files and directories currently installed.) Preparing to unpack .../00-python3-minimal_3.12.7-1_amd64.deb ... Unpacking python3-minimal (3.12.7-1) ... Selecting previously unselected package media-types. Preparing to unpack .../01-media-types_10.1.0_all.deb ... Unpacking media-types (10.1.0) ... Selecting previously unselected package netbase. Preparing to unpack .../02-netbase_6.4_all.deb ... Unpacking netbase (6.4) ... Selecting previously unselected package tzdata. Preparing to unpack .../03-tzdata_2024b-3_all.deb ... Unpacking tzdata (2024b-3) ... Selecting previously unselected package libkrb5support0:amd64. Preparing to unpack .../04-libkrb5support0_1.21.3-3_amd64.deb ... Unpacking libkrb5support0:amd64 (1.21.3-3) ... Selecting previously unselected package libcom-err2:amd64. Preparing to unpack .../05-libcom-err2_1.47.1-1+b1_amd64.deb ... Unpacking libcom-err2:amd64 (1.47.1-1+b1) ... Selecting previously unselected package libk5crypto3:amd64. Preparing to unpack .../06-libk5crypto3_1.21.3-3_amd64.deb ... Unpacking libk5crypto3:amd64 (1.21.3-3) ... Selecting previously unselected package libkeyutils1:amd64. Preparing to unpack .../07-libkeyutils1_1.6.3-4_amd64.deb ... Unpacking libkeyutils1:amd64 (1.6.3-4) ... Selecting previously unselected package libkrb5-3:amd64. Preparing to unpack .../08-libkrb5-3_1.21.3-3_amd64.deb ... Unpacking libkrb5-3:amd64 (1.21.3-3) ... Selecting previously unselected package libgssapi-krb5-2:amd64. Preparing to unpack .../09-libgssapi-krb5-2_1.21.3-3_amd64.deb ... Unpacking libgssapi-krb5-2:amd64 (1.21.3-3) ... Selecting previously unselected package libtirpc-common. Preparing to unpack .../10-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 .../11-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 .../12-libnsl2_1.3.0-3+b3_amd64.deb ... Unpacking libnsl2:amd64 (1.3.0-3+b3) ... Selecting previously unselected package readline-common. Preparing to unpack .../13-readline-common_8.2-5_all.deb ... Unpacking readline-common (8.2-5) ... Selecting previously unselected package libreadline8t64:amd64. Preparing to unpack .../14-libreadline8t64_8.2-5_amd64.deb ... Adding 'diversion of /lib/x86_64-linux-gnu/libhistory.so.8 to /lib/x86_64-linux-gnu/libhistory.so.8.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libhistory.so.8.2 to /lib/x86_64-linux-gnu/libhistory.so.8.2.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libreadline.so.8 to /lib/x86_64-linux-gnu/libreadline.so.8.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libreadline.so.8.2 to /lib/x86_64-linux-gnu/libreadline.so.8.2.usr-is-merged by libreadline8t64' Unpacking libreadline8t64:amd64 (8.2-5) ... Selecting previously unselected package libpython3.12-stdlib:amd64. Preparing to unpack .../15-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 .../16-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 .../17-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 ... (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 ... 21374 files and directories currently installed.) Preparing to unpack .../00-python3_3.12.7-1_amd64.deb ... Unpacking python3 (3.12.7-1) ... Selecting previously unselected package libpython3.13-minimal:amd64. Preparing to unpack .../01-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 .../02-python3.13-minimal_3.13.0-2_amd64.deb ... Unpacking python3.13-minimal (3.13.0-2) ... Selecting previously unselected package sensible-utils. Preparing to unpack .../03-sensible-utils_0.0.24_all.deb ... Unpacking sensible-utils (0.0.24) ... Selecting previously unselected package libmagic-mgc. Preparing to unpack .../04-libmagic-mgc_1%3a5.45-3+b1_amd64.deb ... Unpacking libmagic-mgc (1:5.45-3+b1) ... Selecting previously unselected package libmagic1t64:amd64. Preparing to unpack .../05-libmagic1t64_1%3a5.45-3+b1_amd64.deb ... Unpacking libmagic1t64:amd64 (1:5.45-3+b1) ... Selecting previously unselected package file. Preparing to unpack .../06-file_1%3a5.45-3+b1_amd64.deb ... Unpacking file (1:5.45-3+b1) ... Selecting previously unselected package gettext-base. Preparing to unpack .../07-gettext-base_0.22.5-2_amd64.deb ... Unpacking gettext-base (0.22.5-2) ... Selecting previously unselected package libuchardet0:amd64. Preparing to unpack .../08-libuchardet0_0.0.8-1+b2_amd64.deb ... Unpacking libuchardet0:amd64 (0.0.8-1+b2) ... Selecting previously unselected package groff-base. Preparing to unpack .../09-groff-base_1.23.0-5_amd64.deb ... Unpacking groff-base (1.23.0-5) ... Selecting previously unselected package bsdextrautils. Preparing to unpack .../10-bsdextrautils_2.40.2-11_amd64.deb ... Unpacking bsdextrautils (2.40.2-11) ... Selecting previously unselected package libpipeline1:amd64. Preparing to unpack .../11-libpipeline1_1.5.8-1_amd64.deb ... Unpacking libpipeline1:amd64 (1.5.8-1) ... Selecting previously unselected package man-db. Preparing to unpack .../12-man-db_2.13.0-1_amd64.deb ... Unpacking man-db (2.13.0-1) ... Selecting previously unselected package m4. Preparing to unpack .../13-m4_1.4.19-4_amd64.deb ... Unpacking m4 (1.4.19-4) ... Selecting previously unselected package autoconf. Preparing to unpack .../14-autoconf_2.72-3_all.deb ... Unpacking autoconf (2.72-3) ... Selecting previously unselected package autotools-dev. Preparing to unpack .../15-autotools-dev_20220109.1_all.deb ... Unpacking autotools-dev (20220109.1) ... Selecting previously unselected package automake. Preparing to unpack .../16-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 .../17-autopoint_0.22.5-2_all.deb ... Unpacking autopoint (0.22.5-2) ... Selecting previously unselected package libdebhelper-perl. Preparing to unpack .../18-libdebhelper-perl_13.20_all.deb ... Unpacking libdebhelper-perl (13.20) ... Selecting previously unselected package libtool. Preparing to unpack .../19-libtool_2.4.7-8_all.deb ... Unpacking libtool (2.4.7-8) ... Selecting previously unselected package dh-autoreconf. Preparing to unpack .../20-dh-autoreconf_20_all.deb ... Unpacking dh-autoreconf (20) ... Selecting previously unselected package libarchive-zip-perl. Preparing to unpack .../21-libarchive-zip-perl_1.68-1_all.deb ... Unpacking libarchive-zip-perl (1.68-1) ... Selecting previously unselected package libfile-stripnondeterminism-perl. Preparing to unpack .../22-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 .../23-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 .../24-libelf1t64_0.192-4_amd64.deb ... Unpacking libelf1t64:amd64 (0.192-4) ... Selecting previously unselected package dwz. Preparing to unpack .../25-dwz_0.15-1+b1_amd64.deb ... Unpacking dwz (0.15-1+b1) ... Selecting previously unselected package libicu72:amd64. Preparing to unpack .../26-libicu72_72.1-5+b1_amd64.deb ... Unpacking libicu72:amd64 (72.1-5+b1) ... Selecting previously unselected package libxml2:amd64. Preparing to unpack .../27-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) ... Selecting previously unselected package gettext. Preparing to unpack .../28-gettext_0.22.5-2_amd64.deb ... Unpacking gettext (0.22.5-2) ... Selecting previously unselected package intltool-debian. Preparing to unpack .../29-intltool-debian_0.35.0+20060710.6_all.deb ... Unpacking intltool-debian (0.35.0+20060710.6) ... Selecting previously unselected package po-debconf. Preparing to unpack .../30-po-debconf_1.0.21+nmu1_all.deb ... Unpacking po-debconf (1.0.21+nmu1) ... Selecting previously unselected package debhelper. Preparing to unpack .../31-debhelper_13.20_all.deb ... Unpacking debhelper (13.20) ... Selecting previously unselected package python3-autocommand. Preparing to unpack .../32-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 .../33-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 .../34-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 .../35-python3-typeguard_4.4.1-1_all.deb ... Unpacking python3-typeguard (4.4.1-1) ... Selecting previously unselected package python3-inflect. Preparing to unpack .../36-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 .../37-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 .../38-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 .../39-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 .../40-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 .../41-python3-zipp_3.21.0-1_all.deb ... Unpacking python3-zipp (3.21.0-1) ... Selecting previously unselected package python3-setuptools. Preparing to unpack .../42-python3-setuptools_75.2.0-1_all.deb ... Unpacking python3-setuptools (75.2.0-1) ... Selecting previously unselected package dh-python. Preparing to unpack .../43-dh-python_6.20241024_all.deb ... Unpacking dh-python (6.20241024) ... Selecting previously unselected package libjs-jquery-isonscreen. Preparing to unpack .../44-libjs-jquery-isonscreen_1.2.0-1.1_all.deb ... Unpacking libjs-jquery-isonscreen (1.2.0-1.1) ... Selecting previously unselected package libjs-jquery-metadata. Preparing to unpack .../45-libjs-jquery-metadata_12-4_all.deb ... Unpacking libjs-jquery-metadata (12-4) ... Selecting previously unselected package libjs-jquery-tablesorter. Preparing to unpack .../46-libjs-jquery-tablesorter_1%3a2.31.3+dfsg1-4_all.deb ... Unpacking libjs-jquery-tablesorter (1:2.31.3+dfsg1-4) ... Selecting previously unselected package libjs-jquery-throttle-debounce. Preparing to unpack .../47-libjs-jquery-throttle-debounce_1.1+dfsg.1-2_all.deb ... Unpacking libjs-jquery-throttle-debounce (1.1+dfsg.1-2) ... Selecting previously unselected package libpython3.13-stdlib:amd64. Preparing to unpack .../48-libpython3.13-stdlib_3.13.0-2_amd64.deb ... Unpacking libpython3.13-stdlib:amd64 (3.13.0-2) ... Selecting previously unselected package python3-aiohappyeyeballs. Preparing to unpack .../49-python3-aiohappyeyeballs_2.4.3-1_all.deb ... Unpacking python3-aiohappyeyeballs (2.4.3-1) ... Selecting previously unselected package python3-idna. Preparing to unpack .../50-python3-idna_3.8-2_all.deb ... Unpacking python3-idna (3.8-2) ... Selecting previously unselected package python3-multidict. Preparing to unpack .../51-python3-multidict_6.1.0-1+b1_amd64.deb ... Unpacking python3-multidict (6.1.0-1+b1) ... Selecting previously unselected package python3-yarl. Preparing to unpack .../52-python3-yarl_1.13.1-1+b1_amd64.deb ... Unpacking python3-yarl (1.13.1-1+b1) ... Selecting previously unselected package python3-async-timeout. Preparing to unpack .../53-python3-async-timeout_5.0.1-1_all.deb ... Unpacking python3-async-timeout (5.0.1-1) ... Selecting previously unselected package python3-frozenlist. Preparing to unpack .../54-python3-frozenlist_1.5.0-1+b1_amd64.deb ... Unpacking python3-frozenlist (1.5.0-1+b1) ... Selecting previously unselected package python3-aiosignal. Preparing to unpack .../55-python3-aiosignal_1.3.1-1_all.deb ... Unpacking python3-aiosignal (1.3.1-1) ... Selecting previously unselected package python3-attr. Preparing to unpack .../56-python3-attr_24.2.0-1_all.deb ... Unpacking python3-attr (24.2.0-1) ... Selecting previously unselected package python3-aiohttp. Preparing to unpack .../57-python3-aiohttp_3.10.10-2_amd64.deb ... Unpacking python3-aiohttp (3.10.10-2) ... Selecting previously unselected package python3.13. Preparing to unpack .../58-python3.13_3.13.0-2_amd64.deb ... Unpacking python3.13 (3.13.0-2) ... Selecting previously unselected package python3-all. Preparing to unpack .../59-python3-all_3.12.7-1_amd64.deb ... Unpacking python3-all (3.12.7-1) ... Selecting previously unselected package python3-async-generator. Preparing to unpack .../60-python3-async-generator_1.10-4_all.deb ... Unpacking python3-async-generator (1.10-4) ... Selecting previously unselected package python3-coverage. Preparing to unpack .../61-python3-coverage_7.6.0+dfsg1-2+b1_amd64.deb ... Unpacking python3-coverage (7.6.0+dfsg1-2+b1) ... Selecting previously unselected package python3-defusedxml. Preparing to unpack .../62-python3-defusedxml_0.7.1-2_all.deb ... Unpacking python3-defusedxml (0.7.1-2) ... Selecting previously unselected package python3-didl-lite. Preparing to unpack .../63-python3-didl-lite_1.4.1-1_all.deb ... Unpacking python3-didl-lite (1.4.1-1) ... Selecting previously unselected package python3-iniconfig. Preparing to unpack .../64-python3-iniconfig_1.1.1-2_all.deb ... Unpacking python3-iniconfig (1.1.1-2) ... Selecting previously unselected package python3-packaging. Preparing to unpack .../65-python3-packaging_24.2-1_all.deb ... Unpacking python3-packaging (24.2-1) ... Selecting previously unselected package python3-pluggy. Preparing to unpack .../66-python3-pluggy_1.5.0-1_all.deb ... Unpacking python3-pluggy (1.5.0-1) ... Selecting previously unselected package python3-pytest. Preparing to unpack .../67-python3-pytest_8.3.3-1_all.deb ... Unpacking python3-pytest (8.3.3-1) ... Selecting previously unselected package python3-pytest-asyncio. Preparing to unpack .../68-python3-pytest-asyncio_0.24.0a1-1_all.deb ... Unpacking python3-pytest-asyncio (0.24.0a1-1) ... Selecting previously unselected package python3-pytest-aiohttp. Preparing to unpack .../69-python3-pytest-aiohttp_1.0.5-1_all.deb ... Unpacking python3-pytest-aiohttp (1.0.5-1) ... Selecting previously unselected package python3-pytest-cov. Preparing to unpack .../70-python3-pytest-cov_5.0.0-1_all.deb ... Unpacking python3-pytest-cov (5.0.0-1) ... Selecting previously unselected package python3-voluptuous. Preparing to unpack .../71-python3-voluptuous_0.14.2-1_all.deb ... Unpacking python3-voluptuous (0.14.2-1) ... Setting up media-types (10.1.0) ... Setting up libpipeline1:amd64 (1.5.8-1) ... Setting up libkeyutils1:amd64 (1.6.3-4) ... Setting up libicu72:amd64 (72.1-5+b1) ... Setting up bsdextrautils (2.40.2-11) ... Setting up libmagic-mgc (1:5.45-3+b1) ... Setting up libarchive-zip-perl (1.68-1) ... Setting up libtirpc-common (1.3.4+ds-1.3) ... Setting up libdebhelper-perl (13.20) ... Setting up libmagic1t64:amd64 (1:5.45-3+b1) ... Setting up gettext-base (0.22.5-2) ... Setting up m4 (1.4.19-4) ... Setting up libcom-err2:amd64 (1.47.1-1+b1) ... Setting up file (1:5.45-3+b1) ... Setting up libjs-jquery-throttle-debounce (1.1+dfsg.1-2) ... Setting up libelf1t64:amd64 (0.192-4) ... Setting up libkrb5support0:amd64 (1.21.3-3) ... Setting up tzdata (2024b-3) ... Current default time zone: 'Etc/UTC' Local time is now: Fri Nov 22 08:53:13 UTC 2024. Universal Time is now: Fri Nov 22 08:53:13 UTC 2024. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up libpython3.13-minimal:amd64 (3.13.0-2) ... Setting up autotools-dev (20220109.1) ... Setting up autopoint (0.22.5-2) ... Setting up libk5crypto3:amd64 (1.21.3-3) ... Setting up autoconf (2.72-3) ... Setting up dwz (0.15-1+b1) ... Setting up sensible-utils (0.0.24) ... Setting up libuchardet0:amd64 (0.0.8-1+b2) ... Setting up python3.13-minimal (3.13.0-2) ... Setting up netbase (6.4) ... Setting up libkrb5-3:amd64 (1.21.3-3) ... Setting up libjs-jquery (3.6.1+dfsg+~3.5.14-1) ... Setting up libjs-jquery-hotkeys (0~20130707+git2d51e3a9+dfsg-2.1) ... Setting up readline-common (8.2-5) ... Setting up libxml2:amd64 (2.12.7+dfsg+really2.9.14-0.2+b1) ... 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 libfile-stripnondeterminism-perl (1.14.0-1) ... Setting up gettext (0.22.5-2) ... Setting up libtool (2.4.7-8) ... Setting up intltool-debian (0.35.0+20060710.6) ... Setting up dh-autoreconf (20) ... Setting up libjs-jquery-metadata (12-4) ... Setting up libjs-jquery-isonscreen (1.2.0-1.1) ... Setting up libgssapi-krb5-2:amd64 (1.21.3-3) ... Setting up libreadline8t64:amd64 (8.2-5) ... Setting up dh-strip-nondeterminism (1.14.0-1) ... Setting up libjs-jquery-tablesorter (1:2.31.3+dfsg1-4) ... Setting up groff-base (1.23.0-5) ... Setting up libpython3.13-stdlib:amd64 (3.13.0-2) ... Setting up libtirpc3t64:amd64 (1.3.4+ds-1.3+b1) ... Setting up python3.13 (3.13.0-2) ... Setting up po-debconf (1.0.21+nmu1) ... Setting up man-db (2.13.0-1) ... Not building database; man-db/auto-update is not 'true'. Setting up libnsl2:amd64 (1.3.0-3+b3) ... Setting up libpython3.12-stdlib:amd64 (3.12.7-3) ... Setting up python3.12 (3.12.7-3) ... Setting up debhelper (13.20) ... Setting up libpython3-stdlib:amd64 (3.12.7-1) ... Setting up python3 (3.12.7-1) ... Setting up python3-zipp (3.21.0-1) ... Setting up python3-autocommand (2.2.2-3) ... Setting up python3-multidict (6.1.0-1+b1) ... Setting up python3-frozenlist (1.5.0-1+b1) ... Setting up python3-aiosignal (1.3.1-1) ... Setting up python3-async-timeout (5.0.1-1) ... Setting up python3-packaging (24.2-1) ... Setting up python3-idna (3.8-2) ... Setting up python3-typing-extensions (4.12.2-2) ... Setting up python3-aiohappyeyeballs (2.4.3-1) ... Setting up python3-pluggy (1.5.0-1) ... Setting up python3-voluptuous (0.14.2-1) ... Setting up python3-yarl (1.13.1-1+b1) ... Setting up python3-more-itertools (10.5.0-1) ... Setting up python3-iniconfig (1.1.1-2) ... Setting up python3-attr (24.2.0-1) ... Setting up python3-jaraco.functools (4.1.0-1) ... Setting up python3-async-generator (1.10-4) ... Setting up python3-jaraco.context (6.0.0-1) ... Setting up python3-defusedxml (0.7.1-2) ... Setting up python3-pytest (8.3.3-1) ... Setting up python3-typeguard (4.4.1-1) ... Setting up python3-aiohttp (3.10.10-2) ... Setting up python3-all (3.12.7-1) ... Setting up python3-coverage (7.6.0+dfsg1-2+b1) ... Setting up python3-pytest-cov (5.0.0-1) ... Setting up python3-inflect (7.3.1-2) ... Setting up python3-jaraco.text (4.0.0-1) ... Setting up python3-pytest-asyncio (0.24.0a1-1) ... Setting up python3-pkg-resources (75.2.0-1) ... Setting up python3-pytest-aiohttp (1.0.5-1) ... Setting up python3-setuptools (75.2.0-1) ... Setting up python3-didl-lite (1.4.1-1) ... Setting up dh-python (6.20241024) ... Processing triggers for libc-bin (2.40-3) ... Reading package lists... Building dependency tree... Reading state information... Reading extended state information... Initializing package states... Writing extended state information... Building tag database... -> Finished parsing the build-deps I: Building the package I: Running cd /build/reproducible-path/async-upnp-client-0.40.0/ && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-buildpackage -us -uc -b && env PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" HOME="/nonexistent/first-build" dpkg-genchanges -S > ../async-upnp-client_0.40.0-1_source.changes dpkg-buildpackage: info: source package async-upnp-client dpkg-buildpackage: info: source version 0.40.0-1 dpkg-buildpackage: info: source distribution unstable dpkg-buildpackage: info: source changed by Edward Betts dpkg-source --before-build . dpkg-buildpackage: info: host architecture amd64 debian/rules clean dh clean --buildsystem=pybuild debian/rules override_dh_auto_clean make[1]: Entering directory '/build/reproducible-path/async-upnp-client-0.40.0' dh_auto_clean I: pybuild base:311: python3.13 setup.py clean /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running clean removing '/build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build' (and everything under it) 'build/bdist.linux-x86_64' does not exist -- can't clean it 'build/scripts-3.13' does not exist -- can't clean it I: pybuild base:311: python3.12 setup.py clean /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running clean removing '/build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build' (and everything under it) 'build/bdist.linux-x86_64' does not exist -- can't clean it 'build/scripts-3.12' does not exist -- can't clean it rm -rf async_upnp_client.egg-info/ make[1]: Leaving directory '/build/reproducible-path/async-upnp-client-0.40.0' dh_autoreconf_clean -O--buildsystem=pybuild dh_clean -O--buildsystem=pybuild debian/rules binary dh binary --buildsystem=pybuild dh_update_autotools_config -O--buildsystem=pybuild dh_autoreconf -O--buildsystem=pybuild dh_auto_configure -O--buildsystem=pybuild I: pybuild base:311: python3.13 setup.py config /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running config I: pybuild base:311: python3.12 setup.py config /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running config dh_auto_build -O--buildsystem=pybuild I: pybuild base:311: /usr/bin/python3.13 setup.py build /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running build running build_py creating /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/client.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/advertisement.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/aiohttp.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/device_updater.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/exceptions.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/__init__.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/const.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/event_handler.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/client_factory.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/description_cache.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/server.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/search.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/ssdp.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/ssdp_listener.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/cli.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client copying async_upnp_client/utils.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client creating /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/igd.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/__init__.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/profile.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/printer.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/dlna.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/py.typed -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client I: pybuild base:311: /usr/bin/python3 setup.py build /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'async-upnp-client' will not be supported in future versions. Please use the underscore name 'async_upnp_client' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) /usr/lib/python3/dist-packages/setuptools/dist.py:491: SetuptoolsDeprecationWarning: Invalid dash-separated options !! ******************************************************************************** Usage of dash-separated 'python-tag' will not be supported in future versions. Please use the underscore name 'python_tag' instead. By 2025-Mar-03, you need to update your project and remove deprecated calls or your builds will no longer be supported. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details. ******************************************************************************** !! opt = self.warn_dash_deprecation(opt, section) running build running build_py creating /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/client.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/advertisement.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/aiohttp.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/device_updater.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/exceptions.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/__init__.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/const.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/event_handler.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/client_factory.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/description_cache.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/server.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/search.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/ssdp.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/ssdp_listener.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/cli.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client copying async_upnp_client/utils.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client creating /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/igd.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/__init__.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/profile.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/printer.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/profiles/dlna.py -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/profiles copying async_upnp_client/py.typed -> /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client dh_auto_test -O--buildsystem=pybuild I: pybuild base:311: cd /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build; python3.13 -m pytest -k "not test_get_local_ip and not test_async_get_local_ip" /usr/lib/python3/dist-packages/pytest_asyncio/plugin.py:208: PytestDeprecationWarning: The configuration option "asyncio_default_fixture_loop_scope" is unset. The event loop scope for asynchronous fixtures will default to the fixture caching scope. Future versions of pytest-asyncio will default the loop scope for asynchronous fixtures to function scope. Set the default fixture loop scope explicitly in order to avoid unexpected behavior in the future. Valid fixture loop scopes are: "function", "class", "module", "package", "session" warnings.warn(PytestDeprecationWarning(_DEFAULT_FIXTURE_LOOP_SCOPE_UNSET)) ============================= test session starts ============================== platform linux -- Python 3.13.0, pytest-8.3.3, pluggy-1.5.0 rootdir: /build/reproducible-path/async-upnp-client-0.40.0 plugins: asyncio-0.24.0a1, cov-5.0.0, typeguard-4.4.1, aiohttp-1.0.5 asyncio: mode=Mode.STRICT, default_loop_scope=None collected 156 items / 14 deselected / 142 selected tests/profiles/test_dlna_dmr.py ................ [ 11%] tests/profiles/test_dlna_dms.py .. [ 12%] tests/profiles/test_igd.py ..... [ 16%] tests/profiles/test_profile.py .............. [ 26%] tests/test_advertisement.py .... [ 28%] tests/test_aiohttp.py ... [ 30%] tests/test_client.py ........................................ [ 59%] tests/test_description_cache.py ...... [ 63%] tests/test_event_handler.py ....... [ 68%] tests/test_search.py ... [ 70%] tests/test_server.py ... [ 72%] tests/test_ssdp.py .............. [ 82%] tests/test_ssdp_listener.py FFFFFFFFFFF.FFFFFFF [ 95%] tests/test_utils.py ...... [100%] =================================== FAILURES =================================== _________________________ test_see_advertisement_alive _________________________ @pytest.mark.asyncio async def test_see_advertisement_alive() -> None: """Test seeing a device through an ssdp:alive-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:87: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ________________________ test_see_advertisement_byebye _________________________ @pytest.mark.asyncio async def test_see_advertisement_byebye() -> None: """Test seeing a device through an ssdp:byebye-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ________________________ test_see_advertisement_update _________________________ @pytest.mark.asyncio async def test_see_advertisement_update() -> None: """Test seeing a device through a ssdp:update-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:170: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______________________________ test_see_search ________________________________ @pytest.mark.asyncio async def test_see_search() -> None: """Test seeing a device through an search.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:208: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________________ test_see_search_sync _____________________________ @pytest.mark.asyncio async def test_see_search_sync() -> None: """Test seeing a device through an search.""" # pylint: disable=protected-access callback = Mock() listener = SsdpListener(callback=callback) > await listener.async_start() tests/test_ssdp_listener.py:243: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError __________________________ test_see_search_then_alive __________________________ @pytest.mark.asyncio async def test_see_search_then_alive() -> None: """Test seeing a device through a search, then a ssdp:alive-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:278: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_then_update __________________________ @pytest.mark.asyncio async def test_see_search_then_update() -> None: """Test seeing a device through a search, then a ssdp:update-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:310: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_then_byebye __________________________ @pytest.mark.asyncio async def test_see_search_then_byebye() -> None: """Test seeing a device through a search, then a ssdp:byebye-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:346: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ____________________ test_see_search_then_byebye_then_alive ____________________ @pytest.mark.asyncio async def test_see_search_then_byebye_then_alive() -> None: """Test seeing a device by search, then ssdp:byebye, then ssdp:alive.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:382: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ______________________________ test_purge_devices ______________________________ @pytest.mark.asyncio async def test_purge_devices() -> None: """Test if a device is purged when it times out given the value of the CACHE-CONTROL header.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:432: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________________ test_purge_devices_2 _____________________________ @pytest.mark.asyncio async def test_purge_devices_2() -> None: """Test if a device is purged when it times out, part 2.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:460: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_invalid_usn __________________________ @pytest.mark.asyncio async def test_see_search_invalid_usn() -> None: """Test invalid USN is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:545: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______________________ test_see_search_invalid_location _______________________ @pytest.mark.asyncio async def test_see_search_invalid_location() -> None: """Test headers with invalid location is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:568: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____ test_see_search_localhost_location[http://127.0.0.1:1234/device.xml] _____ location = 'http://127.0.0.1:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______ test_see_search_localhost_location[http://[::1]:1234/device.xml] _______ location = 'http://[::1]:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ___ test_see_search_localhost_location[http://169.254.12.1:1234/device.xml] ____ location = 'http://169.254.12.1:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ____________________________ test_combined_headers _____________________________ @pytest.mark.asyncio async def test_combined_headers() -> None: """Test combined headers.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:616: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________ test_see_search_device_ipv4_and_ipv6 _____________________ @pytest.mark.asyncio async def test_see_search_device_ipv4_and_ipv6() -> None: """Test seeing the same device via IPv4, then via IPv6.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:686: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError =============================== warnings summary =============================== .pybuild/cpython3_3.13_async-upnp-client/build/tests/test_server.py::test_init .pybuild/cpython3_3.13_async-upnp-client/build/tests/test_server.py::test_action .pybuild/cpython3_3.13_async-upnp-client/build/tests/test_server.py::test_subscribe /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/server.py:291: DeprecationWarning: Testing an element's truth value will always return True in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. if not thing or not hasattr(thing, "__upnp_action__"): .pybuild/cpython3_3.13_async-upnp-client/build/tests/test_server.py::test_action /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build/async_upnp_client/server.py:1081: DeprecationWarning: Testing an element's truth value will always return True in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. assert body_el -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED tests/test_ssdp_listener.py::test_see_advertisement_alive - OSError: [... FAILED tests/test_ssdp_listener.py::test_see_advertisement_byebye - OSError: ... FAILED tests/test_ssdp_listener.py::test_see_advertisement_update - OSError: ... FAILED tests/test_ssdp_listener.py::test_see_search - OSError: [Errno 19] No ... FAILED tests/test_ssdp_listener.py::test_see_search_sync - OSError: [Errno 19... FAILED tests/test_ssdp_listener.py::test_see_search_then_alive - OSError: [Er... FAILED tests/test_ssdp_listener.py::test_see_search_then_update - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_then_byebye - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_then_byebye_then_alive - ... FAILED tests/test_ssdp_listener.py::test_purge_devices - OSError: [Errno 19] ... FAILED tests/test_ssdp_listener.py::test_purge_devices_2 - OSError: [Errno 19... FAILED tests/test_ssdp_listener.py::test_see_search_invalid_usn - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_invalid_location - OSErro... FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://127.0.0.1:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://[::1]:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://169.254.12.1:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_combined_headers - OSError: [Errno 1... FAILED tests/test_ssdp_listener.py::test_see_search_device_ipv4_and_ipv6 - OS... ========== 18 failed, 124 passed, 14 deselected, 4 warnings in 13.38s ========== E: pybuild pybuild:389: test: plugin distutils failed with: exit code=1: cd /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.13_async-upnp-client/build; python3.13 -m pytest -k "not test_get_local_ip and not test_async_get_local_ip" I: pybuild base:311: cd /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build; python3.12 -m pytest -k "not test_get_local_ip and not test_async_get_local_ip" /usr/lib/python3/dist-packages/pytest_asyncio/plugin.py:208: PytestDeprecationWarning: The configuration option "asyncio_default_fixture_loop_scope" is unset. The event loop scope for asynchronous fixtures will default to the fixture caching scope. Future versions of pytest-asyncio will default the loop scope for asynchronous fixtures to function scope. Set the default fixture loop scope explicitly in order to avoid unexpected behavior in the future. Valid fixture loop scopes are: "function", "class", "module", "package", "session" warnings.warn(PytestDeprecationWarning(_DEFAULT_FIXTURE_LOOP_SCOPE_UNSET)) ============================= test session starts ============================== platform linux -- Python 3.12.7, pytest-8.3.3, pluggy-1.5.0 rootdir: /build/reproducible-path/async-upnp-client-0.40.0 plugins: asyncio-0.24.0a1, cov-5.0.0, typeguard-4.4.1, aiohttp-1.0.5 asyncio: mode=Mode.STRICT, default_loop_scope=None collected 156 items / 14 deselected / 142 selected tests/profiles/test_dlna_dmr.py ................ [ 11%] tests/profiles/test_dlna_dms.py .. [ 12%] tests/profiles/test_igd.py ..... [ 16%] tests/profiles/test_profile.py .............. [ 26%] tests/test_advertisement.py .... [ 28%] tests/test_aiohttp.py ... [ 30%] tests/test_client.py ........................................ [ 59%] tests/test_description_cache.py ...... [ 63%] tests/test_event_handler.py ....... [ 68%] tests/test_search.py ... [ 70%] tests/test_server.py ... [ 72%] tests/test_ssdp.py .............. [ 82%] tests/test_ssdp_listener.py FFFFFFFFFFF.FFFFFFF [ 95%] tests/test_utils.py ...... [100%] =================================== FAILURES =================================== _________________________ test_see_advertisement_alive _________________________ @pytest.mark.asyncio async def test_see_advertisement_alive() -> None: """Test seeing a device through an ssdp:alive-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:87: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ________________________ test_see_advertisement_byebye _________________________ @pytest.mark.asyncio async def test_see_advertisement_byebye() -> None: """Test seeing a device through an ssdp:byebye-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ________________________ test_see_advertisement_update _________________________ @pytest.mark.asyncio async def test_see_advertisement_update() -> None: """Test seeing a device through a ssdp:update-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:170: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______________________________ test_see_search ________________________________ @pytest.mark.asyncio async def test_see_search() -> None: """Test seeing a device through an search.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:208: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________________ test_see_search_sync _____________________________ @pytest.mark.asyncio async def test_see_search_sync() -> None: """Test seeing a device through an search.""" # pylint: disable=protected-access callback = Mock() listener = SsdpListener(callback=callback) > await listener.async_start() tests/test_ssdp_listener.py:243: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError __________________________ test_see_search_then_alive __________________________ @pytest.mark.asyncio async def test_see_search_then_alive() -> None: """Test seeing a device through a search, then a ssdp:alive-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:278: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_then_update __________________________ @pytest.mark.asyncio async def test_see_search_then_update() -> None: """Test seeing a device through a search, then a ssdp:update-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:310: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_then_byebye __________________________ @pytest.mark.asyncio async def test_see_search_then_byebye() -> None: """Test seeing a device through a search, then a ssdp:byebye-advertisement.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:346: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ____________________ test_see_search_then_byebye_then_alive ____________________ @pytest.mark.asyncio async def test_see_search_then_byebye_then_alive() -> None: """Test seeing a device by search, then ssdp:byebye, then ssdp:alive.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:382: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ______________________________ test_purge_devices ______________________________ @pytest.mark.asyncio async def test_purge_devices() -> None: """Test if a device is purged when it times out given the value of the CACHE-CONTROL header.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:432: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________________ test_purge_devices_2 _____________________________ @pytest.mark.asyncio async def test_purge_devices_2() -> None: """Test if a device is purged when it times out, part 2.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:460: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _________________________ test_see_search_invalid_usn __________________________ @pytest.mark.asyncio async def test_see_search_invalid_usn() -> None: """Test invalid USN is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:545: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______________________ test_see_search_invalid_location _______________________ @pytest.mark.asyncio async def test_see_search_invalid_location() -> None: """Test headers with invalid location is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:568: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____ test_see_search_localhost_location[http://127.0.0.1:1234/device.xml] _____ location = 'http://127.0.0.1:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _______ test_see_search_localhost_location[http://[::1]:1234/device.xml] _______ location = 'http://[::1]:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ___ test_see_search_localhost_location[http://169.254.12.1:1234/device.xml] ____ location = 'http://169.254.12.1:1234/device.xml' @pytest.mark.asyncio @pytest.mark.parametrize( "location", [ "http://127.0.0.1:1234/device.xml", "http://[::1]:1234/device.xml", "http://169.254.12.1:1234/device.xml", ], ) async def test_see_search_localhost_location(location: str) -> None: """Test localhost location (127.0.0.1/[::1]) is ignored.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError ____________________________ test_combined_headers _____________________________ @pytest.mark.asyncio async def test_combined_headers() -> None: """Test combined headers.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:616: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError _____________________ test_see_search_device_ipv4_and_ipv6 _____________________ @pytest.mark.asyncio async def test_see_search_device_ipv4_and_ipv6() -> None: """Test seeing the same device via IPv4, then via IPv6.""" # pylint: disable=protected-access async_callback = AsyncMock() listener = SsdpListener(async_callback=async_callback) > await listener.async_start() tests/test_ssdp_listener.py:686: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ async_upnp_client/ssdp_listener.py:520: in async_start await self._advertisement_listener.async_start() async_upnp_client/advertisement.py:118: in async_start sock, _source, _target = get_ssdp_socket(self.source, self.target) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ source = ('0.0.0.0', 0), target = ('239.255.255.250', 1900) def get_ssdp_socket( source: AddressTupleVXType, target: AddressTupleVXType, ) -> Tuple[socket.socket, AddressTupleVXType, AddressTupleVXType]: """Create a socket to listen on.""" # Ensure a proper IPv6 source/target. if is_ipv6_address(source): source = cast(AddressTupleV6Type, source) if not source[3]: raise UpnpError(f"Source missing scope_id, source: {source}") if is_ipv6_address(target): target = cast(AddressTupleV6Type, target) if not target[3]: raise UpnpError(f"Target missing scope_id, target: {target}") target_ip, target_port = ip_port_from_address_tuple(target) target_info = socket.getaddrinfo( str(target_ip), target_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP, )[0] source_ip, source_port = ip_port_from_address_tuple(source) source_info = socket.getaddrinfo( str(source_ip), source_port, type=socket.SOCK_DGRAM, proto=socket.IPPROTO_UDP )[0] _LOGGER.debug("Creating socket, source: %s, target: %s", source_info, target_info) # create socket sock = socket.socket(source_info[0], source_info[1]) # set options sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) except AttributeError: pass sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # multicast if target_ip.is_multicast: if source_info[0] == socket.AF_INET6: sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, 2) addr = cast(AddressTupleV6Type, source_info[4]) if addr[3]: mreq = target_ip.packed + addr[3].to_bytes(4, sys.byteorder) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, addr[3]) else: _LOGGER.debug("Skipping setting multicast interface") else: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, source_ip.packed) sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) > sock.setsockopt( socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, target_ip.packed + source_ip.packed, ) E OSError: [Errno 19] No such device async_upnp_client/ssdp.py:491: OSError =============================== warnings summary =============================== .pybuild/cpython3_3.12_async-upnp-client/build/tests/test_server.py::test_init .pybuild/cpython3_3.12_async-upnp-client/build/tests/test_server.py::test_action .pybuild/cpython3_3.12_async-upnp-client/build/tests/test_server.py::test_subscribe /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/server.py:291: DeprecationWarning: Testing an element's truth value will always return True in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. if not thing or not hasattr(thing, "__upnp_action__"): .pybuild/cpython3_3.12_async-upnp-client/build/tests/test_server.py::test_action /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build/async_upnp_client/server.py:1081: DeprecationWarning: Testing an element's truth value will always return True in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. assert body_el -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ FAILED tests/test_ssdp_listener.py::test_see_advertisement_alive - OSError: [... FAILED tests/test_ssdp_listener.py::test_see_advertisement_byebye - OSError: ... FAILED tests/test_ssdp_listener.py::test_see_advertisement_update - OSError: ... FAILED tests/test_ssdp_listener.py::test_see_search - OSError: [Errno 19] No ... FAILED tests/test_ssdp_listener.py::test_see_search_sync - OSError: [Errno 19... FAILED tests/test_ssdp_listener.py::test_see_search_then_alive - OSError: [Er... FAILED tests/test_ssdp_listener.py::test_see_search_then_update - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_then_byebye - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_then_byebye_then_alive - ... FAILED tests/test_ssdp_listener.py::test_purge_devices - OSError: [Errno 19] ... FAILED tests/test_ssdp_listener.py::test_purge_devices_2 - OSError: [Errno 19... FAILED tests/test_ssdp_listener.py::test_see_search_invalid_usn - OSError: [E... FAILED tests/test_ssdp_listener.py::test_see_search_invalid_location - OSErro... FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://127.0.0.1:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://[::1]:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_see_search_localhost_location[http://169.254.12.1:1234/device.xml] FAILED tests/test_ssdp_listener.py::test_combined_headers - OSError: [Errno 1... FAILED tests/test_ssdp_listener.py::test_see_search_device_ipv4_and_ipv6 - OS... ========== 18 failed, 124 passed, 14 deselected, 4 warnings in 15.10s ========== E: pybuild pybuild:389: test: plugin distutils failed with: exit code=1: cd /build/reproducible-path/async-upnp-client-0.40.0/.pybuild/cpython3_3.12_async-upnp-client/build; python3.12 -m pytest -k "not test_get_local_ip and not test_async_get_local_ip" dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p "3.13 3.12" returned exit code 13 make: *** [debian/rules:8: binary] Error 25 dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2 I: copying local configuration E: Failed autobuilding of package I: unmounting dev/ptmx filesystem I: unmounting dev/pts filesystem I: unmounting dev/shm filesystem I: unmounting proc filesystem I: unmounting sys filesystem I: cleaning the build env I: removing directory /srv/workspace/pbuilder/1545202 and its subdirectories async-upnp-client failed to build from source. removed '/var/lib/jenkins/userContent/reproducible/debian/rbuild/unstable/amd64/async-upnp-client_0.40.0-1.rbuild.log' removed '/var/lib/jenkins/userContent/reproducible/debian/rbuild/unstable/amd64/async-upnp-client_0.40.0-1.rbuild.log.gz' removed '/var/lib/jenkins/userContent/reproducible/debian/logs/unstable/amd64/async-upnp-client_0.40.0-1.build1.log.gz' Fri Nov 22 08:54:55 UTC 2024 W: No second build log, what happened? Compressing the 1st log... b1/build.log: 92.6% -- replaced with stdout INSERT 0 1 INSERT 0 1 DELETE 1 [2024-11-22 08:54:56] INFO: Starting at 2024-11-22 08:54:56.276744 [2024-11-22 08:54:56] INFO: Generating the pages of 1 package(s) [2024-11-22 08:54:56] CRITICAL: https://tests.reproducible-builds.org/debian/unstable/amd64/async-upnp-client didn't produce a buildlog, even though it has been built. [2024-11-22 08:54:56] ERROR: Either /var/lib/jenkins/userContent/reproducible/debian/logs/unstable/arm64/async-upnp-client_0.40.0-1.build2.log.gz or /var/lib/jenkins/userContent/reproducible/debian/logdiffs/unstable/arm64/async-upnp-client_0.40.0-1.diff.gz is missing [2024-11-22 08:54:56] ERROR: Either /var/lib/jenkins/userContent/reproducible/debian/logs/unstable/armhf/async-upnp-client_0.40.0-1.build2.log.gz or /var/lib/jenkins/userContent/reproducible/debian/logdiffs/unstable/armhf/async-upnp-client_0.40.0-1.diff.gz is missing [2024-11-22 08:54:56] ERROR: Either /var/lib/jenkins/userContent/reproducible/debian/logs/unstable/i386/async-upnp-client_0.40.0-1.build2.log.gz or /var/lib/jenkins/userContent/reproducible/debian/logdiffs/unstable/i386/async-upnp-client_0.40.0-1.diff.gz is missing [2024-11-22 08:54:56] INFO: Finished at 2024-11-22 08:54:56.414602, took: 0:00:00.137863 Fri Nov 22 08:54:56 UTC 2024 - successfully updated the database and updated https://tests.reproducible-builds.org/debian/rb-pkg/unstable/amd64/async-upnp-client.html Starting cleanup. /var/lib/jenkins/userContent/reproducible/debian/rbuild/unstable/amd64/async-upnp-client_0.40.0-1.rbuild.log: 91.9% -- replaced with /var/lib/jenkins/userContent/reproducible/debian/rbuild/unstable/amd64/async-upnp-client_0.40.0-1.rbuild.log.gz [2024-11-22 08:54:56] INFO: Starting at 2024-11-22 08:54:56.863821 [2024-11-22 08:54:56] INFO: Generating the pages of 1 package(s) [2024-11-22 08:54:56] ERROR: Either /var/lib/jenkins/userContent/reproducible/debian/logs/unstable/amd64/async-upnp-client_0.40.0-1.build2.log.gz or /var/lib/jenkins/userContent/reproducible/debian/logdiffs/unstable/amd64/async-upnp-client_0.40.0-1.diff.gz is missing [2024-11-22 08:54:56] ERROR: Either /var/lib/jenkins/userContent/reproducible/debian/logs/unstable/arm64/async-upnp-client_0.40.0-1.build2.log.gz or /var/lib/jenkins/userContent/reproducible/debian/logdiffs/unstable/arm64/async-upnp-client_0.40.0-1.diff.gz is missing [2024-11-22 08:54:56] ERROR: Either /var/lib/jenkins/userContent/reproducible/debian/logs/unstable/armhf/async-upnp-client_0.40.0-1.build2.log.gz or /var/lib/jenkins/userContent/reproducible/debian/logdiffs/unstable/armhf/async-upnp-client_0.40.0-1.diff.gz is missing [2024-11-22 08:54:56] ERROR: Either /var/lib/jenkins/userContent/reproducible/debian/logs/unstable/i386/async-upnp-client_0.40.0-1.build2.log.gz or /var/lib/jenkins/userContent/reproducible/debian/logdiffs/unstable/i386/async-upnp-client_0.40.0-1.diff.gz is missing [2024-11-22 08:54:57] INFO: Finished at 2024-11-22 08:54:57.005659, took: 0:00:00.141842 All cleanup done. Fri Nov 22 08:54:57 UTC 2024 - total duration: 0h 2m 43s. Fri Nov 22 08:54:57 UTC 2024 - reproducible_build.sh stopped running as /tmp/jenkins-script-Lwh6GNnQ, removing. Finished with result: success Main processes terminated with: code=exited/status=0 Service runtime: 2min 44.685s CPU time consumed: 4.619s