|
33 | 33 | from multiprocessing.util import _cleanup_tests as multiprocessing_cleanup_tests |
34 | 34 | from test.test_asyncio import utils as test_utils |
35 | 35 | from test import support |
| 36 | +from test.support import os_helper |
36 | 37 | from test.support import socket_helper |
37 | 38 | from test.support import threading_helper |
38 | 39 | from test.support import ALWAYS_EQ, LARGEST, SMALLEST |
@@ -3134,5 +3135,100 @@ def test_get_loop(self): |
3134 | 3135 | events.AbstractServer().get_loop() |
3135 | 3136 |
|
3136 | 3137 |
|
| 3138 | +@unittest.skipIf(sys.platform == 'win32', 'Unix pipe transport semantics') |
| 3139 | +class UnixPipeObjectSupportTests(unittest.TestCase): |
| 3140 | + def setUp(self): |
| 3141 | + super().setUp() |
| 3142 | + self.loop = asyncio.SelectorEventLoop() |
| 3143 | + self.addCleanup(self.loop.close) |
| 3144 | + |
| 3145 | + def check_accepted(self, connect, pipeobj): |
| 3146 | + lost = self.loop.create_future() |
| 3147 | + |
| 3148 | + class Proto(asyncio.Protocol): |
| 3149 | + def connection_lost(self, exc): |
| 3150 | + if not lost.done(): |
| 3151 | + lost.set_result(exc) |
| 3152 | + |
| 3153 | + async def run(): |
| 3154 | + transport, protocol = await connect(Proto, pipeobj) |
| 3155 | + self.assertIsInstance(protocol, Proto) |
| 3156 | + self.assertFalse(pipeobj.closed) |
| 3157 | + transport.close() |
| 3158 | + self.assertIsNone(await lost) |
| 3159 | + |
| 3160 | + self.loop.run_until_complete(run()) |
| 3161 | + self.assertTrue(pipeobj.closed) |
| 3162 | + |
| 3163 | + def check_rejected(self, connect, pipeobj): |
| 3164 | + self.addCleanup(pipeobj.close) |
| 3165 | + with self.assertRaisesRegex(ValueError, 'Pipe transport is'): |
| 3166 | + self.loop.run_until_complete(connect(asyncio.Protocol, pipeobj)) |
| 3167 | + |
| 3168 | + def test_read_pipe(self): |
| 3169 | + rfd, wfd = os.pipe() |
| 3170 | + self.addCleanup(os.close, wfd) |
| 3171 | + self.check_accepted(self.loop.connect_read_pipe, open(rfd, 'rb', 0)) |
| 3172 | + |
| 3173 | + def test_write_pipe(self): |
| 3174 | + rfd, wfd = os.pipe() |
| 3175 | + self.addCleanup(os.close, rfd) |
| 3176 | + self.check_accepted(self.loop.connect_write_pipe, open(wfd, 'wb', 0)) |
| 3177 | + |
| 3178 | + def test_read_fifo(self): |
| 3179 | + path = os_helper.TESTFN |
| 3180 | + os.mkfifo(path) |
| 3181 | + self.addCleanup(os_helper.unlink, path) |
| 3182 | + rfd = os.open(path, os.O_RDONLY | os.O_NONBLOCK) |
| 3183 | + wfd = os.open(path, os.O_WRONLY) |
| 3184 | + self.addCleanup(os.close, wfd) |
| 3185 | + self.check_accepted(self.loop.connect_read_pipe, open(rfd, 'rb', 0)) |
| 3186 | + |
| 3187 | + def test_write_fifo(self): |
| 3188 | + path = os_helper.TESTFN |
| 3189 | + os.mkfifo(path) |
| 3190 | + self.addCleanup(os_helper.unlink, path) |
| 3191 | + rfd = os.open(path, os.O_RDONLY | os.O_NONBLOCK) |
| 3192 | + self.addCleanup(os.close, rfd) |
| 3193 | + wfd = os.open(path, os.O_WRONLY) |
| 3194 | + self.check_accepted(self.loop.connect_write_pipe, open(wfd, 'wb', 0)) |
| 3195 | + |
| 3196 | + def test_read_socket(self): |
| 3197 | + rsock, wsock = socket.socketpair() |
| 3198 | + self.addCleanup(wsock.close) |
| 3199 | + self.check_accepted(self.loop.connect_read_pipe, |
| 3200 | + open(rsock.detach(), 'rb', 0)) |
| 3201 | + |
| 3202 | + def test_write_socket(self): |
| 3203 | + rsock, wsock = socket.socketpair() |
| 3204 | + self.addCleanup(rsock.close) |
| 3205 | + self.check_accepted(self.loop.connect_write_pipe, |
| 3206 | + open(wsock.detach(), 'wb', 0)) |
| 3207 | + |
| 3208 | + @unittest.skipUnless(hasattr(os, 'openpty'), 'need os.openpty()') |
| 3209 | + def test_read_character_device(self): |
| 3210 | + master, slave = os.openpty() |
| 3211 | + self.addCleanup(os.close, slave) |
| 3212 | + self.check_accepted(self.loop.connect_read_pipe, open(master, 'rb', 0)) |
| 3213 | + |
| 3214 | + @unittest.skipUnless(hasattr(os, 'openpty'), 'need os.openpty()') |
| 3215 | + def test_write_character_device(self): |
| 3216 | + master, slave = os.openpty() |
| 3217 | + self.addCleanup(os.close, master) |
| 3218 | + self.check_accepted(self.loop.connect_write_pipe, open(slave, 'wb', 0)) |
| 3219 | + |
| 3220 | + def test_read_regular_file(self): |
| 3221 | + self.addCleanup(os_helper.unlink, os_helper.TESTFN) |
| 3222 | + with open(os_helper.TESTFN, 'wb') as f: |
| 3223 | + f.write(b'spam') |
| 3224 | + self.check_rejected(self.loop.connect_read_pipe, |
| 3225 | + open(os_helper.TESTFN, 'rb', 0)) |
| 3226 | + |
| 3227 | + def test_write_regular_file(self): |
| 3228 | + self.addCleanup(os_helper.unlink, os_helper.TESTFN) |
| 3229 | + self.check_rejected(self.loop.connect_write_pipe, |
| 3230 | + open(os_helper.TESTFN, 'wb', 0)) |
| 3231 | + |
| 3232 | + |
3137 | 3233 | if __name__ == '__main__': |
3138 | 3234 | unittest.main() |
0 commit comments