PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/module/_continuation/test/test_zpickle.py

https://bitbucket.org/dac_io/pypy
Python | 263 lines | 251 code | 6 blank | 6 comment | 0 complexity | dd7ca67ccd81dc3662ebe2d7dccb33e5 MD5 | raw file
  1. from pypy.conftest import gettestobjspace
  2. class AppTestCopy:
  3. def setup_class(cls):
  4. cls.space = gettestobjspace(usemodules=('_continuation',),
  5. CALL_METHOD=True)
  6. cls.space.config.translation.continuation = True
  7. def test_basic_setup(self):
  8. from _continuation import continulet
  9. lst = [4]
  10. co = continulet(lst.append)
  11. assert lst == [4]
  12. res = co.switch()
  13. assert res is None
  14. assert lst == [4, co]
  15. def test_copy_continulet_not_started(self):
  16. from _continuation import continulet, error
  17. import copy
  18. lst = []
  19. co = continulet(lst.append)
  20. co2, lst2 = copy.deepcopy((co, lst))
  21. #
  22. assert lst == []
  23. co.switch()
  24. assert lst == [co]
  25. #
  26. assert lst2 == []
  27. co2.switch()
  28. assert lst2 == [co2]
  29. def test_copy_continulet_not_started_multiple(self):
  30. from _continuation import continulet, error
  31. import copy
  32. lst = []
  33. co = continulet(lst.append)
  34. co2, lst2 = copy.deepcopy((co, lst))
  35. co3, lst3 = copy.deepcopy((co, lst))
  36. co4, lst4 = copy.deepcopy((co, lst))
  37. #
  38. assert lst == []
  39. co.switch()
  40. assert lst == [co]
  41. #
  42. assert lst2 == []
  43. co2.switch()
  44. assert lst2 == [co2]
  45. #
  46. assert lst3 == []
  47. co3.switch()
  48. assert lst3 == [co3]
  49. #
  50. assert lst4 == []
  51. co4.switch()
  52. assert lst4 == [co4]
  53. def test_copy_continulet_real(self):
  54. import new, sys
  55. mod = new.module('test_copy_continulet_real')
  56. sys.modules['test_copy_continulet_real'] = mod
  57. exec '''if 1:
  58. from _continuation import continulet
  59. import copy
  60. def f(co, x):
  61. co.switch(x + 1)
  62. co.switch(x + 2)
  63. return x + 3
  64. co = continulet(f, 40)
  65. res = co.switch()
  66. assert res == 41
  67. co2 = copy.deepcopy(co)
  68. #
  69. res = co2.switch()
  70. assert res == 42
  71. assert co2.is_pending()
  72. res = co2.switch()
  73. assert res == 43
  74. assert not co2.is_pending()
  75. #
  76. res = co.switch()
  77. assert res == 42
  78. assert co.is_pending()
  79. res = co.switch()
  80. assert res == 43
  81. assert not co.is_pending()
  82. ''' in mod.__dict__
  83. def test_copy_continulet_already_finished(self):
  84. from _continuation import continulet, error
  85. import copy
  86. lst = []
  87. co = continulet(lst.append)
  88. co.switch()
  89. co2 = copy.deepcopy(co)
  90. assert not co.is_pending()
  91. assert not co2.is_pending()
  92. raises(error, co.__init__, lst.append)
  93. raises(error, co2.__init__, lst.append)
  94. raises(error, co.switch)
  95. raises(error, co2.switch)
  96. class AppTestPickle:
  97. version = 0
  98. def setup_class(cls):
  99. cls.space = gettestobjspace(usemodules=('_continuation', 'struct'),
  100. CALL_METHOD=True)
  101. cls.space.config.translation.continuation = True
  102. cls.space.appexec([], """():
  103. global continulet, A, __name__
  104. import sys
  105. __name__ = 'test_pickle_continulet'
  106. thismodule = type(sys)(__name__)
  107. sys.modules[__name__] = thismodule
  108. from _continuation import continulet
  109. class A(continulet):
  110. pass
  111. thismodule.__dict__.update(globals())
  112. """)
  113. cls.w_version = cls.space.wrap(cls.version)
  114. def test_pickle_continulet_empty(self):
  115. from _continuation import continulet
  116. lst = [4]
  117. co = continulet.__new__(continulet)
  118. import pickle
  119. pckl = pickle.dumps(co, self.version)
  120. print repr(pckl)
  121. co2 = pickle.loads(pckl)
  122. assert co2 is not co
  123. assert not co.is_pending()
  124. assert not co2.is_pending()
  125. # the empty unpickled coroutine can still be used:
  126. result = [5]
  127. co2.__init__(result.append)
  128. res = co2.switch()
  129. assert res is None
  130. assert result == [5, co2]
  131. def test_pickle_continulet_empty_subclass(self):
  132. from test_pickle_continulet import continulet, A
  133. lst = [4]
  134. co = continulet.__new__(A)
  135. co.foo = 'bar'
  136. co.bar = 'baz'
  137. import pickle
  138. pckl = pickle.dumps(co, self.version)
  139. print repr(pckl)
  140. co2 = pickle.loads(pckl)
  141. assert co2 is not co
  142. assert not co.is_pending()
  143. assert not co2.is_pending()
  144. assert type(co) is type(co2) is A
  145. assert co.foo == co2.foo == 'bar'
  146. assert co.bar == co2.bar == 'baz'
  147. # the empty unpickled coroutine can still be used:
  148. result = [5]
  149. co2.__init__(result.append)
  150. res = co2.switch()
  151. assert res is None
  152. assert result == [5, co2]
  153. def test_pickle_continulet_not_started(self):
  154. from _continuation import continulet, error
  155. import pickle
  156. lst = []
  157. co = continulet(lst.append)
  158. pckl = pickle.dumps((co, lst))
  159. print pckl
  160. del co, lst
  161. for i in range(2):
  162. print 'resume...'
  163. co2, lst2 = pickle.loads(pckl)
  164. assert lst2 == []
  165. co2.switch()
  166. assert lst2 == [co2]
  167. def test_pickle_continulet_real(self):
  168. import new, sys
  169. mod = new.module('test_pickle_continulet_real')
  170. sys.modules['test_pickle_continulet_real'] = mod
  171. mod.version = self.version
  172. exec '''if 1:
  173. from _continuation import continulet
  174. import pickle
  175. def f(co, x):
  176. co.switch(x + 1)
  177. co.switch(x + 2)
  178. return x + 3
  179. co = continulet(f, 40)
  180. res = co.switch()
  181. assert res == 41
  182. pckl = pickle.dumps(co, version)
  183. print repr(pckl)
  184. co2 = pickle.loads(pckl)
  185. #
  186. res = co2.switch()
  187. assert res == 42
  188. assert co2.is_pending()
  189. res = co2.switch()
  190. assert res == 43
  191. assert not co2.is_pending()
  192. #
  193. res = co.switch()
  194. assert res == 42
  195. assert co.is_pending()
  196. res = co.switch()
  197. assert res == 43
  198. assert not co.is_pending()
  199. ''' in mod.__dict__
  200. def test_pickle_continulet_real_subclass(self):
  201. import new, sys
  202. mod = new.module('test_pickle_continulet_real_subclass')
  203. sys.modules['test_pickle_continulet_real_subclass'] = mod
  204. mod.version = self.version
  205. exec '''if 1:
  206. from _continuation import continulet
  207. import pickle
  208. class A(continulet):
  209. def __init__(self):
  210. crash
  211. def f(co):
  212. co.switch(co.x + 1)
  213. co.switch(co.x + 2)
  214. return co.x + 3
  215. co = A.__new__(A)
  216. continulet.__init__(co, f)
  217. co.x = 40
  218. res = co.switch()
  219. assert res == 41
  220. pckl = pickle.dumps(co, version)
  221. print repr(pckl)
  222. co2 = pickle.loads(pckl)
  223. #
  224. assert type(co2) is A
  225. res = co2.switch()
  226. assert res == 42
  227. assert co2.is_pending()
  228. res = co2.switch()
  229. assert res == 43
  230. assert not co2.is_pending()
  231. #
  232. res = co.switch()
  233. assert res == 42
  234. assert co.is_pending()
  235. res = co.switch()
  236. assert res == 43
  237. assert not co.is_pending()
  238. ''' in mod.__dict__
  239. class AppTestPickle_v1(AppTestPickle):
  240. version = 1
  241. class AppTestPickle_v2(AppTestPickle):
  242. version = 2