[Pkg-privacy-maintainers] Bug#997499: onionshare: FTBFS: dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p 3.9 returned exit code 13

Lucas Nussbaum lucas at debian.org
Sat Oct 23 21:40:02 BST 2021


Source: onionshare
Version: 2.2-3
Severity: serious
Justification: FTBFS
Tags: bookworm sid ftbfs
User: lucas at debian.org
Usertags: ftbfs-20211023 ftbfs-bookworm

Hi,

During a rebuild of all packages in sid, your package failed to build
on amd64.


Relevant part (hopefully):
> make[1]: Entering directory '/<<PKGBUILDDIR>>'
> dh_auto_clean
> I: pybuild base:232: python3.9 setup.py clean 
> /usr/lib/python3.9/distutils/dist.py:274: UserWarning: Unknown distribution option: 'include_package_data'
>   warnings.warn(msg)
> running clean
> removing '/<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build' (and everything under it)
> 'build/bdist.linux-x86_64' does not exist -- can't clean it
> 'build/scripts-3.9' does not exist -- can't clean it
> rm -rf *.egg-info
> make[1]: Leaving directory '/<<PKGBUILDDIR>>'
>    dh_autoreconf_clean -O--buildsystem=pybuild
>    dh_clean -O--buildsystem=pybuild
>  dpkg-source -b .
> dpkg-source: info: using source format '3.0 (quilt)'
> dpkg-source: info: building onionshare using existing ./onionshare_2.2.orig.tar.gz
> dpkg-source: info: using patch list from debian/patches/series
> dpkg-source: info: building onionshare in onionshare_2.2-3.debian.tar.xz
> dpkg-source: info: building onionshare in onionshare_2.2-3.dsc
>  debian/rules binary
> dh binary --with python3 --buildsystem=pybuild
>    dh_update_autotools_config -O--buildsystem=pybuild
>    dh_autoreconf -O--buildsystem=pybuild
>    dh_auto_configure -O--buildsystem=pybuild
> I: pybuild base:232: python3.9 setup.py config 
> /usr/lib/python3.9/distutils/dist.py:274: UserWarning: Unknown distribution option: 'include_package_data'
>   warnings.warn(msg)
> running config
>    dh_auto_build -O--buildsystem=pybuild
> I: pybuild base:232: /usr/bin/python3 setup.py build 
> /usr/lib/python3.9/distutils/dist.py:274: UserWarning: Unknown distribution option: 'include_package_data'
>   warnings.warn(msg)
> running build
> running build_py
> creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare
> copying onionshare/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare
> copying onionshare/strings.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare
> copying onionshare/common.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare
> copying onionshare/onion.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare
> copying onionshare/settings.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare
> copying onionshare/onionshare.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare
> creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare/web
> copying onionshare/web/receive_mode.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare/web
> copying onionshare/web/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare/web
> copying onionshare/web/send_base_mode.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare/web
> copying onionshare/web/website_mode.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare/web
> copying onionshare/web/share_mode.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare/web
> copying onionshare/web/web.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare/web
> creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui
> copying onionshare_gui/threads.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui
> copying onionshare_gui/widgets.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui
> copying onionshare_gui/update_checker.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui
> copying onionshare_gui/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui
> copying onionshare_gui/onionshare_gui.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui
> copying onionshare_gui/server_status.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui
> copying onionshare_gui/settings_dialog.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui
> copying onionshare_gui/tor_connection_dialog.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui
> creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/mode
> copying onionshare_gui/mode/file_selection.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/mode
> copying onionshare_gui/mode/history.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/mode
> copying onionshare_gui/mode/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/mode
> creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/mode/share_mode
> copying onionshare_gui/mode/share_mode/threads.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/mode/share_mode
> copying onionshare_gui/mode/share_mode/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/mode/share_mode
> creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/mode/receive_mode
> copying onionshare_gui/mode/receive_mode/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/mode/receive_mode
> creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/mode/website_mode
> copying onionshare_gui/mode/website_mode/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/mode/website_mode
> running build_scripts
> creating build
> creating build/scripts-3.9
> copying and adjusting install/scripts/onionshare -> build/scripts-3.9
> copying and adjusting install/scripts/onionshare-gui -> build/scripts-3.9
> changing mode of build/scripts-3.9/onionshare from 644 to 755
> changing mode of build/scripts-3.9/onionshare-gui from 644 to 755
>    dh_auto_test -O--buildsystem=pybuild
> I: pybuild base:232: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build; python3.9 -m pytest tests
> ============================= test session starts ==============================
> platform linux -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-0.13.0
> rootdir: /<<PKGBUILDDIR>>
> collected 290 items
> 
> tests/local_onionshare_401_public_mode_skips_ratelimit_test.py s         [  0%]
> tests/local_onionshare_401_triggers_ratelimit_test.py s                  [  0%]
> tests/local_onionshare_quitting_during_share_prompts_warning_test.py s   [  1%]
> tests/local_onionshare_receive_mode_clear_all_button_test.py s           [  1%]
> tests/local_onionshare_receive_mode_timer_test.py s                      [  1%]
> tests/local_onionshare_receive_mode_upload_non_writable_dir_test.py s    [  2%]
> tests/local_onionshare_receive_mode_upload_public_mode_non_writable_dir_test.py s [  2%]
>                                                                          [  2%]
> tests/local_onionshare_receive_mode_upload_public_mode_test.py s         [  2%]
> tests/local_onionshare_receive_mode_upload_test.py s                     [  3%]
> tests/local_onionshare_settings_dialog_legacy_tor_test.py s              [  3%]
> tests/local_onionshare_settings_dialog_no_tor_test.py s                  [  3%]
> tests/local_onionshare_settings_dialog_v3_tor_test.py s                  [  4%]
> tests/local_onionshare_share_mode_autostart_and_autostop_timer_mismatch_test.py s [  4%]
>                                                                          [  4%]
> tests/local_onionshare_share_mode_autostart_timer_test.py s              [  4%]
> tests/local_onionshare_share_mode_autostart_timer_too_short_test.py s    [  5%]
> tests/local_onionshare_share_mode_cancel_share_test.py s                 [  5%]
> tests/local_onionshare_share_mode_clear_all_button_test.py s             [  5%]
> tests/local_onionshare_share_mode_download_public_mode_test.py s         [  6%]
> tests/local_onionshare_share_mode_download_stay_open_test.py s           [  6%]
> tests/local_onionshare_share_mode_download_test.py s                     [  6%]
> tests/local_onionshare_share_mode_individual_file_view_stay_open_test.py s [  7%]
>                                                                          [  7%]
> tests/local_onionshare_share_mode_individual_file_view_test.py s         [  7%]
> tests/local_onionshare_share_mode_large_download_test.py s               [  7%]
> tests/local_onionshare_share_mode_password_persistent_test.py s          [  8%]
> tests/local_onionshare_share_mode_timer_test.py s                        [  8%]
> tests/local_onionshare_share_mode_timer_too_short_test.py s              [  8%]
> tests/local_onionshare_share_mode_unreadable_file_test.py s              [  9%]
> tests/local_onionshare_website_mode_csp_enabled_test.py s                [  9%]
> tests/local_onionshare_website_mode_test.py s                            [ 10%]
> tests/onionshare_790_cancel_on_second_share_test.py s                    [ 10%]
> tests/onionshare_receive_mode_upload_public_mode_test.py s               [ 10%]
> tests/onionshare_receive_mode_upload_test.py s                           [ 11%]
> tests/onionshare_share_mode_cancel_share_test.py s                       [ 11%]
> tests/onionshare_share_mode_download_public_mode_test.py s               [ 11%]
> tests/onionshare_share_mode_download_stay_open_test.py s                 [ 12%]
> tests/onionshare_share_mode_download_test.py s                           [ 12%]
> tests/onionshare_share_mode_persistent_test.py s                         [ 12%]
> tests/onionshare_share_mode_stealth_test.py s                            [ 13%]
> tests/onionshare_share_mode_timer_test.py s                              [ 13%]
> tests/onionshare_share_mode_tor_connection_killed_test.py s              [ 13%]
> tests/onionshare_share_mode_v2_onion_test.py s                           [ 14%]
> tests/test_onionshare.py .......                                         [ 16%]
> tests/test_onionshare_common.py ........................................ [ 30%]
> .......................................................................  [ 54%]
> tests/test_onionshare_settings.py ............                           [ 58%]
> tests/test_onionshare_strings.py ....                                    [ 60%]
> tests/test_onionshare_web.py FFFFFF..................................... [ 75%]
> ........................................................................ [100%]
> 
> =================================== FAILURES ===================================
> ___________________________ TestWeb.test_share_mode ____________________________
> 
> self = <tests.test_onionshare_web.TestWeb object at 0x7f8bb5108910>
> common_obj = <onionshare.common.Common object at 0x7f8bb5108c70>
> 
>     def test_share_mode(self, common_obj):
> >       web = web_obj(common_obj, "share", 3)
> 
> tests/test_onionshare_web.py:73: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> tests/test_onionshare_web.py:48: in web_obj
>     web = Web(common_obj, False, mode)
> onionshare/web/web.py:77: in __init__
>     self.generate_static_url_path()
> onionshare/web/web.py:166: in generate_static_url_path
>     self.app.add_url_rule(
> /usr/lib/python3/dist-packages/flask/scaffold.py:56: in wrapper_func
>     return f(self, *args, **kwargs)
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <Flask 'onionshare.web.web'>
> rule = <Rule '/static_5pxhxfxveqsc6jbqkaeguaoi6q/<filename>' (GET, OPTIONS, HEAD) -> static>
> endpoint = 'static'
> view_func = <bound method Scaffold.send_static_file of <Flask 'onionshare.web.web'>>
> provide_automatic_options = True, options = {'endpoint': 'static'}
> methods = {'GET', 'OPTIONS'}, required_methods = {'OPTIONS'}
> old_func = <function Flask.__init__.<locals>.<lambda> at 0x7f8bb4fdb430>
> 
>     @setupmethod
>     def add_url_rule(
>         self,
>         rule: str,
>         endpoint: t.Optional[str] = None,
>         view_func: t.Optional[t.Callable] = None,
>         provide_automatic_options: t.Optional[bool] = None,
>         **options: t.Any,
>     ) -> None:
>         if endpoint is None:
>             endpoint = _endpoint_from_view_func(view_func)  # type: ignore
>         options["endpoint"] = endpoint
>         methods = options.pop("methods", None)
>     
>         # if the methods are not given and the view_func object knows its
>         # methods we can use that instead.  If neither exists, we go with
>         # a tuple of only ``GET`` as default.
>         if methods is None:
>             methods = getattr(view_func, "methods", None) or ("GET",)
>         if isinstance(methods, str):
>             raise TypeError(
>                 "Allowed methods must be a list of strings, for"
>                 ' example: @app.route(..., methods=["POST"])'
>             )
>         methods = {item.upper() for item in methods}
>     
>         # Methods that should always be added
>         required_methods = set(getattr(view_func, "required_methods", ()))
>     
>         # starting with Flask 0.8 the view_func object can disable and
>         # force-enable the automatic options handling.
>         if provide_automatic_options is None:
>             provide_automatic_options = getattr(
>                 view_func, "provide_automatic_options", None
>             )
>     
>         if provide_automatic_options is None:
>             if "OPTIONS" not in methods:
>                 provide_automatic_options = True
>                 required_methods.add("OPTIONS")
>             else:
>                 provide_automatic_options = False
>     
>         # Add the required methods now.
>         methods |= required_methods
>     
>         rule = self.url_rule_class(rule, methods=methods, **options)
>         rule.provide_automatic_options = provide_automatic_options  # type: ignore
>     
>         self.url_map.add(rule)
>         if view_func is not None:
>             old_func = self.view_functions.get(endpoint)
>             if old_func is not None and old_func != view_func:
> >               raise AssertionError(
>                     "View function mapping is overwriting an existing"
>                     f" endpoint function: {endpoint}"
>                 )
> E               AssertionError: View function mapping is overwriting an existing endpoint function: static
> 
> /usr/lib/python3/dist-packages/flask/app.py:1092: AssertionError
> ____________ TestWeb.test_share_mode_close_after_first_download_on _____________
> 
> self = <tests.test_onionshare_web.TestWeb object at 0x7f8bb4f13d00>
> common_obj = <onionshare.common.Common object at 0x7f8bb4f13f10>
> temp_file_1024 = '/tmp/tmpqtr3117l'
> 
>     def test_share_mode_close_after_first_download_on(self, common_obj, temp_file_1024):
> >       web = web_obj(common_obj, "share", 3)
> 
> tests/test_onionshare_web.py:98: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> tests/test_onionshare_web.py:48: in web_obj
>     web = Web(common_obj, False, mode)
> onionshare/web/web.py:77: in __init__
>     self.generate_static_url_path()
> onionshare/web/web.py:166: in generate_static_url_path
>     self.app.add_url_rule(
> /usr/lib/python3/dist-packages/flask/scaffold.py:56: in wrapper_func
>     return f(self, *args, **kwargs)
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <Flask 'onionshare.web.web'>
> rule = <Rule '/static_azcqtqve565h7cv7rwm5smid6q/<filename>' (GET, OPTIONS, HEAD) -> static>
> endpoint = 'static'
> view_func = <bound method Scaffold.send_static_file of <Flask 'onionshare.web.web'>>
> provide_automatic_options = True, options = {'endpoint': 'static'}
> methods = {'GET', 'OPTIONS'}, required_methods = {'OPTIONS'}
> old_func = <function Flask.__init__.<locals>.<lambda> at 0x7f8bb4f9df70>
> 
>     @setupmethod
>     def add_url_rule(
>         self,
>         rule: str,
>         endpoint: t.Optional[str] = None,
>         view_func: t.Optional[t.Callable] = None,
>         provide_automatic_options: t.Optional[bool] = None,
>         **options: t.Any,
>     ) -> None:
>         if endpoint is None:
>             endpoint = _endpoint_from_view_func(view_func)  # type: ignore
>         options["endpoint"] = endpoint
>         methods = options.pop("methods", None)
>     
>         # if the methods are not given and the view_func object knows its
>         # methods we can use that instead.  If neither exists, we go with
>         # a tuple of only ``GET`` as default.
>         if methods is None:
>             methods = getattr(view_func, "methods", None) or ("GET",)
>         if isinstance(methods, str):
>             raise TypeError(
>                 "Allowed methods must be a list of strings, for"
>                 ' example: @app.route(..., methods=["POST"])'
>             )
>         methods = {item.upper() for item in methods}
>     
>         # Methods that should always be added
>         required_methods = set(getattr(view_func, "required_methods", ()))
>     
>         # starting with Flask 0.8 the view_func object can disable and
>         # force-enable the automatic options handling.
>         if provide_automatic_options is None:
>             provide_automatic_options = getattr(
>                 view_func, "provide_automatic_options", None
>             )
>     
>         if provide_automatic_options is None:
>             if "OPTIONS" not in methods:
>                 provide_automatic_options = True
>                 required_methods.add("OPTIONS")
>             else:
>                 provide_automatic_options = False
>     
>         # Add the required methods now.
>         methods |= required_methods
>     
>         rule = self.url_rule_class(rule, methods=methods, **options)
>         rule.provide_automatic_options = provide_automatic_options  # type: ignore
>     
>         self.url_map.add(rule)
>         if view_func is not None:
>             old_func = self.view_functions.get(endpoint)
>             if old_func is not None and old_func != view_func:
> >               raise AssertionError(
>                     "View function mapping is overwriting an existing"
>                     f" endpoint function: {endpoint}"
>                 )
> E               AssertionError: View function mapping is overwriting an existing endpoint function: static
> 
> /usr/lib/python3/dist-packages/flask/app.py:1092: AssertionError
> ____________ TestWeb.test_share_mode_close_after_first_download_off ____________
> 
> self = <tests.test_onionshare_web.TestWeb object at 0x7f8bb4f7a550>
> common_obj = <onionshare.common.Common object at 0x7f8bb4f7a6d0>
> temp_file_1024 = '/tmp/tmpmcvgg74y'
> 
>     def test_share_mode_close_after_first_download_off(
>         self, common_obj, temp_file_1024
>     ):
> >       web = web_obj(common_obj, "share", 3)
> 
> tests/test_onionshare_web.py:115: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> tests/test_onionshare_web.py:48: in web_obj
>     web = Web(common_obj, False, mode)
> onionshare/web/web.py:77: in __init__
>     self.generate_static_url_path()
> onionshare/web/web.py:166: in generate_static_url_path
>     self.app.add_url_rule(
> /usr/lib/python3/dist-packages/flask/scaffold.py:56: in wrapper_func
>     return f(self, *args, **kwargs)
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <Flask 'onionshare.web.web'>
> rule = <Rule '/static_4st7qaktxwgsvmuc5i5hqzxkbi/<filename>' (GET, OPTIONS, HEAD) -> static>
> endpoint = 'static'
> view_func = <bound method Scaffold.send_static_file of <Flask 'onionshare.web.web'>>
> provide_automatic_options = True, options = {'endpoint': 'static'}
> methods = {'GET', 'OPTIONS'}, required_methods = {'OPTIONS'}
> old_func = <function Flask.__init__.<locals>.<lambda> at 0x7f8bb50a8790>
> 
>     @setupmethod
>     def add_url_rule(
>         self,
>         rule: str,
>         endpoint: t.Optional[str] = None,
>         view_func: t.Optional[t.Callable] = None,
>         provide_automatic_options: t.Optional[bool] = None,
>         **options: t.Any,
>     ) -> None:
>         if endpoint is None:
>             endpoint = _endpoint_from_view_func(view_func)  # type: ignore
>         options["endpoint"] = endpoint
>         methods = options.pop("methods", None)
>     
>         # if the methods are not given and the view_func object knows its
>         # methods we can use that instead.  If neither exists, we go with
>         # a tuple of only ``GET`` as default.
>         if methods is None:
>             methods = getattr(view_func, "methods", None) or ("GET",)
>         if isinstance(methods, str):
>             raise TypeError(
>                 "Allowed methods must be a list of strings, for"
>                 ' example: @app.route(..., methods=["POST"])'
>             )
>         methods = {item.upper() for item in methods}
>     
>         # Methods that should always be added
>         required_methods = set(getattr(view_func, "required_methods", ()))
>     
>         # starting with Flask 0.8 the view_func object can disable and
>         # force-enable the automatic options handling.
>         if provide_automatic_options is None:
>             provide_automatic_options = getattr(
>                 view_func, "provide_automatic_options", None
>             )
>     
>         if provide_automatic_options is None:
>             if "OPTIONS" not in methods:
>                 provide_automatic_options = True
>                 required_methods.add("OPTIONS")
>             else:
>                 provide_automatic_options = False
>     
>         # Add the required methods now.
>         methods |= required_methods
>     
>         rule = self.url_rule_class(rule, methods=methods, **options)
>         rule.provide_automatic_options = provide_automatic_options  # type: ignore
>     
>         self.url_map.add(rule)
>         if view_func is not None:
>             old_func = self.view_functions.get(endpoint)
>             if old_func is not None and old_func != view_func:
> >               raise AssertionError(
>                     "View function mapping is overwriting an existing"
>                     f" endpoint function: {endpoint}"
>                 )
> E               AssertionError: View function mapping is overwriting an existing endpoint function: static
> 
> /usr/lib/python3/dist-packages/flask/app.py:1092: AssertionError
> __________________________ TestWeb.test_receive_mode ___________________________
> 
> self = <tests.test_onionshare_web.TestWeb object at 0x7f8bb4f76580>
> common_obj = <onionshare.common.Common object at 0x7f8bb4f76460>
> 
>     def test_receive_mode(self, common_obj):
> >       web = web_obj(common_obj, "receive")
> 
> tests/test_onionshare_web.py:129: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> tests/test_onionshare_web.py:48: in web_obj
>     web = Web(common_obj, False, mode)
> onionshare/web/web.py:77: in __init__
>     self.generate_static_url_path()
> onionshare/web/web.py:166: in generate_static_url_path
>     self.app.add_url_rule(
> /usr/lib/python3/dist-packages/flask/scaffold.py:56: in wrapper_func
>     return f(self, *args, **kwargs)
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <Flask 'onionshare.web.web'>
> rule = <Rule '/static_7fxs6sxieg44my6jogsjngzjoi/<filename>' (GET, OPTIONS, HEAD) -> static>
> endpoint = 'static'
> view_func = <bound method Scaffold.send_static_file of <Flask 'onionshare.web.web'>>
> provide_automatic_options = True, options = {'endpoint': 'static'}
> methods = {'GET', 'OPTIONS'}, required_methods = {'OPTIONS'}
> old_func = <function Flask.__init__.<locals>.<lambda> at 0x7f8bb4fdb790>
> 
>     @setupmethod
>     def add_url_rule(
>         self,
>         rule: str,
>         endpoint: t.Optional[str] = None,
>         view_func: t.Optional[t.Callable] = None,
>         provide_automatic_options: t.Optional[bool] = None,
>         **options: t.Any,
>     ) -> None:
>         if endpoint is None:
>             endpoint = _endpoint_from_view_func(view_func)  # type: ignore
>         options["endpoint"] = endpoint
>         methods = options.pop("methods", None)
>     
>         # if the methods are not given and the view_func object knows its
>         # methods we can use that instead.  If neither exists, we go with
>         # a tuple of only ``GET`` as default.
>         if methods is None:
>             methods = getattr(view_func, "methods", None) or ("GET",)
>         if isinstance(methods, str):
>             raise TypeError(
>                 "Allowed methods must be a list of strings, for"
>                 ' example: @app.route(..., methods=["POST"])'
>             )
>         methods = {item.upper() for item in methods}
>     
>         # Methods that should always be added
>         required_methods = set(getattr(view_func, "required_methods", ()))
>     
>         # starting with Flask 0.8 the view_func object can disable and
>         # force-enable the automatic options handling.
>         if provide_automatic_options is None:
>             provide_automatic_options = getattr(
>                 view_func, "provide_automatic_options", None
>             )
>     
>         if provide_automatic_options is None:
>             if "OPTIONS" not in methods:
>                 provide_automatic_options = True
>                 required_methods.add("OPTIONS")
>             else:
>                 provide_automatic_options = False
>     
>         # Add the required methods now.
>         methods |= required_methods
>     
>         rule = self.url_rule_class(rule, methods=methods, **options)
>         rule.provide_automatic_options = provide_automatic_options  # type: ignore
>     
>         self.url_map.add(rule)
>         if view_func is not None:
>             old_func = self.view_functions.get(endpoint)
>             if old_func is not None and old_func != view_func:
> >               raise AssertionError(
>                     "View function mapping is overwriting an existing"
>                     f" endpoint function: {endpoint}"
>                 )
> E               AssertionError: View function mapping is overwriting an existing endpoint function: static
> 
> /usr/lib/python3/dist-packages/flask/app.py:1092: AssertionError
> _________________________ TestWeb.test_public_mode_on __________________________
> 
> self = <tests.test_onionshare_web.TestWeb object at 0x7f8bb4d9c5e0>
> common_obj = <onionshare.common.Common object at 0x7f8bb4d9cf10>
> 
>     def test_public_mode_on(self, common_obj):
> >       web = web_obj(common_obj, "receive")
> 
> tests/test_onionshare_web.py:149: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> tests/test_onionshare_web.py:48: in web_obj
>     web = Web(common_obj, False, mode)
> onionshare/web/web.py:77: in __init__
>     self.generate_static_url_path()
> onionshare/web/web.py:166: in generate_static_url_path
>     self.app.add_url_rule(
> /usr/lib/python3/dist-packages/flask/scaffold.py:56: in wrapper_func
>     return f(self, *args, **kwargs)
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <Flask 'onionshare.web.web'>
> rule = <Rule '/static_esozljwz3ijwsxm2kdprh5ty7q/<filename>' (GET, OPTIONS, HEAD) -> static>
> endpoint = 'static'
> view_func = <bound method Scaffold.send_static_file of <Flask 'onionshare.web.web'>>
> provide_automatic_options = True, options = {'endpoint': 'static'}
> methods = {'GET', 'OPTIONS'}, required_methods = {'OPTIONS'}
> old_func = <function Flask.__init__.<locals>.<lambda> at 0x7f8bb4fdba60>
> 
>     @setupmethod
>     def add_url_rule(
>         self,
>         rule: str,
>         endpoint: t.Optional[str] = None,
>         view_func: t.Optional[t.Callable] = None,
>         provide_automatic_options: t.Optional[bool] = None,
>         **options: t.Any,
>     ) -> None:
>         if endpoint is None:
>             endpoint = _endpoint_from_view_func(view_func)  # type: ignore
>         options["endpoint"] = endpoint
>         methods = options.pop("methods", None)
>     
>         # if the methods are not given and the view_func object knows its
>         # methods we can use that instead.  If neither exists, we go with
>         # a tuple of only ``GET`` as default.
>         if methods is None:
>             methods = getattr(view_func, "methods", None) or ("GET",)
>         if isinstance(methods, str):
>             raise TypeError(
>                 "Allowed methods must be a list of strings, for"
>                 ' example: @app.route(..., methods=["POST"])'
>             )
>         methods = {item.upper() for item in methods}
>     
>         # Methods that should always be added
>         required_methods = set(getattr(view_func, "required_methods", ()))
>     
>         # starting with Flask 0.8 the view_func object can disable and
>         # force-enable the automatic options handling.
>         if provide_automatic_options is None:
>             provide_automatic_options = getattr(
>                 view_func, "provide_automatic_options", None
>             )
>     
>         if provide_automatic_options is None:
>             if "OPTIONS" not in methods:
>                 provide_automatic_options = True
>                 required_methods.add("OPTIONS")
>             else:
>                 provide_automatic_options = False
>     
>         # Add the required methods now.
>         methods |= required_methods
>     
>         rule = self.url_rule_class(rule, methods=methods, **options)
>         rule.provide_automatic_options = provide_automatic_options  # type: ignore
>     
>         self.url_map.add(rule)
>         if view_func is not None:
>             old_func = self.view_functions.get(endpoint)
>             if old_func is not None and old_func != view_func:
> >               raise AssertionError(
>                     "View function mapping is overwriting an existing"
>                     f" endpoint function: {endpoint}"
>                 )
> E               AssertionError: View function mapping is overwriting an existing endpoint function: static
> 
> /usr/lib/python3/dist-packages/flask/app.py:1092: AssertionError
> _________________________ TestWeb.test_public_mode_off _________________________
> 
> self = <tests.test_onionshare_web.TestWeb object at 0x7f8bb4f7a070>
> common_obj = <onionshare.common.Common object at 0x7f8bb4f76700>
> 
>     def test_public_mode_off(self, common_obj):
> >       web = web_obj(common_obj, "receive")
> 
> tests/test_onionshare_web.py:159: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> tests/test_onionshare_web.py:48: in web_obj
>     web = Web(common_obj, False, mode)
> onionshare/web/web.py:77: in __init__
>     self.generate_static_url_path()
> onionshare/web/web.py:166: in generate_static_url_path
>     self.app.add_url_rule(
> /usr/lib/python3/dist-packages/flask/scaffold.py:56: in wrapper_func
>     return f(self, *args, **kwargs)
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <Flask 'onionshare.web.web'>
> rule = <Rule '/static_xw6au6nmq6k5du364thvcy66tu/<filename>' (GET, OPTIONS, HEAD) -> static>
> endpoint = 'static'
> view_func = <bound method Scaffold.send_static_file of <Flask 'onionshare.web.web'>>
> provide_automatic_options = True, options = {'endpoint': 'static'}
> methods = {'GET', 'OPTIONS'}, required_methods = {'OPTIONS'}
> old_func = <function Flask.__init__.<locals>.<lambda> at 0x7f8bb50945e0>
> 
>     @setupmethod
>     def add_url_rule(
>         self,
>         rule: str,
>         endpoint: t.Optional[str] = None,
>         view_func: t.Optional[t.Callable] = None,
>         provide_automatic_options: t.Optional[bool] = None,
>         **options: t.Any,
>     ) -> None:
>         if endpoint is None:
>             endpoint = _endpoint_from_view_func(view_func)  # type: ignore
>         options["endpoint"] = endpoint
>         methods = options.pop("methods", None)
>     
>         # if the methods are not given and the view_func object knows its
>         # methods we can use that instead.  If neither exists, we go with
>         # a tuple of only ``GET`` as default.
>         if methods is None:
>             methods = getattr(view_func, "methods", None) or ("GET",)
>         if isinstance(methods, str):
>             raise TypeError(
>                 "Allowed methods must be a list of strings, for"
>                 ' example: @app.route(..., methods=["POST"])'
>             )
>         methods = {item.upper() for item in methods}
>     
>         # Methods that should always be added
>         required_methods = set(getattr(view_func, "required_methods", ()))
>     
>         # starting with Flask 0.8 the view_func object can disable and
>         # force-enable the automatic options handling.
>         if provide_automatic_options is None:
>             provide_automatic_options = getattr(
>                 view_func, "provide_automatic_options", None
>             )
>     
>         if provide_automatic_options is None:
>             if "OPTIONS" not in methods:
>                 provide_automatic_options = True
>                 required_methods.add("OPTIONS")
>             else:
>                 provide_automatic_options = False
>     
>         # Add the required methods now.
>         methods |= required_methods
>     
>         rule = self.url_rule_class(rule, methods=methods, **options)
>         rule.provide_automatic_options = provide_automatic_options  # type: ignore
>     
>         self.url_map.add(rule)
>         if view_func is not None:
>             old_func = self.view_functions.get(endpoint)
>             if old_func is not None and old_func != view_func:
> >               raise AssertionError(
>                     "View function mapping is overwriting an existing"
>                     f" endpoint function: {endpoint}"
>                 )
> E               AssertionError: View function mapping is overwriting an existing endpoint function: static
> 
> /usr/lib/python3/dist-packages/flask/app.py:1092: AssertionError
> =============================== warnings summary ===============================
> onionshare/settings.py:179
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare/settings.py:179: DeprecationWarning: invalid escape sequence \O
>     return os.path.expanduser("~\OnionShare")
> 
> tests/conftest.py:55
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/conftest.py:55: PytestDeprecationWarning: @pytest.yield_fixture is deprecated.
>   Use @pytest.fixture instead; they are the same.
>     def temp_dir_1024_delete():
> 
> tests/conftest.py:79
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/conftest.py:79: PytestDeprecationWarning: @pytest.yield_fixture is deprecated.
>   Use @pytest.fixture instead; they are the same.
>     def temp_file_1024_delete():
> 
> tests/conftest.py:92
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/conftest.py:92: PytestDeprecationWarning: @pytest.yield_fixture is deprecated.
>   Use @pytest.fixture instead; they are the same.
>     @pytest.yield_fixture(scope="session")
> 
> tests/conftest.py:105
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/conftest.py:105: PytestDeprecationWarning: @pytest.yield_fixture is deprecated.
>   Use @pytest.fixture instead; they are the same.
>     @pytest.yield_fixture(scope="session")
> 
> onionshare_gui/settings_dialog.py:1423
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/settings_dialog.py:1423: DeprecationWarning: invalid escape sequence \s
>     "(obfs4\s+)?(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]):([0-9]+)(\s+)([A-Z0-9]+)(.+)$"
> 
> onionshare_gui/settings_dialog.py:1426
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/settings_dialog.py:1426: DeprecationWarning: invalid escape sequence \s
>     "(obfs4\s+)?\[(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\]:[0-9]+\s+[A-Z0-9]+(.+)$"
> 
> onionshare_gui/settings_dialog.py:1429
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/onionshare_gui/settings_dialog.py:1429: DeprecationWarning: invalid escape sequence \s
>     "(meek_lite)(\s)+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+)(\s)+([0-9A-Z]+)(\s)+url=(.+)(\s)+front=(.+)"
> 
> tests/local_onionshare_401_public_mode_skips_ratelimit_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_401_public_mode_skips_ratelimit_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_401_triggers_ratelimit_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_401_triggers_ratelimit_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_quitting_during_share_prompts_warning_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_quitting_during_share_prompts_warning_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_receive_mode_clear_all_button_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_receive_mode_clear_all_button_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_receive_mode_timer_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_receive_mode_timer_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_receive_mode_upload_non_writable_dir_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_receive_mode_upload_non_writable_dir_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_receive_mode_upload_public_mode_non_writable_dir_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_receive_mode_upload_public_mode_non_writable_dir_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_receive_mode_upload_public_mode_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_receive_mode_upload_public_mode_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_receive_mode_upload_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_receive_mode_upload_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_settings_dialog_legacy_tor_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_settings_dialog_legacy_tor_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_settings_dialog_no_tor_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_settings_dialog_no_tor_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_settings_dialog_v3_tor_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_settings_dialog_v3_tor_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_autostart_and_autostop_timer_mismatch_test.py:22
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_autostart_and_autostop_timer_mismatch_test.py:22: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_autostart_timer_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_autostart_timer_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_autostart_timer_too_short_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_autostart_timer_too_short_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_cancel_share_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_cancel_share_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_clear_all_button_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_clear_all_button_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_download_public_mode_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_download_public_mode_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_download_stay_open_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_download_stay_open_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_download_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_download_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_individual_file_view_stay_open_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_individual_file_view_stay_open_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_individual_file_view_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_individual_file_view_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_large_download_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_large_download_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_password_persistent_test.py:23
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_password_persistent_test.py:23: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_timer_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_timer_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_timer_too_short_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_timer_too_short_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_share_mode_unreadable_file_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_share_mode_unreadable_file_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_website_mode_csp_enabled_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_website_mode_csp_enabled_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/local_onionshare_website_mode_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/local_onionshare_website_mode_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_790_cancel_on_second_share_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_790_cancel_on_second_share_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_790_cancel_on_second_share_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_790_cancel_on_second_share_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> tests/onionshare_receive_mode_upload_public_mode_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_receive_mode_upload_public_mode_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_receive_mode_upload_public_mode_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_receive_mode_upload_public_mode_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> tests/onionshare_receive_mode_upload_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_receive_mode_upload_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_receive_mode_upload_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_receive_mode_upload_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> tests/onionshare_share_mode_cancel_share_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_cancel_share_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_share_mode_cancel_share_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_cancel_share_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> tests/onionshare_share_mode_download_public_mode_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_download_public_mode_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_share_mode_download_public_mode_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_download_public_mode_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> tests/onionshare_share_mode_download_stay_open_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_download_stay_open_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_share_mode_download_stay_open_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_download_stay_open_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> tests/onionshare_share_mode_download_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_download_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_share_mode_download_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_download_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> tests/onionshare_share_mode_persistent_test.py:24
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_persistent_test.py:24: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_share_mode_persistent_test.py:25
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_persistent_test.py:25: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> tests/onionshare_share_mode_stealth_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_stealth_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_share_mode_stealth_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_stealth_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> tests/onionshare_share_mode_timer_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_timer_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_share_mode_timer_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_timer_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> tests/onionshare_share_mode_tor_connection_killed_test.py:14
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_tor_connection_killed_test.py:14: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_share_mode_tor_connection_killed_test.py:15
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_tor_connection_killed_test.py:15: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> tests/onionshare_share_mode_v2_onion_test.py:18
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_v2_onion_test.py:18: PytestUnknownMarkWarning: Unknown pytest.mark.gui - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.gui
> 
> tests/onionshare_share_mode_v2_onion_test.py:19
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build/tests/onionshare_share_mode_v2_onion_test.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.tor - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
>     @pytest.mark.tor
> 
> -- Docs: https://docs.pytest.org/en/stable/warnings.html
> =========================== short test summary info ============================
> FAILED tests/test_onionshare_web.py::TestWeb::test_share_mode - AssertionErro...
> FAILED tests/test_onionshare_web.py::TestWeb::test_share_mode_close_after_first_download_on
> FAILED tests/test_onionshare_web.py::TestWeb::test_share_mode_close_after_first_download_off
> FAILED tests/test_onionshare_web.py::TestWeb::test_receive_mode - AssertionEr...
> FAILED tests/test_onionshare_web.py::TestWeb::test_public_mode_on - Assertion...
> FAILED tests/test_onionshare_web.py::TestWeb::test_public_mode_off - Assertio...
> ============ 6 failed, 243 passed, 41 skipped, 61 warnings in 0.85s ============
> E: pybuild pybuild:354: test: plugin distutils failed with: exit code=1: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9/build; python3.9 -m pytest tests
> dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p 3.9 returned exit code 13


The full build log is available from:
http://qa-logs.debian.net/2021/10/23/onionshare_2.2-3_unstable.log

A list of current common problems and possible solutions is available at
http://wiki.debian.org/qa.debian.org/FTBFS . You're welcome to contribute!

If you reassign this bug to another package, please marking it as 'affects'-ing
this package. See https://www.debian.org/Bugs/server-control#affects

If you fail to reproduce this, please provide a build log and diff it with mine
so that we can identify if something relevant changed in the meantime.



More information about the Pkg-privacy-maintainers mailing list