/
usr
/
lib
/
python3
/
dist-packages
/
twisted
/
test
/
/usr/lib/python3/dist-packages/twisted/test
mkdir
upload
Name
Size
Mode
Actions
__pycache__/
-
0755
rm
cert.pem.no_trailing_newline
1414
0644
edit
dl
rm
crash_test_dummy.py
543
0644
edit
dl
rm
iosim.py
17843
0644
edit
dl
rm
key.pem.no_trailing_newline
1707
0644
edit
dl
rm
mock_win32process.py
1499
0644
edit
dl
rm
myrebuilder1.py
158
0644
edit
dl
rm
myrebuilder2.py
158
0644
edit
dl
rm
plugin_basic.py
943
0644
edit
dl
rm
plugin_extra1.py
407
0644
edit
dl
rm
plugin_extra2.py
579
0644
edit
dl
rm
process_cmdline.py
162
0644
edit
dl
rm
process_echoer.py
214
0644
edit
dl
rm
process_fds.py
945
0644
edit
dl
rm
process_getargv.py
283
0644
edit
dl
rm
process_getenv.py
268
0644
edit
dl
rm
process_linger.py
286
0644
edit
dl
rm
process_reader.py
188
0644
edit
dl
rm
process_signal.py
214
0644
edit
dl
rm
process_stdinreader.py
857
0644
edit
dl
rm
process_tester.py
1035
0644
edit
dl
rm
process_tty.py
130
0644
edit
dl
rm
process_twisted.py
1206
0644
edit
dl
rm
proto_helpers.py
28687
0644
edit
dl
rm
raiser.cpython-38-x86_64-linux-gnu.so
23864
0644
edit
dl
rm
reflect_helper_IE.py
61
0644
edit
dl
rm
reflect_helper_VE.py
82
0644
edit
dl
rm
reflect_helper_ZDE.py
47
0644
edit
dl
rm
server.pem
4444
0644
edit
dl
rm
ssl_helpers.py
1032
0644
edit
dl
rm
stdio_test_consumer.py
1216
0644
edit
dl
rm
stdio_test_halfclose.py
1938
0644
edit
dl
rm
stdio_test_hostpeer.py
1021
0644
edit
dl
rm
stdio_test_lastwrite.py
1206
0644
edit
dl
rm
stdio_test_loseconn.py
1548
0644
edit
dl
rm
stdio_test_producer.py
1507
0644
edit
dl
rm
stdio_test_write.py
923
0644
edit
dl
rm
stdio_test_writeseq.py
915
0644
edit
dl
rm
testutils.py
5321
0644
edit
dl
rm
test_abstract.py
3497
0644
edit
dl
rm
test_adbapi.py
26148
0644
edit
dl
rm
test_amp.py
110553
0644
edit
dl
rm
test_application.py
32816
0644
edit
dl
rm
test_compat.py
29278
0644
edit
dl
rm
test_context.py
1515
0644
edit
dl
rm
test_cooperator.py
21467
0644
edit
dl
rm
test_defer.py
103407
0644
edit
dl
rm
test_defgen.py
10701
0644
edit
dl
rm
test_dict.py
1442
0644
edit
dl
rm
test_dirdbm.py
6695
0644
edit
dl
rm
test_error.py
8593
0644
edit
dl
rm
test_factories.py
4637
0644
edit
dl
rm
test_failure.py
32288
0644
edit
dl
rm
test_fdesc.py
7371
0644
edit
dl
rm
test_finger.py
1997
0644
edit
dl
rm
test_formmethod.py
3645
0644
edit
dl
rm
test_ftp.py
130321
0644
edit
dl
rm
test_ftp_options.py
2685
0644
edit
dl
rm
test_htb.py
3190
0644
edit
dl
rm
test_ident.py
7015
0644
edit
dl
rm
test_internet.py
46422
0644
edit
dl
rm
test_iosim.py
9060
0644
edit
dl
rm
test_iutils.py
13445
0644
edit
dl
rm
test_lockfile.py
15506
0644
edit
dl
rm
test_log.py
36330
0644
edit
dl
rm
test_logfile.py
18227
0644
edit
dl
rm
test_loopback.py
14486
0644
edit
dl
rm
test_main.py
2501
0644
edit
dl
rm
test_memcache.py
25143
0644
edit
dl
rm
test_modules.py
17888
0644
edit
dl
rm
test_monkey.py
5637
0644
edit
dl
rm
test_nooldstyle.py
5955
0644
edit
dl
rm
test_paths.py
74357
0644
edit
dl
rm
test_pcp.py
12551
0644
edit
dl
rm
test_persisted.py
14624
0644
edit
dl
rm
test_plugin.py
26113
0644
edit
dl
rm
test_policies.py
33499
0644
edit
dl
rm
test_postfix.py
4243
0644
edit
dl
rm
test_process.py
86120
0644
edit
dl
rm
test_protocols.py
7450
0644
edit
dl
rm
test_randbytes.py
3357
0644
edit
dl
rm
test_rebuild.py
8495
0644
edit
dl
rm
test_reflect.py
26085
0644
edit
dl
rm
test_roots.py
1812
0644
edit
dl
rm
test_shortcut.py
1991
0644
edit
dl
rm
test_sip.py
25284
0644
edit
dl
rm
test_sob.py
5632
0644
edit
dl
rm
test_socks.py
17738
0644
edit
dl
rm
test_ssl.py
23846
0644
edit
dl
rm
test_sslverify.py
113322
0644
edit
dl
rm
test_stateful.py
2021
0644
edit
dl
rm
test_stdio.py
13156
0644
edit
dl
rm
test_strerror.py
5183
0644
edit
dl
rm
test_stringtransport.py
13264
0644
edit
dl
rm
test_strports.py
1797
0644
edit
dl
rm
test_task.py
39326
0644
edit
dl
rm
test_tcp.py
65820
0644
edit
dl
rm
test_tcp_internals.py
13117
0644
edit
dl
rm
test_text.py
6456
0644
edit
dl
rm
test_threadable.py
3738
0644
edit
dl
rm
test_threadpool.py
22204
0644
edit
dl
rm
test_threads.py
13268
0644
edit
dl
rm
test_tpfile.py
1601
0644
edit
dl
rm
test_twistd.py
74201
0644
edit
dl
rm
test_twisted.py
11173
0644
edit
dl
rm
test_udp.py
24676
0644
edit
dl
rm
test_unix.py
15157
0644
edit
dl
rm
test_usage.py
23645
0644
edit
dl
rm
__init__.py
103
0644
edit
dl
rm
Edit:
/usr/lib/python3/dist-packages/twisted/test/test_tcp_internals.py
(13117B)
# Copyright (c) Twisted Matrix Laboratories. # See LICENSE for details. """ Whitebox tests for TCP APIs. """ from __future__ import division, absolute_import import errno, socket, os try: import resource except ImportError: resource = None from twisted.trial.unittest import TestCase from twisted.python import compat, log from twisted.internet.tcp import ( _ACCEPT_ERRORS, ECONNABORTED, EPERM, ENOMEM, ENFILE, EAGAIN, EMFILE, ENOBUFS, EINPROGRESS, EWOULDBLOCK, Port, ) from twisted.internet.protocol import Protocol, ServerFactory from twisted.python.runtime import platform from twisted.internet.defer import maybeDeferred, gatherResults from twisted.internet import reactor, interfaces class PlatformAssumptionsTests(TestCase): """ Test assumptions about platform behaviors. """ socketLimit = 8192 def setUp(self): self.openSockets = [] if resource is not None: # On some buggy platforms we might leak FDs, and the test will # fail creating the initial two sockets we *do* want to # succeed. So, we make the soft limit the current number of fds # plus two more (for the two sockets we want to succeed). If we've # leaked too many fds for that to work, there's nothing we can # do. from twisted.internet.process import _listOpenFDs newLimit = len(_listOpenFDs()) + 2 self.originalFileLimit = resource.getrlimit(resource.RLIMIT_NOFILE) resource.setrlimit(resource.RLIMIT_NOFILE, (newLimit, self.originalFileLimit[1])) self.socketLimit = newLimit + 100 def tearDown(self): while self.openSockets: self.openSockets.pop().close() if resource is not None: # `macOS` implicitly lowers the hard limit in the setrlimit call # above. Retrieve the new hard limit to pass in to this # setrlimit call, so that it doesn't give us a permission denied # error. currentHardLimit = resource.getrlimit(resource.RLIMIT_NOFILE)[1] newSoftLimit = min(self.originalFileLimit[0], currentHardLimit) resource.setrlimit(resource.RLIMIT_NOFILE, (newSoftLimit, currentHardLimit)) def socket(self): """ Create and return a new socket object, also tracking it so it can be closed in the test tear down. """ s = socket.socket() self.openSockets.append(s) return s def test_acceptOutOfFiles(self): """ Test that the platform accept(2) call fails with either L{EMFILE} or L{ENOBUFS} when there are too many file descriptors open. """ # Make a server to which to connect port = self.socket() port.bind(('127.0.0.1', 0)) serverPortNumber = port.getsockname()[1] port.listen(5) # Make a client to use to connect to the server client = self.socket() client.setblocking(False) # Use up all the rest of the file descriptors. for i in range(self.socketLimit): try: self.socket() except socket.error as e: if e.args[0] in (EMFILE, ENOBUFS): # The desired state has been achieved. break else: # Some unexpected error occurred. raise else: self.fail("Could provoke neither EMFILE nor ENOBUFS from platform.") # Non-blocking connect is supposed to fail, but this is not true # everywhere (e.g. freeBSD) self.assertIn(client.connect_ex(('127.0.0.1', serverPortNumber)), (0, EINPROGRESS)) # Make sure that the accept call fails in the way we expect. exc = self.assertRaises(socket.error, port.accept) self.assertIn(exc.args[0], (EMFILE, ENOBUFS)) if platform.getType() == "win32": test_acceptOutOfFiles.skip = ( "Windows requires an unacceptably large amount of resources to " "provoke this behavior in the naive manner.") class SelectReactorTests(TestCase): """ Tests for select-specific failure conditions. """ def setUp(self): self.ports = [] self.messages = [] log.addObserver(self.messages.append) def tearDown(self): log.removeObserver(self.messages.append) return gatherResults([ maybeDeferred(p.stopListening) for p in self.ports]) def port(self, portNumber, factory, interface): """ Create, start, and return a new L{Port}, also tracking it so it can be stopped in the test tear down. """ p = Port(portNumber, factory, interface=interface) p.startListening() self.ports.append(p) return p def _acceptFailureTest(self, socketErrorNumber): """ Test behavior in the face of an exception from C{accept(2)}. On any exception which indicates the platform is unable or unwilling to allocate further resources to us, the existing port should remain listening, a message should be logged, and the exception should not propagate outward from doRead. @param socketErrorNumber: The errno to simulate from accept. """ class FakeSocket(object): """ Pretend to be a socket in an overloaded system. """ def accept(self): raise socket.error( socketErrorNumber, os.strerror(socketErrorNumber)) factory = ServerFactory() port = self.port(0, factory, interface='127.0.0.1') self.patch(port, "socket", FakeSocket()) port.doRead() expectedFormat = "Could not accept new connection ({acceptError})" expectedErrorCode = errno.errorcode[socketErrorNumber] matchingMessages = [ (msg.get('log_format') == expectedFormat and msg.get('acceptError') == expectedErrorCode) for msg in self.messages ] self.assertGreater(len(matchingMessages), 0, "Log event for failed accept not found in " "%r" % (self.messages,)) def test_tooManyFilesFromAccept(self): """ C{accept(2)} can fail with C{EMFILE} when there are too many open file descriptors in the process. Test that this doesn't negatively impact any other existing connections. C{EMFILE} mainly occurs on Linux when the open file rlimit is encountered. """ return self._acceptFailureTest(EMFILE) def test_noBufferSpaceFromAccept(self): """ Similar to L{test_tooManyFilesFromAccept}, but test the case where C{accept(2)} fails with C{ENOBUFS}. This mainly occurs on Windows and FreeBSD, but may be possible on Linux and other platforms as well. """ return self._acceptFailureTest(ENOBUFS) def test_connectionAbortedFromAccept(self): """ Similar to L{test_tooManyFilesFromAccept}, but test the case where C{accept(2)} fails with C{ECONNABORTED}. It is not clear whether this is actually possible for TCP connections on modern versions of Linux. """ return self._acceptFailureTest(ECONNABORTED) def test_noFilesFromAccept(self): """ Similar to L{test_tooManyFilesFromAccept}, but test the case where C{accept(2)} fails with C{ENFILE}. This can occur on Linux when the system has exhausted (!) its supply of inodes. """ return self._acceptFailureTest(ENFILE) if platform.getType() == 'win32': test_noFilesFromAccept.skip = "Windows accept(2) cannot generate ENFILE" def test_noMemoryFromAccept(self): """ Similar to L{test_tooManyFilesFromAccept}, but test the case where C{accept(2)} fails with C{ENOMEM}. On Linux at least, this can sensibly occur, even in a Python program (which eats memory like no ones business), when memory has become fragmented or low memory has been filled (d_alloc calls kmem_cache_alloc calls kmalloc - kmalloc only allocates out of low memory). """ return self._acceptFailureTest(ENOMEM) if platform.getType() == 'win32': test_noMemoryFromAccept.skip = ( "Windows accept(2) cannot generate ENOMEM") def test_acceptScaling(self): """ L{tcp.Port.doRead} increases the number of consecutive C{accept} calls it performs if all of the previous C{accept} calls succeed; otherwise, it reduces the number to the amount of successful calls. """ factory = ServerFactory() factory.protocol = Protocol port = self.port(0, factory, interface='127.0.0.1') self.addCleanup(port.stopListening) clients = [] def closeAll(): for client in clients: client.close() self.addCleanup(closeAll) def connect(): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(("127.0.0.1", port.getHost().port)) return client clients.append(connect()) port.numberAccepts = 1 port.doRead() self.assertGreater(port.numberAccepts, 1) clients.append(connect()) port.doRead() # There was only one outstanding client connection, so only # one accept(2) was possible. self.assertEqual(port.numberAccepts, 1) port.doRead() # There were no outstanding client connections, so only one # accept should be tried next. self.assertEqual(port.numberAccepts, 1) def test_permissionFailure(self): """ C{accept(2)} returning C{EPERM} is treated as a transient failure and the call retried no more than the maximum number of consecutive C{accept(2)} calls. """ maximumNumberOfAccepts = 123 acceptCalls = [0] class FakeSocketWithAcceptLimit(object): """ Pretend to be a socket in an overloaded system whose C{accept} method can only be called C{maximumNumberOfAccepts} times. """ def accept(oself): acceptCalls[0] += 1 if acceptCalls[0] > maximumNumberOfAccepts: self.fail("Maximum number of accept calls exceeded.") raise socket.error(EPERM, os.strerror(EPERM)) # Verify that FakeSocketWithAcceptLimit.accept() fails the # test if the number of accept calls exceeds the maximum. for _ in range(maximumNumberOfAccepts): self.assertRaises(socket.error, FakeSocketWithAcceptLimit().accept) self.assertRaises(self.failureException, FakeSocketWithAcceptLimit().accept) acceptCalls = [0] factory = ServerFactory() port = self.port(0, factory, interface='127.0.0.1') port.numberAccepts = 123 self.patch(port, "socket", FakeSocketWithAcceptLimit()) # This should not loop infinitely. port.doRead() # This is scaled down to 1 because no accept(2)s returned # successfully. self.assertEquals(port.numberAccepts, 1) if platform.getType() == 'win32': test_permissionFailure.skip = ( "Windows accept(2) cannot generate EPERM") def test_unknownSocketErrorRaise(self): """ A C{socket.error} raised by C{accept(2)} whose C{errno} is unknown to the recovery logic is logged. """ knownErrors = list(_ACCEPT_ERRORS) knownErrors.extend([EAGAIN, EPERM, EWOULDBLOCK]) # Windows has object()s stubs for some errnos. unknownAcceptError = max( error for error in knownErrors if isinstance(error, (int, compat.long)) ) + 1 class FakeSocketWithUnknownAcceptError(object): """ Pretend to be a socket in an overloaded system whose C{accept} method can only be called C{maximumNumberOfAccepts} times. """ def accept(oself): raise socket.error(unknownAcceptError, "unknown socket error message") factory = ServerFactory() port = self.port(0, factory, interface='127.0.0.1') self.patch(port, "socket", FakeSocketWithUnknownAcceptError()) port.doRead() failures = self.flushLoggedErrors(socket.error) self.assertEqual(1, len(failures)) self.assertEqual(failures[0].value.args[0], unknownAcceptError) if not interfaces.IReactorFDSet.providedBy(reactor): skipMsg = 'This test only applies to reactors that implement IReactorFDset' PlatformAssumptionsTests.skip = skipMsg SelectReactorTests.skip = skipMsg
Save
cmd:
run