(self, mod)
| 540 | self.assertEqual(pickle, pickle_clone) |
| 541 | |
| 542 | def _check_dynamic_module(self, mod): |
| 543 | mod = types.ModuleType("mod") |
| 544 | code = """ |
| 545 | x = 1 |
| 546 | def f(y): |
| 547 | return x + y |
| 548 | |
| 549 | class Foo: |
| 550 | def method(self, x): |
| 551 | return f(x) |
| 552 | """ |
| 553 | exec(textwrap.dedent(code), mod.__dict__) |
| 554 | mod2 = pickle_depickle(mod, protocol=self.protocol) |
| 555 | self.assertEqual(mod.x, mod2.x) |
| 556 | self.assertEqual(mod.f(5), mod2.f(5)) |
| 557 | self.assertEqual(mod.Foo().method(5), mod2.Foo().method(5)) |
| 558 | |
| 559 | if platform.python_implementation() != "PyPy": |
| 560 | # XXX: this fails with excessive recursion on PyPy. |
| 561 | mod3 = subprocess_pickle_echo(mod, protocol=self.protocol) |
| 562 | self.assertEqual(mod.x, mod3.x) |
| 563 | self.assertEqual(mod.f(5), mod3.f(5)) |
| 564 | self.assertEqual(mod.Foo().method(5), mod3.Foo().method(5)) |
| 565 | |
| 566 | # Test dynamic modules when imported back are singletons |
| 567 | mod1, mod2 = pickle_depickle([mod, mod]) |
| 568 | self.assertEqual(id(mod1), id(mod2)) |
| 569 | |
| 570 | # Ensure proper pickling of mod's functions when module "looks" like a |
| 571 | # file-backed module even though it is not: |
| 572 | try: |
| 573 | sys.modules["mod"] = mod |
| 574 | depickled_f = pickle_depickle(mod.f, protocol=self.protocol) |
| 575 | self.assertEqual(mod.f(5), depickled_f(5)) |
| 576 | finally: |
| 577 | sys.modules.pop("mod", None) |
| 578 | |
| 579 | def test_dynamic_module(self): |
| 580 | mod = types.ModuleType("mod") |
no test coverage detected