Michael Felt <aixto...@felt.demon.nl> added the comment:

from below:

In case of 3.7 first call to _ensure_resolved returns
('fe80::1', 12345, 0, 1)
then second call returns
('fe80::1', 12345, 0, 0)
Notice that scope is now completely lost and is set to 0, thus actual call to 
socket.connect is wrong

In case of 3.6 both first and second call to _ensure_resolved return
('fe80::1%lo', 12345, 0, 1)
because in 3.6 case scope info is preserved in address and second call can 
derive correct address tuple

I'll have to locate the PR I made to resolve the test issue AIX was having - 
but it seems the address format ::1%lo is not supported everywhere. FYI: I do 
not believe the PR was backported into 3.6.

** Found it:
commit 413118ebf3162418639a5c4af14b02d26571a02c
Author: Michael Felt <aixto...@users.noreply.github.com>
Date:   Fri Sep 14 01:35:56 2018 +0200

    Fix test_asyncio for AIX - do not call transport.get_extra_info('sockname') 
(#8907)

and
[3.7] bpo-34490: Fix test_asyncio for AIX - do not call 
transport.get_extra_info('sockname') (GH-8907) #9286


Since in the first call - a scope of 1 is being returned - the initial "open" 
seems to be working as expected.

Some "help" to be sure I do exactly the same tests.

**** Reading through the bpo text, my change was only to skip the test because 
quote: On AIX with AF_UNIX family sockets getsockname() does not provide 
'sockname'

and, from memory, the information being looked for is the bit after the '%' - 
aka scope.

On the one hand - the test is working - the information being returned does not 
match:

======================================================================
FAIL: test_create_connection_ipv6_scope 
(test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File 
"/home/buildbot/buildarea/3.x.aixtools-aix-power6/build/Lib/unittest/mock.py", 
line 1226, in patched
    return func(*args, **keywargs)
  File 
"/home/buildbot/buildarea/3.x.aixtools-aix-power6/build/Lib/test/test_asyncio/test_base_events.py",
 line 1316, in test_create_connection_ipv6_scope
    sock.connect.assert_called_with(('fe80::1', 80, 0, 1))
  File 
"/home/buildbot/buildarea/3.x.aixtools-aix-power6/build/Lib/unittest/mock.py", 
line 838, in assert_called_with
    raise AssertionError(_error_message()) from cause
AssertionError: expected call not found.
Expected: connect(('fe80::1', 80, 0, 1))
Actual: connect(('fe80::1', 80, 0, 0))
----------------------------------------------------------------------

What is not clear from the test is that what "expected" says, is not the same 
as the first address in the code:


        coro = self.loop.create_connection(asyncio.Protocol, 'fe80::1%1', 80)
        t, p = self.loop.run_until_complete(coro)
        try:
            sock.connect.assert_called_with(('fe80::1', 80, 0, 1))
            _, kwargs = m_socket.socket.call_args
            self.assertEqual(kwargs['family'], m_socket.AF_INET6)
            self.assertEqual(kwargs['type'], m_socket.SOCK_STREAM)
        finally:
            t.close()
            test_utils.run_briefly(self.loop)  # allow transport to close

'fe80::1%1' <> 'fe80::1' - and maybe, on AIX - the initial connection failed. 
(or maybe it has to have succeeded, or the failure message would look 
different). I am not 'experienced' with IPv6 and scope.

----------
nosy: +Michael.Felt

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue35545>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to