test_loader.py 4.28 KB
Newer Older
1
from importlib import machinery
2 3
import imp
import unittest
4
from .. import abc
5
from .. import util
6
from test.support import captured_stdout
7 8 9 10

class LoaderTests(abc.LoaderTests):

    def test_module(self):
11
        with util.uncache('__hello__'), captured_stdout() as stdout:
12 13
            module = machinery.FrozenImporter.load_module('__hello__')
            check = {'__name__': '__hello__', '__file__': '<frozen>',
14
                    '__package__': '', '__loader__': machinery.FrozenImporter}
15 16
            for attr, value in check.items():
                self.assertEqual(getattr(module, attr), value)
17
            self.assertEqual(stdout.getvalue(), 'Hello world!\n')
18 19

    def test_package(self):
20
        with util.uncache('__phello__'),  captured_stdout() as stdout:
21 22
            module = machinery.FrozenImporter.load_module('__phello__')
            check = {'__name__': '__phello__', '__file__': '<frozen>',
23 24
                     '__package__': '__phello__', '__path__': ['__phello__'],
                     '__loader__': machinery.FrozenImporter}
25 26 27 28 29
            for attr, value in check.items():
                attr_value = getattr(module, attr)
                self.assertEqual(attr_value, value,
                                 "for __phello__.%s, %r != %r" %
                                 (attr, attr_value, value))
30
            self.assertEqual(stdout.getvalue(), 'Hello world!\n')
31 32

    def test_lacking_parent(self):
33 34
        with util.uncache('__phello__', '__phello__.spam'), \
             captured_stdout() as stdout:
35 36
            module = machinery.FrozenImporter.load_module('__phello__.spam')
            check = {'__name__': '__phello__.spam', '__file__': '<frozen>',
37 38
                    '__package__': '__phello__',
                    '__loader__': machinery.FrozenImporter}
39 40 41 42 43
            for attr, value in check.items():
                attr_value = getattr(module, attr)
                self.assertEqual(attr_value, value,
                                 "for __phello__.spam.%s, %r != %r" %
                                 (attr, attr_value, value))
44
            self.assertEqual(stdout.getvalue(), 'Hello world!\n')
45 46

    def test_module_reuse(self):
47
        with util.uncache('__hello__'), captured_stdout() as stdout:
48 49
            module1 = machinery.FrozenImporter.load_module('__hello__')
            module2 = machinery.FrozenImporter.load_module('__hello__')
50
            self.assertTrue(module1 is module2)
51 52
            self.assertEqual(stdout.getvalue(),
                             'Hello world!\nHello world!\n')
53 54 55 56 57 58 59

    def test_state_after_failure(self):
        # No way to trigger an error in a frozen module.
        pass

    def test_unloadable(self):
        assert machinery.FrozenImporter.find_module('_not_real') is None
60 61
        with self.assertRaises(ImportError):
            machinery.FrozenImporter.load_module('_not_real')
62 63


64 65 66 67 68 69 70
class InspectLoaderTests(unittest.TestCase):

    """Tests for the InspectLoader methods for FrozenImporter."""

    def test_get_code(self):
        # Make sure that the code object is good.
        name = '__hello__'
71 72 73 74 75 76
        with captured_stdout() as stdout:
            code = machinery.FrozenImporter.get_code(name)
            mod = imp.new_module(name)
            exec(code, mod.__dict__)
            self.assertTrue(hasattr(mod, 'initialized'))
            self.assertEqual(stdout.getvalue(), 'Hello world!\n')
77 78 79 80

    def test_get_source(self):
        # Should always return None.
        result = machinery.FrozenImporter.get_source('__hello__')
81
        self.assertTrue(result is None)
82 83 84 85 86 87 88

    def test_is_package(self):
        # Should be able to tell what is a package.
        test_for = (('__hello__', False), ('__phello__', True),
                    ('__phello__.spam', False))
        for name, is_package in test_for:
            result = machinery.FrozenImporter.is_package(name)
89
            self.assertTrue(bool(result) == is_package)
90 91 92 93 94

    def test_failure(self):
        # Raise ImportError for modules that are not frozen.
        for meth_name in ('get_code', 'get_source', 'is_package'):
            method = getattr(machinery.FrozenImporter, meth_name)
95 96
            with self.assertRaises(ImportError):
                method('importlib')
97 98


99 100
def test_main():
    from test.support import run_unittest
101
    run_unittest(LoaderTests, InspectLoaderTests)
102 103 104 105


if __name__ == '__main__':
    test_main()