| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 1 | # Test packages (dotted-name import) | 
 | 2 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 3 | import sys | 
 | 4 | import os | 
 | 5 | import tempfile | 
 | 6 | import textwrap | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 7 | import unittest | 
| Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 8 | from test import support | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 9 |  | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 10 |  | 
 | 11 | # Helpers to create and destroy hierarchies. | 
 | 12 |  | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 13 | def cleanout(root): | 
 | 14 |     names = os.listdir(root) | 
 | 15 |     for name in names: | 
| Guido van Rossum | 41360a4 | 1998-03-26 19:42:58 +0000 | [diff] [blame] | 16 |         fullname = os.path.join(root, name) | 
 | 17 |         if os.path.isdir(fullname) and not os.path.islink(fullname): | 
 | 18 |             cleanout(fullname) | 
 | 19 |         else: | 
 | 20 |             os.remove(fullname) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 21 |     os.rmdir(root) | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 22 |  | 
| Barry Warsaw | 3a9d061 | 2000-09-01 06:53:52 +0000 | [diff] [blame] | 23 | def fixdir(lst): | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 24 |     if "__builtins__" in lst: | 
 | 25 |         lst.remove("__builtins__") | 
| Barry Warsaw | 3a9d061 | 2000-09-01 06:53:52 +0000 | [diff] [blame] | 26 |     return lst | 
 | 27 |  | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 28 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 29 | # XXX Things to test | 
 | 30 | # | 
 | 31 | # import package without __init__ | 
 | 32 | # import package with __init__ | 
 | 33 | # __init__ importing submodule | 
 | 34 | # __init__ importing global module | 
 | 35 | # __init__ defining variables | 
 | 36 | # submodule importing other submodule | 
 | 37 | # submodule importing global module | 
 | 38 | # submodule import submodule via global name | 
 | 39 | # from package import submodule | 
 | 40 | # from package import subpackage | 
 | 41 | # from package import variable (defined in __init__) | 
 | 42 | # from package import * (defined in __init__) | 
 | 43 |  | 
 | 44 |  | 
| Christian Heimes | db4a2ef | 2007-11-12 19:53:03 +0000 | [diff] [blame] | 45 | class TestPkg(unittest.TestCase): | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 46 |  | 
 | 47 |     def setUp(self): | 
 | 48 |         self.root = None | 
| Christian Heimes | dae2a89 | 2008-04-19 00:55:37 +0000 | [diff] [blame] | 49 |         self.pkgname = None | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 50 |         self.syspath = list(sys.path) | 
| Antoine Pitrou | 060cee2 | 2009-11-13 16:29:04 +0000 | [diff] [blame] | 51 |         self.modules_before = support.modules_setup() | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 52 |  | 
 | 53 |     def tearDown(self): | 
 | 54 |         sys.path[:] = self.syspath | 
| Antoine Pitrou | 060cee2 | 2009-11-13 16:29:04 +0000 | [diff] [blame] | 55 |         support.modules_cleanup(*self.modules_before) | 
| R. David Murray | 378c0cf | 2010-02-24 01:46:21 +0000 | [diff] [blame] | 56 |         if self.root: # Only clean if the test was actually run | 
 | 57 |             cleanout(self.root) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 58 |  | 
| Ezio Melotti | 1392500 | 2011-03-16 11:05:33 +0200 | [diff] [blame] | 59 |         # delete all modules concerning the tested hierarchy | 
| Christian Heimes | dae2a89 | 2008-04-19 00:55:37 +0000 | [diff] [blame] | 60 |         if self.pkgname: | 
 | 61 |             modules = [name for name in sys.modules | 
 | 62 |                        if self.pkgname in name.split('.')] | 
 | 63 |             for name in modules: | 
 | 64 |                 del sys.modules[name] | 
 | 65 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 66 |     def run_code(self, code): | 
 | 67 |         exec(textwrap.dedent(code), globals(), {"self": self}) | 
 | 68 |  | 
 | 69 |     def mkhier(self, descr): | 
 | 70 |         root = tempfile.mkdtemp() | 
| Guido van Rossum | 41360a4 | 1998-03-26 19:42:58 +0000 | [diff] [blame] | 71 |         sys.path.insert(0, root) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 72 |         if not os.path.isdir(root): | 
 | 73 |             os.mkdir(root) | 
 | 74 |         for name, contents in descr: | 
 | 75 |             comps = name.split() | 
 | 76 |             fullname = root | 
 | 77 |             for c in comps: | 
 | 78 |                 fullname = os.path.join(fullname, c) | 
 | 79 |             if contents is None: | 
 | 80 |                 os.mkdir(fullname) | 
 | 81 |             else: | 
 | 82 |                 f = open(fullname, "w") | 
 | 83 |                 f.write(contents) | 
 | 84 |                 if contents and contents[-1] != '\n': | 
 | 85 |                     f.write('\n') | 
 | 86 |                 f.close() | 
 | 87 |         self.root = root | 
| Christian Heimes | dae2a89 | 2008-04-19 00:55:37 +0000 | [diff] [blame] | 88 |         # package name is the name of the first item | 
 | 89 |         self.pkgname = descr[0][0] | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 90 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 91 |     def test_1(self): | 
 | 92 |         hier = [("t1", None), ("t1 __init__.py", "")] | 
 | 93 |         self.mkhier(hier) | 
 | 94 |         import t1 | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 95 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 96 |     def test_2(self): | 
 | 97 |         hier = [ | 
 | 98 |          ("t2", None), | 
 | 99 |          ("t2 __init__.py", "'doc for t2'"), | 
 | 100 |          ("t2 sub", None), | 
 | 101 |          ("t2 sub __init__.py", ""), | 
 | 102 |          ("t2 sub subsub", None), | 
 | 103 |          ("t2 sub subsub __init__.py", "spam = 1"), | 
 | 104 |         ] | 
 | 105 |         self.mkhier(hier) | 
| Fred Drake | 004d5e6 | 2000-10-23 17:22:08 +0000 | [diff] [blame] | 106 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 107 |         import t2.sub | 
 | 108 |         import t2.sub.subsub | 
 | 109 |         self.assertEqual(t2.__name__, "t2") | 
 | 110 |         self.assertEqual(t2.sub.__name__, "t2.sub") | 
 | 111 |         self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub") | 
| Fred Drake | 004d5e6 | 2000-10-23 17:22:08 +0000 | [diff] [blame] | 112 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 113 |         # This exec crap is needed because Py3k forbids 'import *' outside | 
 | 114 |         # of module-scope and __import__() is insufficient for what we need. | 
 | 115 |         s = """ | 
 | 116 |             import t2 | 
 | 117 |             from t2 import * | 
 | 118 |             self.assertEqual(dir(), ['self', 'sub', 't2']) | 
 | 119 |             """ | 
 | 120 |         self.run_code(s) | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 121 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 122 |         from t2 import sub | 
 | 123 |         from t2.sub import subsub | 
 | 124 |         from t2.sub.subsub import spam | 
 | 125 |         self.assertEqual(sub.__name__, "t2.sub") | 
 | 126 |         self.assertEqual(subsub.__name__, "t2.sub.subsub") | 
 | 127 |         self.assertEqual(sub.subsub.__name__, "t2.sub.subsub") | 
 | 128 |         for name in ['spam', 'sub', 'subsub', 't2']: | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 129 |             self.assertTrue(locals()["name"], "Failed to import %s" % name) | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 130 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 131 |         import t2.sub | 
 | 132 |         import t2.sub.subsub | 
 | 133 |         self.assertEqual(t2.__name__, "t2") | 
 | 134 |         self.assertEqual(t2.sub.__name__, "t2.sub") | 
 | 135 |         self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub") | 
| Fred Drake | 004d5e6 | 2000-10-23 17:22:08 +0000 | [diff] [blame] | 136 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 137 |         s = """ | 
 | 138 |             from t2 import * | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 139 |             self.assertTrue(dir(), ['self', 'sub']) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 140 |             """ | 
 | 141 |         self.run_code(s) | 
| Guido van Rossum | c8bf884 | 1997-09-08 16:06:20 +0000 | [diff] [blame] | 142 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 143 |     def test_3(self): | 
 | 144 |         hier = [ | 
 | 145 |                 ("t3", None), | 
 | 146 |                 ("t3 __init__.py", ""), | 
 | 147 |                 ("t3 sub", None), | 
 | 148 |                 ("t3 sub __init__.py", ""), | 
 | 149 |                 ("t3 sub subsub", None), | 
 | 150 |                 ("t3 sub subsub __init__.py", "spam = 1"), | 
 | 151 |                ] | 
 | 152 |         self.mkhier(hier) | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 153 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 154 |         import t3.sub.subsub | 
 | 155 |         self.assertEqual(t3.__name__, "t3") | 
 | 156 |         self.assertEqual(t3.sub.__name__, "t3.sub") | 
 | 157 |         self.assertEqual(t3.sub.subsub.__name__, "t3.sub.subsub") | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 158 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 159 |     def test_4(self): | 
 | 160 |         hier = [ | 
 | 161 |         ("t4.py", "raise RuntimeError('Shouldnt load t4.py')"), | 
 | 162 |         ("t4", None), | 
 | 163 |         ("t4 __init__.py", ""), | 
 | 164 |         ("t4 sub.py", "raise RuntimeError('Shouldnt load sub.py')"), | 
 | 165 |         ("t4 sub", None), | 
 | 166 |         ("t4 sub __init__.py", ""), | 
| Thomas Wouters | ed03b41 | 2007-08-28 21:37:11 +0000 | [diff] [blame] | 167 |         ("t4 sub subsub.py", | 
 | 168 |          "raise RuntimeError('Shouldnt load subsub.py')"), | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 169 |         ("t4 sub subsub", None), | 
 | 170 |         ("t4 sub subsub __init__.py", "spam = 1"), | 
 | 171 |                ] | 
 | 172 |         self.mkhier(hier) | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 173 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 174 |         s = """ | 
 | 175 |             from t4.sub.subsub import * | 
 | 176 |             self.assertEqual(spam, 1) | 
 | 177 |             """ | 
 | 178 |         self.run_code(s) | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 179 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 180 |     def test_5(self): | 
 | 181 |         hier = [ | 
 | 182 |         ("t5", None), | 
 | 183 |         ("t5 __init__.py", "import t5.foo"), | 
 | 184 |         ("t5 string.py", "spam = 1"), | 
 | 185 |         ("t5 foo.py", | 
 | 186 |          "from . import string; assert string.spam == 1"), | 
 | 187 |          ] | 
 | 188 |         self.mkhier(hier) | 
| Guido van Rossum | 6c61242 | 1997-09-06 18:42:57 +0000 | [diff] [blame] | 189 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 190 |         import t5 | 
 | 191 |         s = """ | 
 | 192 |             from t5 import * | 
 | 193 |             self.assertEqual(dir(), ['foo', 'self', 'string', 't5']) | 
 | 194 |             """ | 
 | 195 |         self.run_code(s) | 
| Guido van Rossum | 10887a3 | 1997-09-07 06:12:11 +0000 | [diff] [blame] | 196 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 197 |         import t5 | 
 | 198 |         self.assertEqual(fixdir(dir(t5)), | 
| Brett Cannon | fd07415 | 2012-04-14 14:10:13 -0400 | [diff] [blame] | 199 |                          ['__cached__', '__doc__', '__file__', '__loader__', | 
 | 200 |                           '__name__', '__package__', '__path__', 'foo', | 
 | 201 |                           'string', 't5']) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 202 |         self.assertEqual(fixdir(dir(t5.foo)), | 
| Brett Cannon | fd07415 | 2012-04-14 14:10:13 -0400 | [diff] [blame] | 203 |                          ['__cached__', '__doc__', '__file__', '__loader__', | 
 | 204 |                           '__name__', '__package__', 'string']) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 205 |         self.assertEqual(fixdir(dir(t5.string)), | 
| Brett Cannon | fd07415 | 2012-04-14 14:10:13 -0400 | [diff] [blame] | 206 |                          ['__cached__', '__doc__', '__file__', '__loader__', | 
 | 207 |                           '__name__', '__package__', 'spam']) | 
| Guido van Rossum | 5f4fb91 | 1998-05-19 15:09:42 +0000 | [diff] [blame] | 208 |  | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 209 |     def test_6(self): | 
 | 210 |         hier = [ | 
 | 211 |                 ("t6", None), | 
| Thomas Wouters | ed03b41 | 2007-08-28 21:37:11 +0000 | [diff] [blame] | 212 |                 ("t6 __init__.py", | 
 | 213 |                  "__all__ = ['spam', 'ham', 'eggs']"), | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 214 |                 ("t6 spam.py", ""), | 
 | 215 |                 ("t6 ham.py", ""), | 
 | 216 |                 ("t6 eggs.py", ""), | 
 | 217 |                ] | 
 | 218 |         self.mkhier(hier) | 
 | 219 |  | 
 | 220 |         import t6 | 
 | 221 |         self.assertEqual(fixdir(dir(t6)), | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 222 |                          ['__all__', '__cached__', '__doc__', '__file__', | 
| Brett Cannon | fd07415 | 2012-04-14 14:10:13 -0400 | [diff] [blame] | 223 |                           '__loader__', '__name__', '__package__', '__path__']) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 224 |         s = """ | 
 | 225 |             import t6 | 
 | 226 |             from t6 import * | 
 | 227 |             self.assertEqual(fixdir(dir(t6)), | 
| Barry Warsaw | 28a691b | 2010-04-17 00:19:56 +0000 | [diff] [blame] | 228 |                              ['__all__', '__cached__', '__doc__', '__file__', | 
| Brett Cannon | fd07415 | 2012-04-14 14:10:13 -0400 | [diff] [blame] | 229 |                               '__loader__', '__name__', '__package__', | 
 | 230 |                               '__path__', 'eggs', 'ham', 'spam']) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 231 |             self.assertEqual(dir(), ['eggs', 'ham', 'self', 'spam', 't6']) | 
 | 232 |             """ | 
 | 233 |         self.run_code(s) | 
 | 234 |  | 
 | 235 |     def test_7(self): | 
 | 236 |         hier = [ | 
 | 237 |                 ("t7.py", ""), | 
 | 238 |                 ("t7", None), | 
 | 239 |                 ("t7 __init__.py", ""), | 
| Thomas Wouters | ed03b41 | 2007-08-28 21:37:11 +0000 | [diff] [blame] | 240 |                 ("t7 sub.py", | 
 | 241 |                  "raise RuntimeError('Shouldnt load sub.py')"), | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 242 |                 ("t7 sub", None), | 
 | 243 |                 ("t7 sub __init__.py", ""), | 
| Thomas Wouters | ed03b41 | 2007-08-28 21:37:11 +0000 | [diff] [blame] | 244 |                 ("t7 sub .py", | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 245 |                  "raise RuntimeError('Shouldnt load subsub.py')"), | 
 | 246 |                 ("t7 sub subsub", None), | 
 | 247 |                 ("t7 sub subsub __init__.py", | 
 | 248 |                  "spam = 1"), | 
 | 249 |                ] | 
 | 250 |         self.mkhier(hier) | 
 | 251 |  | 
 | 252 |  | 
 | 253 |         t7, sub, subsub = None, None, None | 
 | 254 |         import t7 as tas | 
 | 255 |         self.assertEqual(fixdir(dir(tas)), | 
| Brett Cannon | fd07415 | 2012-04-14 14:10:13 -0400 | [diff] [blame] | 256 |                          ['__cached__', '__doc__', '__file__', '__loader__', | 
 | 257 |                           '__name__', '__package__', '__path__']) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 258 |         self.assertFalse(t7) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 259 |         from t7 import sub as subpar | 
 | 260 |         self.assertEqual(fixdir(dir(subpar)), | 
| Brett Cannon | fd07415 | 2012-04-14 14:10:13 -0400 | [diff] [blame] | 261 |                          ['__cached__', '__doc__', '__file__', '__loader__', | 
 | 262 |                           '__name__', '__package__', '__path__']) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 263 |         self.assertFalse(t7) | 
 | 264 |         self.assertFalse(sub) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 265 |         from t7.sub import subsub as subsubsub | 
 | 266 |         self.assertEqual(fixdir(dir(subsubsub)), | 
| Brett Cannon | fd07415 | 2012-04-14 14:10:13 -0400 | [diff] [blame] | 267 |                          ['__cached__', '__doc__', '__file__', '__loader__', | 
 | 268 |                           '__name__', '__package__', '__path__', 'spam']) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 269 |         self.assertFalse(t7) | 
 | 270 |         self.assertFalse(sub) | 
 | 271 |         self.assertFalse(subsub) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 272 |         from t7.sub.subsub import spam as ham | 
 | 273 |         self.assertEqual(ham, 1) | 
| Benjamin Peterson | c9c0f20 | 2009-06-30 23:06:06 +0000 | [diff] [blame] | 274 |         self.assertFalse(t7) | 
 | 275 |         self.assertFalse(sub) | 
 | 276 |         self.assertFalse(subsub) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 277 |  | 
| R. David Murray | 378c0cf | 2010-02-24 01:46:21 +0000 | [diff] [blame] | 278 |     @unittest.skipIf(sys.flags.optimize >= 2, | 
 | 279 |                      "Docstrings are omitted with -O2 and above") | 
 | 280 |     def test_8(self): | 
 | 281 |         hier = [ | 
 | 282 |                 ("t8", None), | 
 | 283 |                 ("t8 __init__"+os.extsep+"py", "'doc for t8'"), | 
 | 284 |                ] | 
 | 285 |         self.mkhier(hier) | 
 | 286 |  | 
 | 287 |         import t8 | 
 | 288 |         self.assertEqual(t8.__doc__, "doc for t8") | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 289 |  | 
 | 290 | def test_main(): | 
| Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 291 |     support.run_unittest(__name__) | 
| Collin Winter | 11e065b | 2007-08-24 19:15:12 +0000 | [diff] [blame] | 292 |  | 
 | 293 |  | 
 | 294 | if __name__ == "__main__": | 
 | 295 |     test_main() |