|
34 | 34 | from multiprocessing.util import _cleanup_tests as multiprocessing_cleanup_tests |
35 | 35 | from test.test_asyncio import utils as test_utils |
36 | 36 | from test import support |
| 37 | +from test.support import os_helper |
37 | 38 | from test.support import socket_helper |
38 | 39 | from test.support import threading_helper |
39 | 40 | from test.support import ALWAYS_EQ, LARGEST, SMALLEST |
@@ -3049,5 +3050,100 @@ def test_get_loop(self): |
3049 | 3050 | events.AbstractServer().get_loop() |
3050 | 3051 |
|
3051 | 3052 |
|
| 3053 | +@unittest.skipIf(sys.platform == 'win32', 'Unix pipe transport semantics') |
| 3054 | +class UnixPipeObjectSupportTests(unittest.TestCase): |
| 3055 | + def setUp(self): |
| 3056 | + super().setUp() |
| 3057 | + self.loop = asyncio.SelectorEventLoop() |
| 3058 | + self.addCleanup(self.loop.close) |
| 3059 | + |
| 3060 | + def check_accepted(self, connect, pipeobj): |
| 3061 | + lost = self.loop.create_future() |
| 3062 | + |
| 3063 | + class Proto(asyncio.Protocol): |
| 3064 | + def connection_lost(self, exc): |
| 3065 | + if not lost.done(): |
| 3066 | + lost.set_result(exc) |
| 3067 | + |
| 3068 | + async def run(): |
| 3069 | + transport, protocol = await connect(Proto, pipeobj) |
| 3070 | + self.assertIsInstance(protocol, Proto) |
| 3071 | + self.assertFalse(pipeobj.closed) |
| 3072 | + transport.close() |
| 3073 | + self.assertIsNone(await lost) |
| 3074 | + |
| 3075 | + self.loop.run_until_complete(run()) |
| 3076 | + self.assertTrue(pipeobj.closed) |
| 3077 | + |
| 3078 | + def check_rejected(self, connect, pipeobj): |
| 3079 | + self.addCleanup(pipeobj.close) |
| 3080 | + with self.assertRaisesRegex(ValueError, 'Pipe transport is'): |
| 3081 | + self.loop.run_until_complete(connect(asyncio.Protocol, pipeobj)) |
| 3082 | + |
| 3083 | + def test_read_pipe(self): |
| 3084 | + rfd, wfd = os.pipe() |
| 3085 | + self.addCleanup(os.close, wfd) |
| 3086 | + self.check_accepted(self.loop.connect_read_pipe, open(rfd, 'rb', 0)) |
| 3087 | + |
| 3088 | + def test_write_pipe(self): |
| 3089 | + rfd, wfd = os.pipe() |
| 3090 | + self.addCleanup(os.close, rfd) |
| 3091 | + self.check_accepted(self.loop.connect_write_pipe, open(wfd, 'wb', 0)) |
| 3092 | + |
| 3093 | + def test_read_fifo(self): |
| 3094 | + path = os_helper.TESTFN |
| 3095 | + os.mkfifo(path) |
| 3096 | + self.addCleanup(os_helper.unlink, path) |
| 3097 | + rfd = os.open(path, os.O_RDONLY | os.O_NONBLOCK) |
| 3098 | + wfd = os.open(path, os.O_WRONLY) |
| 3099 | + self.addCleanup(os.close, wfd) |
| 3100 | + self.check_accepted(self.loop.connect_read_pipe, open(rfd, 'rb', 0)) |
| 3101 | + |
| 3102 | + def test_write_fifo(self): |
| 3103 | + path = os_helper.TESTFN |
| 3104 | + os.mkfifo(path) |
| 3105 | + self.addCleanup(os_helper.unlink, path) |
| 3106 | + rfd = os.open(path, os.O_RDONLY | os.O_NONBLOCK) |
| 3107 | + self.addCleanup(os.close, rfd) |
| 3108 | + wfd = os.open(path, os.O_WRONLY) |
| 3109 | + self.check_accepted(self.loop.connect_write_pipe, open(wfd, 'wb', 0)) |
| 3110 | + |
| 3111 | + def test_read_socket(self): |
| 3112 | + rsock, wsock = socket.socketpair() |
| 3113 | + self.addCleanup(wsock.close) |
| 3114 | + self.check_accepted(self.loop.connect_read_pipe, |
| 3115 | + open(rsock.detach(), 'rb', 0)) |
| 3116 | + |
| 3117 | + def test_write_socket(self): |
| 3118 | + rsock, wsock = socket.socketpair() |
| 3119 | + self.addCleanup(rsock.close) |
| 3120 | + self.check_accepted(self.loop.connect_write_pipe, |
| 3121 | + open(wsock.detach(), 'wb', 0)) |
| 3122 | + |
| 3123 | + @unittest.skipUnless(hasattr(os, 'openpty'), 'need os.openpty()') |
| 3124 | + def test_read_character_device(self): |
| 3125 | + master, slave = os.openpty() |
| 3126 | + self.addCleanup(os.close, slave) |
| 3127 | + self.check_accepted(self.loop.connect_read_pipe, open(master, 'rb', 0)) |
| 3128 | + |
| 3129 | + @unittest.skipUnless(hasattr(os, 'openpty'), 'need os.openpty()') |
| 3130 | + def test_write_character_device(self): |
| 3131 | + master, slave = os.openpty() |
| 3132 | + self.addCleanup(os.close, master) |
| 3133 | + self.check_accepted(self.loop.connect_write_pipe, open(slave, 'wb', 0)) |
| 3134 | + |
| 3135 | + def test_read_regular_file(self): |
| 3136 | + self.addCleanup(os_helper.unlink, os_helper.TESTFN) |
| 3137 | + with open(os_helper.TESTFN, 'wb') as f: |
| 3138 | + f.write(b'spam') |
| 3139 | + self.check_rejected(self.loop.connect_read_pipe, |
| 3140 | + open(os_helper.TESTFN, 'rb', 0)) |
| 3141 | + |
| 3142 | + def test_write_regular_file(self): |
| 3143 | + self.addCleanup(os_helper.unlink, os_helper.TESTFN) |
| 3144 | + self.check_rejected(self.loop.connect_write_pipe, |
| 3145 | + open(os_helper.TESTFN, 'wb', 0)) |
| 3146 | + |
| 3147 | + |
3052 | 3148 | if __name__ == '__main__': |
3053 | 3149 | unittest.main() |
0 commit comments