Exemplo n.º 1
0
    def testBindPortNumberGiven(self):
        port, close = attemptBinding(bindPort=0); close()
        PortNumberGenerator.bind(port=port)
        self.assertNotBound(bindV4(ip='127.0.0.1', port=port, protocol='tcp', reuse=True))
        if has_dual_stack():
            self.assertNotBound(bindV6(ip='::1', port=port, protocol='tcp', reuse=True))

        PortNumberGenerator.unbind(port=port)
        self.assertBoundAndUnbind(bindV4(ip='127.0.0.1', port=port, protocol='tcp', reuse=True))
        if has_dual_stack():
            self.assertBoundAndUnbind(bindV6(ip='::1', port=port, protocol='tcp', reuse=True))
Exemplo n.º 2
0
    def testUnbindPortNumberV6(self):
        if not has_dual_stack():
            return printDualStackSkipped()

        p = PortNumberGenerator.next(bind=True)
        self.assertNotBound(
            bindV4(ip='::1', port=p, protocol='tcp', reuse=True))

        PortNumberGenerator.unbind(port=p)

        self.assertBoundAndUnbind(
            bindV6(ip='::1', port=p, protocol='tcp', reuse=False)
        )  # Same IP-version, protocol, host, port combination: basically testing bindV6's close happened.
        for protocol in ['tcp', 'udp']:
            self.assertBoundAndUnbind(
                bindV4(ip='127.0.0.1', port=p, protocol=protocol, reuse=False))
            self.assertBoundAndUnbind(
                bindV4(ip='0.0.0.0', port=p, protocol=protocol, reuse=False))
            self.assertBoundAndUnbind(
                bindV6(ip='::1', port=p, protocol=protocol, reuse=False))
            self.assertBoundAndUnbind(
                bindV6(ip='::', port=p, protocol=protocol, reuse=False))
            self.assertBoundAndUnbind(
                bindV6(ip='::1',
                       port=p,
                       protocol=protocol,
                       reuse=False,
                       ipV6Only=False))
            self.assertBoundAndUnbind(
                bindV6(ip='::',
                       port=p,
                       protocol=protocol,
                       reuse=False,
                       ipV6Only=False))
Exemplo n.º 3
0
    def testBindPortNumbersGeneratedV6(self):
        if not has_dual_stack():
            return printDualStackSkipped()

        p = PortNumberGenerator.next(bind=True)
        self.assertTrue(0 < p < 65536)
        for protocol in ['tcp', 'udp']:
            for reuse in [True, False]:
                self.assertNotBound(
                    bindV4(ip='127.0.0.1',
                           port=p,
                           protocol=protocol,
                           reuse=reuse))
                self.assertNotBound(
                    bindV4(ip='0.0.0.0',
                           port=p,
                           protocol=protocol,
                           reuse=reuse))
                self.assertNotBound(
                    bindV6(ip='::1', port=p, protocol=protocol, reuse=reuse))
                self.assertNotBound(
                    bindV6(ip='::', port=p, protocol=protocol, reuse=reuse))
                self.assertNotBound(
                    bindV6(ip='::1',
                           port=p,
                           protocol=protocol,
                           reuse=reuse,
                           ipV6Only=False))
                self.assertNotBound(
                    bindV6(ip='::',
                           port=p,
                           protocol=protocol,
                           reuse=reuse,
                           ipV6Only=False))
Exemplo n.º 4
0
    def testBindPortNumberGiven(self):
        port, close = attemptBinding(bindPort=0)
        close()
        PortNumberGenerator.bind(port=port)
        self.assertNotBound(
            bindV4(ip='127.0.0.1', port=port, protocol='tcp', reuse=True))
        if has_dual_stack():
            self.assertNotBound(
                bindV6(ip='::1', port=port, protocol='tcp', reuse=True))

        PortNumberGenerator.unbind(port=port)
        self.assertBoundAndUnbind(
            bindV4(ip='127.0.0.1', port=port, protocol='tcp', reuse=True))
        if has_dual_stack():
            self.assertBoundAndUnbind(
                bindV6(ip='::1', port=port, protocol='tcp', reuse=True))
Exemplo n.º 5
0
    def testBindPortNumbersGeneratedV6(self):
        if not has_dual_stack():
            return printDualStackSkipped()

        p = PortNumberGenerator.next(bind=True)
        self.assertTrue(0 < p < 65536)
        for protocol in ['tcp', 'udp']:
            for reuse in [True, False]:
                self.assertNotBound(bindV4(ip='127.0.0.1', port=p, protocol=protocol, reuse=reuse))
                self.assertNotBound(bindV4(ip='0.0.0.0', port=p, protocol=protocol, reuse=reuse))
                self.assertNotBound(bindV6(ip='::1', port=p, protocol=protocol, reuse=reuse))
                self.assertNotBound(bindV6(ip='::', port=p, protocol=protocol, reuse=reuse))
                self.assertNotBound(bindV6(ip='::1', port=p, protocol=protocol, reuse=reuse, ipV6Only=False))
                self.assertNotBound(bindV6(ip='::', port=p, protocol=protocol, reuse=reuse, ipV6Only=False))
Exemplo n.º 6
0
    def testBindPortNumbersGenerated_withBlockSize_V6(self):
        if not has_dual_stack():
            return printDualStackSkipped()

        blockSize = 3
        p = PortNumberGenerator.next(bind=True, blockSize=blockSize)

        for consequative_p in range(p, p + blockSize):
            for protocol in ['tcp', 'udp']:
                for reuse in [False, True]:
                    self.assertNotBound(bindV4(ip='127.0.0.1', port=consequative_p, protocol=protocol, reuse=reuse))
                    self.assertNotBound(bindV4(ip='0.0.0.0', port=consequative_p, protocol=protocol, reuse=reuse))
                    self.assertNotBound(bindV6(ip='::1', port=consequative_p, protocol=protocol, reuse=reuse))
                    self.assertNotBound(bindV6(ip='::', port=consequative_p, protocol=protocol, reuse=reuse))
                    self.assertNotBound(bindV6(ip='::1', port=consequative_p, protocol=protocol, reuse=reuse, ipV6Only=False))
                    self.assertNotBound(bindV6(ip='::', port=consequative_p, protocol=protocol, reuse=reuse, ipV6Only=False))
Exemplo n.º 7
0
    def testUnbindPortNumberV6(self):
        if not has_dual_stack():
            return printDualStackSkipped()

        p = PortNumberGenerator.next(bind=True)
        self.assertNotBound(bindV4(ip='::1', port=p, protocol='tcp', reuse=True))

        PortNumberGenerator.unbind(port=p)

        self.assertBoundAndUnbind(bindV6(ip='::1', port=p, protocol='tcp', reuse=False)) # Same IP-version, protocol, host, port combination: basically testing bindV6's close happened.
        for protocol in ['tcp', 'udp']:
            self.assertBoundAndUnbind(bindV4(ip='127.0.0.1', port=p, protocol=protocol, reuse=False))
            self.assertBoundAndUnbind(bindV4(ip='0.0.0.0', port=p, protocol=protocol, reuse=False))
            self.assertBoundAndUnbind(bindV6(ip='::1', port=p, protocol=protocol, reuse=False))
            self.assertBoundAndUnbind(bindV6(ip='::', port=p, protocol=protocol, reuse=False))
            self.assertBoundAndUnbind(bindV6(ip='::1', port=p, protocol=protocol, reuse=False, ipV6Only=False))
            self.assertBoundAndUnbind(bindV6(ip='::', port=p, protocol=protocol, reuse=False, ipV6Only=False))
Exemplo n.º 8
0
    def testBindPortNumbersGenerated_withBlockSize_V6(self):
        if not has_dual_stack():
            return printDualStackSkipped()

        blockSize = 3
        p = PortNumberGenerator.next(bind=True, blockSize=blockSize)

        for consequative_p in range(p, p + blockSize):
            for protocol in ['tcp', 'udp']:
                for reuse in [False, True]:
                    self.assertNotBound(
                        bindV4(ip='127.0.0.1',
                               port=consequative_p,
                               protocol=protocol,
                               reuse=reuse))
                    self.assertNotBound(
                        bindV4(ip='0.0.0.0',
                               port=consequative_p,
                               protocol=protocol,
                               reuse=reuse))
                    self.assertNotBound(
                        bindV6(ip='::1',
                               port=consequative_p,
                               protocol=protocol,
                               reuse=reuse))
                    self.assertNotBound(
                        bindV6(ip='::',
                               port=consequative_p,
                               protocol=protocol,
                               reuse=reuse))
                    self.assertNotBound(
                        bindV6(ip='::1',
                               port=consequative_p,
                               protocol=protocol,
                               reuse=reuse,
                               ipV6Only=False))
                    self.assertNotBound(
                        bindV6(ip='::',
                               port=consequative_p,
                               protocol=protocol,
                               reuse=reuse,
                               ipV6Only=False))
Exemplo n.º 9
0
    sok.setsockopt(SOL_SOCKET, SO_REUSEADDR, (1 if reuse else 0))
    try:
        sok.bind((ip, port))
    except IOError:
        return None, None
    else:
        _host, boundPort = sok.getsockname()
        return sok, boundPort

def printDualStackSkipped():
    test_f = currentframe().f_back
    testClassName = test_f.f_locals['self'].__class__.__name__
    testFuncName = test_f.f_code.co_name
    sys.stderr.write('Skipped (no Dual-Stack support): %s.%s\n' % (testClassName, testFuncName))

if has_dual_stack():
    from socket import AF_INET6, IPPROTO_IPV6, IPV6_V6ONLY

    def bindV6(ip, port, protocol, reuse=False, ipV6Only=True):
        """
        Binds to a ip, port, protocol combination given - where protocol is the string 'tcp' or 'udp'.
        When ipV6Only is False, binds on both IPv4 and IPv6 versions of the address.
        Returns boundSok, boundPort

        boundPort only useful when binding to port 0.
        """
        if protocol == 'tcp':
            sok = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)
        elif protocol == 'udp':
            sok = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)
        else:
Exemplo n.º 10
0
    else:
        _host, boundPort = sok.getsockname()
        return sok, boundPort
    finally:
        sok.close()


def printDualStackSkipped():
    test_f = currentframe().f_back
    testClassName = test_f.f_locals['self'].__class__.__name__
    testFuncName = test_f.f_code.co_name
    sys.stderr.write('Skipped (no Dual-Stack support): %s.%s\n' %
                     (testClassName, testFuncName))


if has_dual_stack():
    from socket import AF_INET6, IPPROTO_IPV6, IPV6_V6ONLY

    def bindV6(ip, port, protocol, reuse=False, ipV6Only=True):
        """
        Binds to a ip, port, protocol combination given - where protocol is the string 'tcp' or 'udp'.
        When ipV6Only is False, binds on both IPv4 and IPv6 versions of the address.
        Returns boundSok, boundPort

        boundPort only useful when binding to port 0.
        """
        if protocol == 'tcp':
            sok = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)
        elif protocol == 'udp':
            sok = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)
        else: