def testGetRidOfBadFileDescriptors(self): reactor = Reactor() class BadSocket(object): def fileno(self): return 88 def close(self): raise Exception('hell breaks loose') self.timeout = False def timeout(): self.timeout = True reactor.addReader(99, lambda: None) # broken reactor.addWriter(99, lambda: None) # broken reactor.addReader(BadSocket(), lambda: None) # even more broken reactor.addTimer(0.01, timeout) with self.stderr_replaced() as s: for i in range(10): if self.timeout: break reactor.step() self.assertTrue("Bad file descriptor" in s.getvalue(), s.getvalue()) self.assertTrue(self.timeout) self.assertEquals({}, reactor._readers) self.assertEquals({}, reactor._writers) self.assertEquals([], reactor._timers)
def testConnect(self): self.req = False serverResponse = 'Hello World' def onRequest(**kwargs): yield 'HTTP/1.0 200 OK\r\n\r\n' + serverResponse self.req = True port = randint(15000, 16000) reactor = Reactor() try: server = HttpsServer(reactor, port, onRequest, keyfile='ssl/server.pkey', certfile='ssl/server.cert') server.listen() p = Popen('wget -O - --no-check-certificate --quiet https://localhost:%s' % port, shell=True, stdout=PIPE) popenStdout = [] def readPopenStdout(): popenStdout.append(p.stdout.read()) reactor.addReader(p.stdout, readPopenStdout) while not self.req: reactor.step() reactor.step() self.assertEquals(1, len(popenStdout)) self.assertEquals(serverResponse, popenStdout[0]) finally: server.shutdown()
def testReaderOrWriterDoesNotMaskSystemExit(self): fd, path = mkstemp() reactor = Reactor() def raiser(): raise SystemExit('shutdown...') reactor.addReader(sok=fd, sink=raiser) self.assertEquals([raiser], [c.callback for c in reactor._readers.values()]) try: reactor.step() self.fail('step() must raise SystemExit') except SystemExit: self.assertEquals([], [c.callback for c in reactor._readers.values()]) fd, path = mkstemp() reactor = Reactor() reactor.addWriter(sok=fd, source=raiser) try: reactor.step() self.fail('step() must raise SystemExit') except SystemExit: self.assertEquals([], [c.callback for c in reactor._readers.values()])
def testReaderOrWriterDoesNotMaskKeyboardInterrupt(self): fd, path = mkstemp() reactor = Reactor() def raiser(): raise KeyboardInterrupt('Ctrl-C') reactor.addReader(sok=fd, sink=raiser) self.assertEquals([raiser], [c.callback for c in reactor._readers.values()]) try: reactor.step() self.fail('step() must raise KeyboardInterrupt') except KeyboardInterrupt: self.assertEquals([], [c.callback for c in reactor._readers.values()]) fd, path = mkstemp() reactor = Reactor() reactor.addWriter(sok=fd, source=raiser) try: reactor.step() self.fail('step() must raise KeyboardInterrupt') except KeyboardInterrupt: self.assertEquals([], [c.callback for c in reactor._readers.values()])
def testAddSocketRaisesException(self): class Sok: # raise exception when put into set def __hash__(self): raise Exception('aap') reactor = Reactor() try: reactor.addReader(Sok(), None) self.fail() except Exception, e: self.assertEquals('aap', str(e))
def testAddSocketReading(self): class Sok: def __hash__(self): return 1 reactor = Reactor() mockSok = Sok() self.assertTrue(mockSok not in reactor._readers) reactor.addReader(mockSok, lambda: None) self.assertTrue(mockSok in reactor._readers) reactor.removeReader(mockSok) self.assertFalse(mockSok in reactor._readers)
def testDoNotDieButLogOnProgrammingErrors(self): reactor = Reactor() reactor.addReader('not a sok', lambda: None) try: sys.stderr = StringIO() reactor.step() sys.stderr.seek(0) self.assertTrue('TypeError: argument must be an int' in sys.stderr.getvalue()) sys.stderr = sys.__stderr__ except TypeError: self.fail('must not fail')
def testWriteFollowsRead(self): reactor = Reactor(lambda r,w,o,t: (r,w,o)) t = [] def read(): t.append('t1') def write(): t.append('t2') reactor.addWriter('sok1', write) reactor.addReader('sok1', read) reactor.step() self.assertEquals(['t1', 't2'], t)
def testReadFollowsTimer(self): reactor = Reactor(lambda r,w,o,t: (r,w,o)) t = [] def timer(): t.append('t1') def read(): t.append('t2') reactor.addTimer(0, timer) reactor.addReader('sok1', read) reactor.step() self.assertEquals(['t1', 't2'], t)
def testDoNotDieButLogOnProgrammingErrors(self): reactor = Reactor() reactor.addReader('not a sok', lambda: None) try: sys.stderr = StringIO() reactor.step() sys.stderr.seek(0) self.assertTrue( 'TypeError: argument must be an int' in sys.stderr.getvalue()) sys.stderr = sys.__stderr__ except TypeError: self.fail('must not fail')
def testReadDeletesWrite(self): reactor = Reactor(lambda r,w,o,t: (r,w,o)) self.read = self.write = False def read(): self.read = True reactor.removeWriter('sok1') def write(): self.write = True reactor.addWriter('sok1', write) reactor.addReader('sok1', read) reactor.step() self.assertTrue(self.read) self.assertFalse(self.write)
def testTimerDeletesRead(self): reactor = Reactor(lambda r,w,o,t: (r,w,o)) self.read = self.timer = False def read(): self.read = True def timer(): self.timer = True reactor.removeReader('sok1') reactor.addTimer(0, timer) reactor.addReader('sok1', read) reactor.step() self.assertTrue(self.timer) self.assertFalse(self.read)
def testAssertionErrorInReadCallback(self): sys.stderr = StringIO() try: def callback(): raise AssertionError('here is the assertion') reactor = Reactor(lambda r, w, o, t: (r,w,o)) reactor.addReader(9, callback) try: reactor.step() self.fail('must raise exception') except AssertionError, e: self.assertEquals('here is the assertion', str(e)) finally: sys.stderr = sys.__stderr__
def testWriteFollowsRead(self): reactor = Reactor(lambda r, w, o, t: (r, w, o)) t = [] def read(): t.append('t1') def write(): t.append('t2') reactor.addWriter('sok1', write) reactor.addReader('sok1', read) reactor.step() self.assertEquals(['t1', 't2'], t)
def testReadFollowsTimer(self): reactor = Reactor(lambda r, w, o, t: (r, w, o)) t = [] def timer(): t.append('t1') def read(): t.append('t2') reactor.addTimer(0, timer) reactor.addReader('sok1', read) reactor.step() self.assertEquals(['t1', 't2'], t)
def testReactorResumeReader(self): handle = ['initial value'] reactor = Reactor(select_func=mockselect) def callback(): handle[0] = reactor.suspend() yield yield sok = MockSocket() reactor.addReader(sok, callback().next) reactor.step() reactor.resumeReader(handle[0]) reactor.step() self.assertFalse(sok in reactor._writers) self.assertTrue(sok in reactor._readers) self.assertRaises(KeyError, reactor.resumeReader, handle[0])
def testReadFile(self): reactor = Reactor() fd, path = mkstemp() os.write(fd, 'some data') os.close(fd) try: f = open(path) def readable(): self.readable = True reactor.addReader(f, readable) reactor.step() self.assertTrue(self.readable) finally: f.close() os.remove(path)
def testGetRidOfClosedSocket(self): reactor = Reactor() sok = socket() sok.close() callbacks = [] def callback(): callbacks.append(True) reactor.addReader(sok, callback) reactor.addWriter(sok, callback) with self.stderr_replaced() as s: reactor.step() reactor.step() self.assertTrue("Bad file descriptor" in s.getvalue(), s.getvalue()) self.assertEquals({}, reactor._readers) self.assertEquals([True, True], callbacks)
def testAssertionErrorInReadCallback(self): sys.stderr = StringIO() try: def callback(): raise AssertionError('here is the assertion') reactor = Reactor(lambda r, w, o, t: (r, w, o)) reactor.addReader(9, callback) try: reactor.step() self.fail('must raise exception') except AssertionError, e: self.assertEquals('here is the assertion', str(e)) finally: sys.stderr = sys.__stderr__
def testReadDeletesWrite(self): reactor = Reactor(lambda r, w, o, t: (r, w, o)) self.read = self.write = False def read(): self.read = True reactor.removeWriter('sok1') def write(): self.write = True reactor.addWriter('sok1', write) reactor.addReader('sok1', read) reactor.step() self.assertTrue(self.read) self.assertFalse(self.write)
def testTimerDeletesRead(self): reactor = Reactor(lambda r, w, o, t: (r, w, o)) self.read = self.timer = False def read(): self.read = True def timer(): self.timer = True reactor.removeReader('sok1') reactor.addTimer(0, timer) reactor.addReader('sok1', read) reactor.step() self.assertTrue(self.timer) self.assertFalse(self.read)
def testCleanUp(self): reactor = Reactor(select_func=mockselect) def handler(): reactor.suspend() yield reactor.addWriter(1, lambda: None) reactor.addReader(2, lambda: None) reactor.addReader(3, handler().next) reactor.step() self.assertTrue(1 in reactor._writers) reactor.cleanup(1) self.assertFalse(1 in reactor._writers) self.assertTrue(2 in reactor._readers) reactor.cleanup(2) self.assertFalse(2 in reactor._readers) self.assertTrue(3 in reactor._suspended) reactor.cleanup(3) self.assertFalse(3 in reactor._suspended)
def testReactorSuspend(self): handle = ['initial value'] reactor = Reactor(select_func=mockselect) def callback(): handle[0] = reactor.suspend() sok = MockSocket() reactor.addReader(sok, callback) self.assertTrue(sok in reactor._readers) reactor.step() self.assertTrue(sok not in reactor._readers) sok = MockSocket() reactor.addWriter(sok, callback) self.assertTrue(sok in reactor._writers) reactor.step() self.assertTrue(sok not in reactor._writers) self.assertTrue(handle[0] != None) self.assertTrue(handle[0] != 'initial value')
def testShutdownReactor(self): reactor = Reactor() sok1 = MockSocket() sok2 = MockSocket() sok3 = MockSocket() def callback(): reactor.suspend() reactor.addReader(sok1, lambda: None) reactor.addWriter(sok2, lambda: None) reactor.addWriter(sok3, callback) reactor.step() self.assertFalse(sok3.fileno() in reactor._fds) self.assertFalse(sok3.fileno() in reactor._fds) with self.stdout_replaced() as s: reactor.shutdown() self.assertTrue(str(sok1) in s.getvalue(), s.getvalue()) self.assertTrue(str(sok2) in s.getvalue(), s.getvalue()) self.assertTrue(str(sok3) in s.getvalue()) self.assertTrue(sok1.closed) self.assertTrue(sok2.closed) self.assertTrue(sok3.closed)