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))
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))
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))
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))
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))
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))
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))
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))
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:
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: