(self)
| 336 | self.assertGreaterEqual(fd, 0) |
| 337 | |
| 338 | def test_selector(self): |
| 339 | s = self.SELECTOR() |
| 340 | self.addCleanup(s.close) |
| 341 | |
| 342 | NUM_SOCKETS = 12 |
| 343 | MSG = b" This is a test." |
| 344 | MSG_LEN = len(MSG) |
| 345 | readers = [] |
| 346 | writers = [] |
| 347 | r2w = {} |
| 348 | w2r = {} |
| 349 | |
| 350 | for i in range(NUM_SOCKETS): |
| 351 | rd, wr = self.make_socketpair() |
| 352 | s.register(rd, selectors.EVENT_READ) |
| 353 | s.register(wr, selectors.EVENT_WRITE) |
| 354 | readers.append(rd) |
| 355 | writers.append(wr) |
| 356 | r2w[rd] = wr |
| 357 | w2r[wr] = rd |
| 358 | |
| 359 | bufs = [] |
| 360 | |
| 361 | while writers: |
| 362 | ready = s.select() |
| 363 | ready_writers = find_ready_matching(ready, selectors.EVENT_WRITE) |
| 364 | if not ready_writers: |
| 365 | self.fail("no sockets ready for writing") |
| 366 | wr = random.choice(ready_writers) |
| 367 | wr.send(MSG) |
| 368 | |
| 369 | for i in range(10): |
| 370 | ready = s.select() |
| 371 | ready_readers = find_ready_matching(ready, |
| 372 | selectors.EVENT_READ) |
| 373 | if ready_readers: |
| 374 | break |
| 375 | # there might be a delay between the write to the write end and |
| 376 | # the read end is reported ready |
| 377 | sleep(0.1) |
| 378 | else: |
| 379 | self.fail("no sockets ready for reading") |
| 380 | self.assertEqual([w2r[wr]], ready_readers) |
| 381 | rd = ready_readers[0] |
| 382 | buf = rd.recv(MSG_LEN) |
| 383 | self.assertEqual(len(buf), MSG_LEN) |
| 384 | bufs.append(buf) |
| 385 | s.unregister(r2w[rd]) |
| 386 | s.unregister(rd) |
| 387 | writers.remove(r2w[rd]) |
| 388 | |
| 389 | self.assertEqual(bufs, [MSG] * NUM_SOCKETS) |
| 390 | |
| 391 | @unittest.skipIf(sys.platform == 'win32', |
| 392 | 'select.select() cannot be used with empty fd sets') |
nothing calls this directly
no test coverage detected