def f(): try: raise ValueError('fun') except: exc_info = sys.exc_info() greenlet(h).switch() self.assertEqual(exc_info, sys.exc_info())
def f(): g1 = greenlet(fmain) g1.switch(seen) someref.append(g1) del g1 gc.collect() lock.release() lock2.acquire() greenlet() # trigger release lock.release() lock2.acquire()
def test_exception(self): seen = [] g1 = greenlet(fmain) g2 = greenlet(fmain) g1.switch(seen) g2.switch(seen) g2.parent = g1 self.assertEqual(seen, []) self.assertRaises(SomeError, g2.switch) self.assertEqual(seen, [SomeError]) g2.switch() self.assertEqual(seen, [SomeError])
def test_dealloc(self): seen = [] g1 = greenlet(fmain) g2 = greenlet(fmain) g1.switch(seen) g2.switch(seen) self.assertEqual(seen, []) del g1 gc.collect() self.assertEqual(seen, [greenlet.GreenletExit]) del g2 gc.collect() self.assertEqual(seen, [greenlet.GreenletExit, greenlet.GreenletExit])
def test_exc_state(self): def f(): try: raise ValueError('fun') except: exc_info = sys.exc_info() greenlet(h).switch() self.assertEqual(exc_info, sys.exc_info()) def h(): self.assertEqual(sys.exc_info(), (None, None, None)) greenlet(f).switch()
def send_exception(g, exc): # note: send_exception(g, exc) can be now done with g.throw(exc). # the purpose of this test is to explicitely check the propagation rules. def crasher(exc): raise exc g1 = greenlet(crasher, parent=g) g1.switch(exc)
def test_switch_kwargs_to_parent(self): def foo(x): greenlet.getcurrent().parent.switch(x=x) greenlet.getcurrent().parent.switch(2, x=3) return x, x**2 g = greenlet(foo) self.assertEqual({'x': 3}, g.switch(3)) self.assertEqual(((2, ), {'x': 3}), g.switch()) self.assertEqual((3, 9), g.switch())
def test_two_children(self): lst = [] def f(): lst.append(1) greenlet.getcurrent().parent.switch() lst.extend([1, 1]) g = greenlet(f) h = greenlet(f) g.switch() self.assertEqual(len(lst), 1) h.switch() self.assertEqual(len(lst), 2) h.switch() self.assertEqual(len(lst), 4) self.assertEqual(h.dead, True) g.switch() self.assertEqual(len(lst), 6) self.assertEqual(g.dead, True)
def test_simple(self): lst = [] def f(): lst.append(1) greenlet.getcurrent().parent.switch() lst.append(3) g = greenlet(f) lst.append(0) g.switch() lst.append(2) g.switch() lst.append(4) self.assertEqual(lst, list(range(5)))
def test_frame(self): def f1(): f = sys._getframe(0) # disable this test, our fake greenlets are bootstrapped by higher level functions # self.assertEqual(f.f_back, None) greenlet.getcurrent().parent.switch(f) return "meaning of life" g = greenlet(f1) frame = g.switch() self.assertTrue(frame is g.gr_frame) self.assertTrue(g) next = g.switch() self.assertFalse(g) self.assertEqual(next, 'meaning of life') self.assertEqual(g.gr_frame, None)
def test_two_recursive_children(self): lst = [] def f(): lst.append(1) greenlet.getcurrent().parent.switch() def g(): lst.append(1) g = greenlet(f) g.switch() lst.append(1) g = greenlet(g) g.switch() self.assertEqual(len(lst), 3) self.assertEqual(sys.getrefcount(g), 2)
def g(): lst.append(1) g = greenlet(f) g.switch() lst.append(1)
def test_run_equals_None(self): g = greenlet(run=None)
def test_parent_equals_None(self): g = greenlet(parent=None)
def test_send_exception(self): seen = [] g1 = greenlet(fmain) g1.switch(seen) self.assertRaises(KeyError, send_exception, g1, KeyError) self.assertEqual(seen, [KeyError])
def foo(): data['g'] = greenlet(lambda: None) created_event.set() done_event.wait()
def test_switch_kwargs(self): def foo(a, b): self.assertEqual(a, 4) self.assertEqual(b, 2) greenlet(foo).switch(a=4, b=2)
def runner(x): g = greenlet(lambda: sleep(x)) g.switch()