]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Lib/unittest/test/test_discovery.py
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Lib / unittest / test / test_discovery.py
CommitLineData
4710c53d 1import os\r
2import re\r
3import sys\r
4\r
5import unittest\r
6\r
7\r
8class TestDiscovery(unittest.TestCase):\r
9\r
10 # Heavily mocked tests so I can avoid hitting the filesystem\r
11 def test_get_name_from_path(self):\r
12 loader = unittest.TestLoader()\r
13\r
14 loader._top_level_dir = '/foo'\r
15 name = loader._get_name_from_path('/foo/bar/baz.py')\r
16 self.assertEqual(name, 'bar.baz')\r
17\r
18 if not __debug__:\r
19 # asserts are off\r
20 return\r
21\r
22 with self.assertRaises(AssertionError):\r
23 loader._get_name_from_path('/bar/baz.py')\r
24\r
25 def test_find_tests(self):\r
26 loader = unittest.TestLoader()\r
27\r
28 original_listdir = os.listdir\r
29 def restore_listdir():\r
30 os.listdir = original_listdir\r
31 original_isfile = os.path.isfile\r
32 def restore_isfile():\r
33 os.path.isfile = original_isfile\r
34 original_isdir = os.path.isdir\r
35 def restore_isdir():\r
36 os.path.isdir = original_isdir\r
37\r
38 path_lists = [['test1.py', 'test2.py', 'not_a_test.py', 'test_dir',\r
39 'test.foo', 'test-not-a-module.py', 'another_dir'],\r
40 ['test3.py', 'test4.py', ]]\r
41 os.listdir = lambda path: path_lists.pop(0)\r
42 self.addCleanup(restore_listdir)\r
43\r
44 def isdir(path):\r
45 return path.endswith('dir')\r
46 os.path.isdir = isdir\r
47 self.addCleanup(restore_isdir)\r
48\r
49 def isfile(path):\r
50 # another_dir is not a package and so shouldn't be recursed into\r
51 return not path.endswith('dir') and not 'another_dir' in path\r
52 os.path.isfile = isfile\r
53 self.addCleanup(restore_isfile)\r
54\r
55 loader._get_module_from_name = lambda path: path + ' module'\r
56 loader.loadTestsFromModule = lambda module: module + ' tests'\r
57\r
58 top_level = os.path.abspath('/foo')\r
59 loader._top_level_dir = top_level\r
60 suite = list(loader._find_tests(top_level, 'test*.py'))\r
61\r
62 expected = [name + ' module tests' for name in\r
63 ('test1', 'test2')]\r
64 expected.extend([('test_dir.%s' % name) + ' module tests' for name in\r
65 ('test3', 'test4')])\r
66 self.assertEqual(suite, expected)\r
67\r
68 def test_find_tests_with_package(self):\r
69 loader = unittest.TestLoader()\r
70\r
71 original_listdir = os.listdir\r
72 def restore_listdir():\r
73 os.listdir = original_listdir\r
74 original_isfile = os.path.isfile\r
75 def restore_isfile():\r
76 os.path.isfile = original_isfile\r
77 original_isdir = os.path.isdir\r
78 def restore_isdir():\r
79 os.path.isdir = original_isdir\r
80\r
81 directories = ['a_directory', 'test_directory', 'test_directory2']\r
82 path_lists = [directories, [], [], []]\r
83 os.listdir = lambda path: path_lists.pop(0)\r
84 self.addCleanup(restore_listdir)\r
85\r
86 os.path.isdir = lambda path: True\r
87 self.addCleanup(restore_isdir)\r
88\r
89 os.path.isfile = lambda path: os.path.basename(path) not in directories\r
90 self.addCleanup(restore_isfile)\r
91\r
92 class Module(object):\r
93 paths = []\r
94 load_tests_args = []\r
95\r
96 def __init__(self, path):\r
97 self.path = path\r
98 self.paths.append(path)\r
99 if os.path.basename(path) == 'test_directory':\r
100 def load_tests(loader, tests, pattern):\r
101 self.load_tests_args.append((loader, tests, pattern))\r
102 return 'load_tests'\r
103 self.load_tests = load_tests\r
104\r
105 def __eq__(self, other):\r
106 return self.path == other.path\r
107\r
108 # Silence py3k warning\r
109 __hash__ = None\r
110\r
111 loader._get_module_from_name = lambda name: Module(name)\r
112 def loadTestsFromModule(module, use_load_tests):\r
113 if use_load_tests:\r
114 raise self.failureException('use_load_tests should be False for packages')\r
115 return module.path + ' module tests'\r
116 loader.loadTestsFromModule = loadTestsFromModule\r
117\r
118 loader._top_level_dir = '/foo'\r
119 # this time no '.py' on the pattern so that it can match\r
120 # a test package\r
121 suite = list(loader._find_tests('/foo', 'test*'))\r
122\r
123 # We should have loaded tests from the test_directory package by calling load_tests\r
124 # and directly from the test_directory2 package\r
125 self.assertEqual(suite,\r
126 ['load_tests', 'test_directory2' + ' module tests'])\r
127 self.assertEqual(Module.paths, ['test_directory', 'test_directory2'])\r
128\r
129 # load_tests should have been called once with loader, tests and pattern\r
130 self.assertEqual(Module.load_tests_args,\r
131 [(loader, 'test_directory' + ' module tests', 'test*')])\r
132\r
133 def test_discover(self):\r
134 loader = unittest.TestLoader()\r
135\r
136 original_isfile = os.path.isfile\r
137 original_isdir = os.path.isdir\r
138 def restore_isfile():\r
139 os.path.isfile = original_isfile\r
140\r
141 os.path.isfile = lambda path: False\r
142 self.addCleanup(restore_isfile)\r
143\r
144 orig_sys_path = sys.path[:]\r
145 def restore_path():\r
146 sys.path[:] = orig_sys_path\r
147 self.addCleanup(restore_path)\r
148\r
149 full_path = os.path.abspath(os.path.normpath('/foo'))\r
150 with self.assertRaises(ImportError):\r
151 loader.discover('/foo/bar', top_level_dir='/foo')\r
152\r
153 self.assertEqual(loader._top_level_dir, full_path)\r
154 self.assertIn(full_path, sys.path)\r
155\r
156 os.path.isfile = lambda path: True\r
157 os.path.isdir = lambda path: True\r
158\r
159 def restore_isdir():\r
160 os.path.isdir = original_isdir\r
161 self.addCleanup(restore_isdir)\r
162\r
163 _find_tests_args = []\r
164 def _find_tests(start_dir, pattern):\r
165 _find_tests_args.append((start_dir, pattern))\r
166 return ['tests']\r
167 loader._find_tests = _find_tests\r
168 loader.suiteClass = str\r
169\r
170 suite = loader.discover('/foo/bar/baz', 'pattern', '/foo/bar')\r
171\r
172 top_level_dir = os.path.abspath('/foo/bar')\r
173 start_dir = os.path.abspath('/foo/bar/baz')\r
174 self.assertEqual(suite, "['tests']")\r
175 self.assertEqual(loader._top_level_dir, top_level_dir)\r
176 self.assertEqual(_find_tests_args, [(start_dir, 'pattern')])\r
177 self.assertIn(top_level_dir, sys.path)\r
178\r
179 def test_discover_with_modules_that_fail_to_import(self):\r
180 loader = unittest.TestLoader()\r
181\r
182 listdir = os.listdir\r
183 os.listdir = lambda _: ['test_this_does_not_exist.py']\r
184 isfile = os.path.isfile\r
185 os.path.isfile = lambda _: True\r
186 orig_sys_path = sys.path[:]\r
187 def restore():\r
188 os.path.isfile = isfile\r
189 os.listdir = listdir\r
190 sys.path[:] = orig_sys_path\r
191 self.addCleanup(restore)\r
192\r
193 suite = loader.discover('.')\r
194 self.assertIn(os.getcwd(), sys.path)\r
195 self.assertEqual(suite.countTestCases(), 1)\r
196 test = list(list(suite)[0])[0] # extract test from suite\r
197\r
198 with self.assertRaises(ImportError):\r
199 test.test_this_does_not_exist()\r
200\r
201 def test_command_line_handling_parseArgs(self):\r
202 # Haha - take that uninstantiable class\r
203 program = object.__new__(unittest.TestProgram)\r
204\r
205 args = []\r
206 def do_discovery(argv):\r
207 args.extend(argv)\r
208 program._do_discovery = do_discovery\r
209 program.parseArgs(['something', 'discover'])\r
210 self.assertEqual(args, [])\r
211\r
212 program.parseArgs(['something', 'discover', 'foo', 'bar'])\r
213 self.assertEqual(args, ['foo', 'bar'])\r
214\r
215 def test_command_line_handling_do_discovery_too_many_arguments(self):\r
216 class Stop(Exception):\r
217 pass\r
218 def usageExit():\r
219 raise Stop\r
220\r
221 program = object.__new__(unittest.TestProgram)\r
222 program.usageExit = usageExit\r
223\r
224 with self.assertRaises(Stop):\r
225 # too many args\r
226 program._do_discovery(['one', 'two', 'three', 'four'])\r
227\r
228\r
229 def test_command_line_handling_do_discovery_calls_loader(self):\r
230 program = object.__new__(unittest.TestProgram)\r
231\r
232 class Loader(object):\r
233 args = []\r
234 def discover(self, start_dir, pattern, top_level_dir):\r
235 self.args.append((start_dir, pattern, top_level_dir))\r
236 return 'tests'\r
237\r
238 program._do_discovery(['-v'], Loader=Loader)\r
239 self.assertEqual(program.verbosity, 2)\r
240 self.assertEqual(program.test, 'tests')\r
241 self.assertEqual(Loader.args, [('.', 'test*.py', None)])\r
242\r
243 Loader.args = []\r
244 program = object.__new__(unittest.TestProgram)\r
245 program._do_discovery(['--verbose'], Loader=Loader)\r
246 self.assertEqual(program.test, 'tests')\r
247 self.assertEqual(Loader.args, [('.', 'test*.py', None)])\r
248\r
249 Loader.args = []\r
250 program = object.__new__(unittest.TestProgram)\r
251 program._do_discovery([], Loader=Loader)\r
252 self.assertEqual(program.test, 'tests')\r
253 self.assertEqual(Loader.args, [('.', 'test*.py', None)])\r
254\r
255 Loader.args = []\r
256 program = object.__new__(unittest.TestProgram)\r
257 program._do_discovery(['fish'], Loader=Loader)\r
258 self.assertEqual(program.test, 'tests')\r
259 self.assertEqual(Loader.args, [('fish', 'test*.py', None)])\r
260\r
261 Loader.args = []\r
262 program = object.__new__(unittest.TestProgram)\r
263 program._do_discovery(['fish', 'eggs'], Loader=Loader)\r
264 self.assertEqual(program.test, 'tests')\r
265 self.assertEqual(Loader.args, [('fish', 'eggs', None)])\r
266\r
267 Loader.args = []\r
268 program = object.__new__(unittest.TestProgram)\r
269 program._do_discovery(['fish', 'eggs', 'ham'], Loader=Loader)\r
270 self.assertEqual(program.test, 'tests')\r
271 self.assertEqual(Loader.args, [('fish', 'eggs', 'ham')])\r
272\r
273 Loader.args = []\r
274 program = object.__new__(unittest.TestProgram)\r
275 program._do_discovery(['-s', 'fish'], Loader=Loader)\r
276 self.assertEqual(program.test, 'tests')\r
277 self.assertEqual(Loader.args, [('fish', 'test*.py', None)])\r
278\r
279 Loader.args = []\r
280 program = object.__new__(unittest.TestProgram)\r
281 program._do_discovery(['-t', 'fish'], Loader=Loader)\r
282 self.assertEqual(program.test, 'tests')\r
283 self.assertEqual(Loader.args, [('.', 'test*.py', 'fish')])\r
284\r
285 Loader.args = []\r
286 program = object.__new__(unittest.TestProgram)\r
287 program._do_discovery(['-p', 'fish'], Loader=Loader)\r
288 self.assertEqual(program.test, 'tests')\r
289 self.assertEqual(Loader.args, [('.', 'fish', None)])\r
290 self.assertFalse(program.failfast)\r
291 self.assertFalse(program.catchbreak)\r
292\r
293 Loader.args = []\r
294 program = object.__new__(unittest.TestProgram)\r
295 program._do_discovery(['-p', 'eggs', '-s', 'fish', '-v', '-f', '-c'],\r
296 Loader=Loader)\r
297 self.assertEqual(program.test, 'tests')\r
298 self.assertEqual(Loader.args, [('fish', 'eggs', None)])\r
299 self.assertEqual(program.verbosity, 2)\r
300 self.assertTrue(program.failfast)\r
301 self.assertTrue(program.catchbreak)\r
302\r
303 def test_detect_module_clash(self):\r
304 class Module(object):\r
305 __file__ = 'bar/foo.py'\r
306 sys.modules['foo'] = Module\r
307 full_path = os.path.abspath('foo')\r
308 original_listdir = os.listdir\r
309 original_isfile = os.path.isfile\r
310 original_isdir = os.path.isdir\r
311\r
312 def cleanup():\r
313 os.listdir = original_listdir\r
314 os.path.isfile = original_isfile\r
315 os.path.isdir = original_isdir\r
316 del sys.modules['foo']\r
317 if full_path in sys.path:\r
318 sys.path.remove(full_path)\r
319 self.addCleanup(cleanup)\r
320\r
321 def listdir(_):\r
322 return ['foo.py']\r
323 def isfile(_):\r
324 return True\r
325 def isdir(_):\r
326 return True\r
327 os.listdir = listdir\r
328 os.path.isfile = isfile\r
329 os.path.isdir = isdir\r
330\r
331 loader = unittest.TestLoader()\r
332\r
333 mod_dir = os.path.abspath('bar')\r
334 expected_dir = os.path.abspath('foo')\r
335 msg = re.escape(r"'foo' module incorrectly imported from %r. Expected %r. "\r
336 "Is this module globally installed?" % (mod_dir, expected_dir))\r
337 self.assertRaisesRegexp(\r
338 ImportError, '^%s$' % msg, loader.discover,\r
339 start_dir='foo', pattern='foo.py'\r
340 )\r
341 self.assertEqual(sys.path[0], full_path)\r
342\r
343\r
344 def test_discovery_from_dotted_path(self):\r
345 loader = unittest.TestLoader()\r
346\r
347 tests = [self]\r
348 expectedPath = os.path.abspath(os.path.dirname(unittest.test.__file__))\r
349\r
350 self.wasRun = False\r
351 def _find_tests(start_dir, pattern):\r
352 self.wasRun = True\r
353 self.assertEqual(start_dir, expectedPath)\r
354 return tests\r
355 loader._find_tests = _find_tests\r
356 suite = loader.discover('unittest.test')\r
357 self.assertTrue(self.wasRun)\r
358 self.assertEqual(suite._tests, tests)\r
359\r
360\r
361if __name__ == '__main__':\r
362 unittest.main()\r