|
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 |
@@ -3172,5 +3173,100 @@ def test_get_loop(self): |
3172 | 3173 | events.AbstractServer().get_loop() |
3173 | 3174 |
|
3174 | 3175 |
|
| 3176 | +@unittest.skipIf(sys.platform == 'win32', 'Unix pipe transport semantics') |
| 3177 | +class UnixPipeObjectSupportTests(unittest.TestCase): |
| 3178 | + def setUp(self): |
| 3179 | + super().setUp() |
| 3180 | + self.loop = asyncio.SelectorEventLoop() |
| 3181 | + self.addCleanup(self.loop.close) |
| 3182 | + |
| 3183 | + def check_accepted(self, connect, pipeobj): |
| 3184 | + lost = self.loop.create_future() |
| 3185 | + |
| 3186 | + class Proto(asyncio.Protocol): |
| 3187 | + def connection_lost(self, exc): |
| 3188 | + if not lost.done(): |
| 3189 | + lost.set_result(exc) |
| 3190 | + |
| 3191 | + async def run(): |
| 3192 | + transport, protocol = await connect(Proto, pipeobj) |
| 3193 | + self.assertIsInstance(protocol, Proto) |
| 3194 | + self.assertFalse(pipeobj.closed) |
| 3195 | + transport.close() |
| 3196 | + self.assertIsNone(await lost) |
| 3197 | + |
| 3198 | + self.loop.run_until_complete(run()) |
| 3199 | + self.assertTrue(pipeobj.closed) |
| 3200 | + |
| 3201 | + def check_rejected(self, connect, pipeobj): |
| 3202 | + self.addCleanup(pipeobj.close) |
| 3203 | + with self.assertRaisesRegex(ValueError, 'Pipe transport is'): |
| 3204 | + self.loop.run_until_complete(connect(asyncio.Protocol, pipeobj)) |
| 3205 | + |
| 3206 | + def test_read_pipe(self): |
| 3207 | + rfd, wfd = os.pipe() |
| 3208 | + self.addCleanup(os.close, wfd) |
| 3209 | + self.check_accepted(self.loop.connect_read_pipe, open(rfd, 'rb', 0)) |
| 3210 | + |
| 3211 | + def test_write_pipe(self): |
| 3212 | + rfd, wfd = os.pipe() |
| 3213 | + self.addCleanup(os.close, rfd) |
| 3214 | + self.check_accepted(self.loop.connect_write_pipe, open(wfd, 'wb', 0)) |
| 3215 | + |
| 3216 | + def test_read_fifo(self): |
| 3217 | + path = os_helper.TESTFN |
| 3218 | + os.mkfifo(path) |
| 3219 | + self.addCleanup(os_helper.unlink, path) |
| 3220 | + rfd = os.open(path, os.O_RDONLY | os.O_NONBLOCK) |
| 3221 | + wfd = os.open(path, os.O_WRONLY) |
| 3222 | + self.addCleanup(os.close, wfd) |
| 3223 | + self.check_accepted(self.loop.connect_read_pipe, open(rfd, 'rb', 0)) |
| 3224 | + |
| 3225 | + def test_write_fifo(self): |
| 3226 | + path = os_helper.TESTFN |
| 3227 | + os.mkfifo(path) |
| 3228 | + self.addCleanup(os_helper.unlink, path) |
| 3229 | + rfd = os.open(path, os.O_RDONLY | os.O_NONBLOCK) |
| 3230 | + self.addCleanup(os.close, rfd) |
| 3231 | + wfd = os.open(path, os.O_WRONLY) |
| 3232 | + self.check_accepted(self.loop.connect_write_pipe, open(wfd, 'wb', 0)) |
| 3233 | + |
| 3234 | + def test_read_socket(self): |
| 3235 | + rsock, wsock = socket.socketpair() |
| 3236 | + self.addCleanup(wsock.close) |
| 3237 | + self.check_accepted(self.loop.connect_read_pipe, |
| 3238 | + open(rsock.detach(), 'rb', 0)) |
| 3239 | + |
| 3240 | + def test_write_socket(self): |
| 3241 | + rsock, wsock = socket.socketpair() |
| 3242 | + self.addCleanup(rsock.close) |
| 3243 | + self.check_accepted(self.loop.connect_write_pipe, |
| 3244 | + open(wsock.detach(), 'wb', 0)) |
| 3245 | + |
| 3246 | + @unittest.skipUnless(hasattr(os, 'openpty'), 'need os.openpty()') |
| 3247 | + def test_read_character_device(self): |
| 3248 | + master, slave = os.openpty() |
| 3249 | + self.addCleanup(os.close, slave) |
| 3250 | + self.check_accepted(self.loop.connect_read_pipe, open(master, 'rb', 0)) |
| 3251 | + |
| 3252 | + @unittest.skipUnless(hasattr(os, 'openpty'), 'need os.openpty()') |
| 3253 | + def test_write_character_device(self): |
| 3254 | + master, slave = os.openpty() |
| 3255 | + self.addCleanup(os.close, master) |
| 3256 | + self.check_accepted(self.loop.connect_write_pipe, open(slave, 'wb', 0)) |
| 3257 | + |
| 3258 | + def test_read_regular_file(self): |
| 3259 | + self.addCleanup(os_helper.unlink, os_helper.TESTFN) |
| 3260 | + with open(os_helper.TESTFN, 'wb') as f: |
| 3261 | + f.write(b'spam') |
| 3262 | + self.check_rejected(self.loop.connect_read_pipe, |
| 3263 | + open(os_helper.TESTFN, 'rb', 0)) |
| 3264 | + |
| 3265 | + def test_write_regular_file(self): |
| 3266 | + self.addCleanup(os_helper.unlink, os_helper.TESTFN) |
| 3267 | + self.check_rejected(self.loop.connect_write_pipe, |
| 3268 | + open(os_helper.TESTFN, 'wb', 0)) |
| 3269 | + |
| 3270 | + |
3175 | 3271 | if __name__ == '__main__': |
3176 | 3272 | unittest.main() |
0 commit comments