python-hyper / h2

HTTP/2 State-Machine based protocol implementation
https://h2.readthedocs.io/en/stable
MIT License
963 stars 151 forks source link

Python 3.11.0b1 test failures due to repr() changes (again) #1268

Closed mgorny closed 1 year ago

mgorny commented 2 years ago

Remember the repr() changes in Python 3.10.0 betas that broke stuff and then were reverted last minute? They strike again in 3.11.0b1:

$ tox -e py311
GLOB sdist-make: /tmp/h2/setup.py
py311 inst-nodeps: /tmp/h2/.tox/.tmp/package/1/h2-4.1.0.zip
py311 installed: attrs==21.4.0,coverage==6.3.2,execnet==1.9.0,h2 @ file:///tmp/h2/.tox/.tmp/package/1/h2-4.1.0.zip,hpack==4.0.0,hyperframe==6.0.1,hypothesis==6.46.3,iniconfig==1.1.1,packaging==21.3,pluggy==1.0.0,py==1.11.0,pyparsing==3.0.9,pytest==6.2.5,pytest-cov==2.12.1,pytest-forked==1.4.0,pytest-xdist==2.5.0,sortedcontainers==2.4.0,toml==0.10.2
py311 run-test-pre: PYTHONHASHSEED='1678785281'
py311 run-test: commands[0] | pytest --cov-report=xml --cov-report=term --cov=h2
========================================================= test session starts =========================================================
platform linux -- Python 3.11.0b1, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
cachedir: .tox/py311/.pytest_cache
rootdir: /tmp/h2, configfile: setup.cfg, testpaths: test
plugins: xdist-2.5.0, cov-2.12.1, forked-1.4.0, hypothesis-6.46.3
collected 1433 items                                                                                                                  

test/test_basic_logic.py ...................................................................................................... [  7%]
............................................................................................................................... [ 15%]
............................................................................................................................... [ 24%]
............................                                                                                                    [ 26%]
test/test_closed_streams.py .....................                                                                               [ 28%]
test/test_complex_logic.py .................                                                                                    [ 29%]
test/test_config.py ..................................................................                                          [ 34%]
test/test_events.py .........F...F.F.FF.........................                                                                [ 37%]
test/test_exceptions.py .                                                                                                       [ 37%]
test/test_flow_control_window.py .............................................                                                  [ 40%]
test/test_h2_upgrade.py .............                                                                                           [ 41%]
test/test_head_request.py ..                                                                                                    [ 41%]
test/test_header_indexing.py .................................................................................................. [ 48%]
............................................................................................................................... [ 57%]
...........................................................................                                                     [ 62%]
test/test_informational_responses.py ..............................                                                             [ 64%]
test/test_interacting_stacks.py .                                                                                               [ 64%]
test/test_invalid_content_lengths.py ...                                                                                        [ 64%]
test/test_invalid_frame_sequences.py .......................                                                                    [ 66%]
test/test_invalid_headers.py .................................................................................................. [ 73%]
............................................................................................................................... [ 81%]
............................................................................................................................... [ 90%]
............                                                                                                                    [ 91%]
test/test_priority.py .......................                                                                                   [ 93%]
test/test_related_events.py .............                                                                                       [ 94%]
test/test_rfc7838.py ...................                                                                                        [ 95%]
test/test_rfc8441.py .                                                                                                          [ 95%]
test/test_settings.py ................................                                                                          [ 97%]
test/test_state_machines.py ..................                                                                                  [ 99%]
test/test_stream_reset.py .....                                                                                                 [ 99%]
test/test_utility_functions.py ........                                                                                         [100%]

============================================================== FAILURES ===============================================================
___________________________________________ TestEventReprs.test_remotesettingschanged_repr ____________________________________________

self = <test.test_events.TestEventReprs object at 0x7f8df9df95d0>

    def test_remotesettingschanged_repr(self):
        """
        RemoteSettingsChanged has a useful debug representation.
        """
        e = h2.events.RemoteSettingsChanged()
        e.changed_settings = {
            h2.settings.SettingCodes.INITIAL_WINDOW_SIZE:
                h2.settings.ChangedSetting(
                    h2.settings.SettingCodes.INITIAL_WINDOW_SIZE, 2**16, 2**15
                ),
        }

>       assert repr(e) == (
            "<RemoteSettingsChanged changed_settings:{ChangedSetting("
            "setting=SettingCodes.INITIAL_WINDOW_SIZE, original_value=65536, "
            "new_value=32768)}>"
        )
E       AssertionError: assert '<RemoteSetti...alue=32768)}>' == '<RemoteSetti...alue=32768)}>'
E         Skipping 54 identical leading characters in diff, use -v to show
E         - g(setting=SettingCodes.INITIAL_WINDOW_SIZE, original_value=65536, new_value=32768)}>
E         ?           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E         + g(setting=4, original_value=65536, new_value=32768)}>
E         ?           ^

test/test_events.py:210: AssertionError
________________________________________________ TestEventReprs.test_streamreset_repr _________________________________________________

self = <test.test_events.TestEventReprs object at 0x7f8df9eb0650>

    def test_streamreset_repr(self):
        """
        StreamEnded has a useful debug representation.
        """
        e = h2.events.StreamReset()
        e.stream_id = 919
        e.error_code = h2.errors.ErrorCodes.ENHANCE_YOUR_CALM
        e.remote_reset = False

>       assert repr(e) == (
            "<StreamReset stream_id:919, "
            "error_code:ErrorCodes.ENHANCE_YOUR_CALM, remote_reset:False>"
        )
E       AssertionError: assert '<StreamReset..._reset:False>' == '<StreamReset..._reset:False>'
E         - <StreamReset stream_id:919, error_code:ErrorCodes.ENHANCE_YOUR_CALM, remote_reset:False>
E         ?                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E         + <StreamReset stream_id:919, error_code:11, remote_reset:False>
E         ?                                        ^^

test/test_events.py:252: AssertionError
____________________________________________ TestEventReprs.test_settingsacknowledged_repr ____________________________________________

self = <test.test_events.TestEventReprs object at 0x7f8df9d45bd0>

    def test_settingsacknowledged_repr(self):
        """
        SettingsAcknowledged has a useful debug representation.
        """
        e = h2.events.SettingsAcknowledged()
        e.changed_settings = {
            h2.settings.SettingCodes.INITIAL_WINDOW_SIZE:
                h2.settings.ChangedSetting(
                    h2.settings.SettingCodes.INITIAL_WINDOW_SIZE, 2**16, 2**15
                ),
        }

>       assert repr(e) == (
            "<SettingsAcknowledged changed_settings:{ChangedSetting("
            "setting=SettingCodes.INITIAL_WINDOW_SIZE, original_value=65536, "
            "new_value=32768)}>"
        )
E       AssertionError: assert '<SettingsAck...alue=32768)}>' == '<SettingsAck...alue=32768)}>'
E         Skipping 53 identical leading characters in diff, use -v to show
E         - g(setting=SettingCodes.INITIAL_WINDOW_SIZE, original_value=65536, new_value=32768)}>
E         ?           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E         + g(setting=4, original_value=65536, new_value=32768)}>
E         ?           ^

test/test_events.py:287: AssertionError
______________________________________ TestEventReprs.test_connectionterminated_repr[None-None] _______________________________________

self = <test.test_events.TestEventReprs object at 0x7f8df9d017d0>, additional_data = None, data_repr = 'None'

    @pytest.mark.parametrize("additional_data,data_repr", [
        (None, "None"),
        (b'some data', "736f6d652064617461")
    ])
    def test_connectionterminated_repr(self, additional_data, data_repr):
        """
        ConnectionTerminated has a useful debug representation.
        """
        e = h2.events.ConnectionTerminated()
        e.error_code = h2.errors.ErrorCodes.INADEQUATE_SECURITY
        e.last_stream_id = 33
        e.additional_data = additional_data

>       assert repr(e) == (
            "<ConnectionTerminated error_code:ErrorCodes.INADEQUATE_SECURITY, "
            "last_stream_id:33, additional_data:%s>" % data_repr
        )
E       AssertionError: assert '<ConnectionT...al_data:None>' == '<ConnectionT...al_data:None>'
E         - <ConnectionTerminated error_code:ErrorCodes.INADEQUATE_SECURITY, last_stream_id:33, additional_data:None>
E         ?                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E         + <ConnectionTerminated error_code:12, last_stream_id:33, additional_data:None>
E         ?                                  ^^

test/test_events.py:321: AssertionError
_____________________________ TestEventReprs.test_connectionterminated_repr[some data-736f6d652064617461] _____________________________

self = <test.test_events.TestEventReprs object at 0x7f8df9cde890>, additional_data = b'some data', data_repr = '736f6d652064617461'

    @pytest.mark.parametrize("additional_data,data_repr", [
        (None, "None"),
        (b'some data', "736f6d652064617461")
    ])
    def test_connectionterminated_repr(self, additional_data, data_repr):
        """
        ConnectionTerminated has a useful debug representation.
        """
        e = h2.events.ConnectionTerminated()
        e.error_code = h2.errors.ErrorCodes.INADEQUATE_SECURITY
        e.last_stream_id = 33
        e.additional_data = additional_data

>       assert repr(e) == (
            "<ConnectionTerminated error_code:ErrorCodes.INADEQUATE_SECURITY, "
            "last_stream_id:33, additional_data:%s>" % data_repr
        )
E       AssertionError: assert '<ConnectionT...652064617461>' == '<ConnectionT...652064617461>'
E         - <ConnectionTerminated error_code:ErrorCodes.INADEQUATE_SECURITY, last_stream_id:33, additional_data:736f6d652064617461>
E         ?                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E         + <ConnectionTerminated error_code:12, last_stream_id:33, additional_data:736f6d652064617461>
E         ?                                  ^^

test/test_events.py:321: AssertionError

----------- coverage: platform linux, python 3.11.0-beta-1 -----------
Name                     Stmts   Miss Branch BrPart  Cover   Missing
--------------------------------------------------------------------
src/h2/__init__.py           2      0      0      0   100%
src/h2/config.py            53      0     20      0   100%
src/h2/connection.py       622      0    178      0   100%
src/h2/errors.py            23      0      2      0   100%
src/h2/events.py           138      0     56      0   100%
src/h2/exceptions.py        45      0     30      0   100%
src/h2/frame_buffer.py      63      0     26      0   100%
src/h2/settings.py         132      0     72      0   100%
src/h2/stream.py           446      0    110      0   100%
src/h2/utilities.py        225      0    130      0   100%
src/h2/windows.py           36      0     14      0   100%
--------------------------------------------------------------------
TOTAL                     1785      0    638      0   100%
Coverage XML written to file coverage.xml

Required test coverage of 100.0% reached. Total coverage: 100.00%
======================================================= short test summary info =======================================================
FAILED test/test_events.py::TestEventReprs::test_remotesettingschanged_repr - AssertionError: assert '<RemoteSetti...alue=32768)}>' ...
FAILED test/test_events.py::TestEventReprs::test_streamreset_repr - AssertionError: assert '<StreamReset..._reset:False>' == '<Strea...
FAILED test/test_events.py::TestEventReprs::test_settingsacknowledged_repr - AssertionError: assert '<SettingsAck...alue=32768)}>' =...
FAILED test/test_events.py::TestEventReprs::test_connectionterminated_repr[None-None] - AssertionError: assert '<ConnectionT...al_da...
FAILED test/test_events.py::TestEventReprs::test_connectionterminated_repr[some data-736f6d652064617461] - AssertionError: assert '<...
============================================= 5 failed, 1428 passed in 1075.64s (0:17:55) =============================================
ERROR: InvocationError for command /tmp/h2/.tox/py311/bin/pytest --cov-report=xml --cov-report=term --cov=h2 (exited with code 1)
_______________________________________________________________ summary _______________________________________________________________
ERROR:   py311: commands failed

Previous report: #1253