tests/runAll.py
author robin <robin@reportlab.com>
Tue, 20 Jun 2017 12:19:01 +0100
changeset 4364 2202f1517d21
parent 4330 617ffa6bbdc8
child 4480 d3536e9f6dbe
permissions -rw-r--r--
exit with status if main prog
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
     1
#!/usr/bin/env python
4330
617ffa6bbdc8 changes for release 3.4.0
robin <robin@reportlab.com>
parents: 4252
diff changeset
     2
#Copyright ReportLab Europe Ltd. 2000-2017
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
     3
#see license.txt for license details
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
     4
"""Runs all test files in all subfolders.
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
     5
"""
4252
fe660f227cac changes for release 3.3.0
robin
parents: 3780
diff changeset
     6
__version__='3.3.0'
3731
b233dd0577ff another round of changes mostly type related
rptlab
parents: 3721
diff changeset
     7
import os, glob, sys, traceback, unittest
2978
1e68f6a61dfe fixed so test suite can be run in test dir
andy
parents: 2967
diff changeset
     8
1e68f6a61dfe fixed so test suite can be run in test dir
andy
parents: 2967
diff changeset
     9
#we need to ensure 'tests' is on the path.  It will be if you
1e68f6a61dfe fixed so test suite can be run in test dir
andy
parents: 2967
diff changeset
    10
#run 'setup.py tests', but won't be if you CD into the tests
1e68f6a61dfe fixed so test suite can be run in test dir
andy
parents: 2967
diff changeset
    11
#directory and run this directly
2987
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    12
if __name__=='__main__':
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    13
    P=[]
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    14
    try:
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    15
        from reportlab.lib.testutils import setOutDir
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    16
    except ImportError:
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    17
        if __name__=='__main__':
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    18
            topDir = os.path.dirname(sys.argv[0])
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    19
            if not topDir: topDir = os.getcwd()
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    20
        else:
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    21
            topDir = os.path.dirname(__file__)
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    22
        topDir = os.path.dirname(os.path.abspath(topDir))
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    23
        if not os.path.isdir(os.path.join(topDir,'reportlab')):
2989
4e65295b3eef Tests: Fixes and changes to run rlextra tests if available.
jonas
parents: 2987
diff changeset
    24
            topDir=os.path.join(topDir,'src')
4e65295b3eef Tests: Fixes and changes to run rlextra tests if available.
jonas
parents: 2987
diff changeset
    25
            assert os.path.isdir(os.path.join(topDir,'reportlab')), "Cannot find reportlab"
2987
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    26
        sys.path.insert(0, topDir)
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    27
        P.append(topDir)
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    28
        del topDir
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    29
        from reportlab.lib.testutils import setOutDir
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    30
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    31
    setOutDir(__name__)
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    32
    from reportlab.lib.testutils import testsFolder as topDir
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    33
    if topDir:
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    34
        topDir = os.path.dirname(topDir)
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    35
        if topDir not in sys.path:
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    36
            sys.path.insert(0,topDir)
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    37
            P.append(topDir)
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    38
    del topDir
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    39
    from reportlab.lib.testutils import GlobDirectoryWalker, outputfile, printLocation
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    40
    pp = os.environ.get('PYTHONPATH','')
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    41
    if pp: P.append(pp)
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    42
    del pp
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    43
    os.environ['PYTHONPATH']=os.pathsep.join(P)
711910106e3a tests: more changes to testsFolder and friends
rgbecker
parents: 2984
diff changeset
    44
    del P
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    45
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    46
def makeSuite(folder, exclude=[],nonImportable=[],pattern='test_*.py'):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    47
    "Build a test suite of all available test files."
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    48
    allTests = unittest.TestSuite()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    49
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    50
    if os.path.isdir(folder): sys.path.insert(0, folder)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    51
    for filename in GlobDirectoryWalker(folder, pattern):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    52
        modname = os.path.splitext(os.path.basename(filename))[0]
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    53
        if modname not in exclude:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    54
            try:
3780
b809eb915503 attempt to fix module import using a namespace
robin
parents: 3731
diff changeset
    55
                ns ={}
b809eb915503 attempt to fix module import using a namespace
robin
parents: 3731
diff changeset
    56
                exec('import %s as module' % modname,ns)
b809eb915503 attempt to fix module import using a namespace
robin
parents: 3731
diff changeset
    57
                allTests.addTest(ns['module'].makeSuite())
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    58
            except:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    59
                tt, tv, tb = sys.exc_info()[:]
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    60
                nonImportable.append((filename,traceback.format_exception(tt,tv,tb)))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    61
                del tt,tv,tb
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    62
    del sys.path[0]
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    63
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    64
    return allTests
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    65
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    66
def main(pattern='test_*.py'):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    67
    try:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    68
        folder = os.path.dirname(__file__)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    69
        assert folder
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    70
    except:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    71
        folder = os.path.dirname(sys.argv[0]) or os.getcwd()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    72
    #allow for Benn's "screwball cygwin distro":
2966
c9df63ccabdf reportlab-2.2: major changes to make tests run
rgbecker
parents: 2963
diff changeset
    73
    if not folder:
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    74
        folder = '.'
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    75
    from reportlab.lib.utils import isSourceDistro
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    76
    haveSRC = isSourceDistro()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    77
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    78
    def cleanup(folder,patterns=('*.pdf', '*.log','*.svg','runAll.txt', 'test_*.txt','_i_am_actually_a_*.*')):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    79
        if not folder: return
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    80
        for pat in patterns:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    81
            for filename in GlobDirectoryWalker(folder, pattern=pat):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    82
                try:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    83
                    os.remove(filename)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    84
                except:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    85
                    pass
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    86
2967
ea62529bd1df reportlab-2.2: first stage changes in on the trunk
rgbecker
parents: 2966
diff changeset
    87
    # special case for tests directory - clean up
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    88
    # all PDF & log files before starting run.  You don't
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    89
    # want this if reusing runAll anywhere else.
3731
b233dd0577ff another round of changes mostly type related
rptlab
parents: 3721
diff changeset
    90
    if os.sep+'tests' in folder: cleanup(folder)
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    91
    cleanup(outputfile(''))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    92
    NI = []
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    93
    cleanOnly = '--clean' in sys.argv
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    94
    if not cleanOnly:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    95
        testSuite = makeSuite(folder,nonImportable=NI,pattern=pattern+(not haveSRC and 'c' or ''))
4364
2202f1517d21 exit with status if main prog
robin <robin@reportlab.com>
parents: 4330
diff changeset
    96
        result = unittest.TextTestRunner().run(testSuite)
2202f1517d21 exit with status if main prog
robin <robin@reportlab.com>
parents: 4330
diff changeset
    97
    else:
2202f1517d21 exit with status if main prog
robin <robin@reportlab.com>
parents: 4330
diff changeset
    98
        result = None
2989
4e65295b3eef Tests: Fixes and changes to run rlextra tests if available.
jonas
parents: 2987
diff changeset
    99
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   100
    if haveSRC: cleanup(folder,patterns=('*.pyc','*.pyo'))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   101
    if not cleanOnly:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   102
        if NI:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   103
            sys.stderr.write('\n###################### the following tests could not be imported\n')
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   104
            for f,tb in NI:
3731
b233dd0577ff another round of changes mostly type related
rptlab
parents: 3721
diff changeset
   105
                print('file: "%s"\n%s\n' % (f,''.join(tb)))
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   106
        printLocation()
4364
2202f1517d21 exit with status if main prog
robin <robin@reportlab.com>
parents: 4330
diff changeset
   107
    if __name__=='__main__':
2202f1517d21 exit with status if main prog
robin <robin@reportlab.com>
parents: 4330
diff changeset
   108
        sys.exit(1 if result and not result.wasSuccessful() else 0)
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   109
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   110
def mainEx():
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   111
    '''for use in subprocesses'''
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   112
    try:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   113
        main()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   114
    finally:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   115
        sys.stdout.flush()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   116
        sys.stderr.flush()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   117
        sys.stdout.close()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   118
        os.close(sys.stderr.fileno())
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   119
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   120
def runExternally():
3360
8f6bd331cb85 reportlab: add fixes for spaces in path contributed by Yoann Roman
rgbecker
parents: 2992
diff changeset
   121
    cmd = '"%s" -c"from tests import runAll;runAll.mainEx()"' % sys.executable
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   122
    i,o,e=os.popen3(cmd)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   123
    i.close()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   124
    out = o.read()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   125
    err=e.read()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   126
    return '\n'.join((out,err))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   127
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   128
def checkForFailure(outerr):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   129
    return '\nFAILED' in outerr
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   130
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   131
if __name__ == '__main__': #noruntests
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   132
    main()