/ test.py
test.py
1 # Copyright (C) 2005-2012 Aaron Bentley <abentley@panoramicfeedback.com> 2 # Chris Ball <cjb@laptop.org> 3 # Marien Zwart <marien.zwart@gmail.com> 4 # W. Trevor King <wking@tremily.us> 5 # 6 # This file is part of Bugs Everywhere. 7 # 8 # Bugs Everywhere is free software: you can redistribute it and/or modify it 9 # under the terms of the GNU General Public License as published by the Free 10 # Software Foundation, either version 2 of the License, or (at your option) any 11 # later version. 12 # 13 # Bugs Everywhere is distributed in the hope that it will be useful, but 14 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 16 # more details. 17 # 18 # You should have received a copy of the GNU General Public License along with 19 # Bugs Everywhere. If not, see <http://www.gnu.org/licenses/>. 20 21 import doctest 22 import os 23 import os.path 24 import sys 25 import unittest 26 27 import libbe 28 libbe.TESTING = True 29 from libbe.util.tree import Tree 30 from libbe.util.plugin import import_by_name 31 from libbe.version import version 32 33 def python_tree(root_path='libbe', root_modname='libbe'): 34 tree = Tree() 35 tree.path = root_path 36 tree.parent = None 37 stack = [tree] 38 while len(stack) > 0: 39 f = stack.pop(0) 40 if f.path.endswith('.py'): 41 f.name = os.path.basename(f.path)[:-len('.py')] 42 elif os.path.isdir(f.path) \ 43 and os.path.exists(os.path.join(f.path, '__init__.py')): 44 f.name = os.path.basename(f.path) 45 f.is_module = True 46 for child in os.listdir(f.path): 47 if child == '__init__.py': 48 continue 49 c = Tree() 50 c.path = os.path.join(f.path, child) 51 c.parent = f 52 stack.append(c) 53 else: 54 continue 55 if f.parent == None: 56 f.modname = root_modname 57 else: 58 f.modname = f.parent.modname + '.' + f.name 59 f.parent.append(f) 60 return tree 61 62 def add_module_tests(suite, modname): 63 try: 64 mod = import_by_name(modname) 65 except ValueError as e: 66 sys.stderr.write('Failed to import "{}"\n'.format(modname)) 67 raise e 68 if hasattr(mod, 'suite'): 69 s = mod.suite 70 else: 71 s = unittest.TestLoader().loadTestsFromModule(mod) 72 try: 73 sdoc = doctest.DocTestSuite(mod) 74 suite.addTest(sdoc) 75 except ValueError: 76 pass 77 suite.addTest(s) 78 79 if __name__ == '__main__': 80 import optparse 81 parser = optparse.OptionParser(usage='%prog [options] [modules ...]', 82 description= 83 """When called without optional module names, run the test suites for 84 *all* modules. This may raise lots of errors if you haven't installed 85 one of the versioning control systems. 86 87 When called with module name arguments, only run the test suites from 88 those modules and their submodules. For example:: 89 90 $ python test.py libbe.bugdir libbe.storage 91 """) 92 parser.add_option('-q', '--quiet', action='store_true', default=False, 93 help='Run unittests in quiet mode (verbosity 1).') 94 options,args = parser.parse_args() 95 sys.stderr.write('Testing BE\n{}\n'.format(version(verbose=True))) 96 97 verbosity = 2 98 if options.quiet == True: 99 verbosity = 1 100 101 suite = unittest.TestSuite() 102 tree = python_tree() 103 if len(args) == 0: 104 for node in tree.traverse(): 105 add_module_tests(suite, node.modname) 106 else: 107 added = [] 108 for modname in args: 109 for node in tree.traverse(): 110 if node.modname == modname: 111 for n in node.traverse(): 112 if n.modname not in added: 113 add_module_tests(suite, n.modname) 114 added.append(n.modname) 115 break 116 117 result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 118 119 numErrors = len(result.errors) 120 numFailures = len(result.failures) 121 numBad = numErrors + numFailures 122 if numBad > 126: 123 numBad = 1 124 sys.exit(numBad)