MCPcopy Index your code
hub / github.com/RustPython/RustPython / test_write

Method test_write

Lib/test/test_socketserver.py:397–453  ·  view source on GitHub ↗
(self)

Source from the content-addressed store, hash-verified

395 self.assertEqual(server.wfile_fileno, server.request_fileno)
396
397 def test_write(self):
398 # Test that wfile.write() sends data immediately, and that it does
399 # not truncate sends when interrupted by a Unix signal
400 pthread_kill = test.support.get_attribute(signal, 'pthread_kill')
401
402 class Handler(socketserver.StreamRequestHandler):
403 def handle(self):
404 self.server.sent1 = self.wfile.write(b'write data\n')
405 # Should be sent immediately, without requiring flush()
406 self.server.received = self.rfile.readline()
407 big_chunk = b'\0' * test.support.SOCK_MAX_SIZE
408 self.server.sent2 = self.wfile.write(big_chunk)
409
410 server = socketserver.TCPServer((HOST, 0), Handler)
411 self.addCleanup(server.server_close)
412 interrupted = threading.Event()
413
414 def signal_handler(signum, frame):
415 interrupted.set()
416
417 original = signal.signal(signal.SIGUSR1, signal_handler)
418 self.addCleanup(signal.signal, signal.SIGUSR1, original)
419 response1 = None
420 received2 = None
421 main_thread = threading.get_ident()
422
423 def run_client():
424 s = socket.socket(server.address_family, socket.SOCK_STREAM,
425 socket.IPPROTO_TCP)
426 with s, s.makefile('rb') as reader:
427 s.connect(server.server_address)
428 nonlocal response1
429 response1 = reader.readline()
430 s.sendall(b'client response\n')
431
432 reader.read(100)
433 # The main thread should now be blocking in a send() syscall.
434 # But in theory, it could get interrupted by other signals,
435 # and then retried. So keep sending the signal in a loop, in
436 # case an earlier signal happens to be delivered at an
437 # inconvenient moment.
438 while True:
439 pthread_kill(main_thread, signal.SIGUSR1)
440 if interrupted.wait(timeout=float(1)):
441 break
442 nonlocal received2
443 received2 = len(reader.read())
444
445 background = threading.Thread(target=run_client)
446 background.start()
447 server.handle_request()
448 background.join()
449 self.assertEqual(server.sent1, len(response1))
450 self.assertEqual(response1, b'write data\n')
451 self.assertEqual(server.received, b'client response\n')
452 self.assertEqual(server.sent2, test.support.SOCK_MAX_SIZE)
453 self.assertEqual(received2, test.support.SOCK_MAX_SIZE - 100)
454

Callers

nothing calls this directly

Calls 7

startMethod · 0.95
joinMethod · 0.95
lenFunction · 0.85
addCleanupMethod · 0.80
EventMethod · 0.80
handle_requestMethod · 0.45
assertEqualMethod · 0.45

Tested by

no test coverage detected