configurationengine/source/runtests.py
author terytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 3 e7e0ae78773e
permissions -rw-r--r--
Adding EPL version of configurationengine.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
# Script for running all ConE unit tests (cone, plug-ins and scripts).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
import os, sys, re, imp
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
import unittest
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
# Path to the directory where this file is located
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
# For module 'testautomation'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
sys.path.append(os.path.join(ROOT_PATH, 'testautomation'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
from testautomation import testcli
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
import cone
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
import cone.public.plugin
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
def _load_module(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
    if not path.endswith('.py'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
        raise ValueError("Given parameter ('%s') is not a .py file" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    dir = os.path.dirname(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    sys.path.insert(0, dir)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
        modname = path.replace('.', '_')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
        return imp.load_source(modname, path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
    finally:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
        del sys.path[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
        # Since the module name __init__ is needed in many places,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
        # but its contents may differ, remove it from sys.modules
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
        # in order to force reloading every time
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
        if '__init__' in sys.modules:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
            del sys.modules['__init__']
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
def _collect_unittest_suite_from_file(file_path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
    suite = unittest.TestSuite()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
    module = _load_module(file_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
    suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
    return suite
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
def _find_unittest_files(path, recursive=True):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
    Find all unittest_*.py files under the given directory.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
    pattern = re.compile(r'^unittest_.*\.py$')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
    unittest_files = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
    if recursive:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
        for root, dirs, files in os.walk(path, topdown=True):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
            for filename in files:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
                if pattern.match(filename) != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
                    filepath = os.path.abspath(os.path.join(root, filename))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
                    unittest_files.append(filepath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
        for filename in os.listdir(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
            if pattern.match(filename) != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
                filepath = os.path.abspath(os.path.join(path, filename))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
                unittest_files.append(filepath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
    return unittest_files
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
def _collect_unittest_suite_from_path(path, recursive=True):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
    Collect a test suite containing all test cases loaded from
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
    unittest_*.py files in the given directory.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
    path = os.path.abspath(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
    # Collect the list of .py files containing unit tests
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
    unittest_files = _find_unittest_files(path, recursive)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
    # Load the files as modules and load tests from them
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
    suite = unittest.TestSuite()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
    for file in unittest_files:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
        module = _load_module(file)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
        suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
    return suite
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
def _collect_suite():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
    def get_suite(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        return _collect_unittest_suite_from_path(os.path.join(ROOT_PATH, path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
    def get_suite_from_file(file_path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
        return _collect_unittest_suite_from_file(os.path.join(ROOT_PATH, file_path))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
    suite = unittest.TestSuite()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
    suite.addTests(get_suite('cone'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
    suite.addTests(get_suite('scripts/tests'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
    suite.addTests(get_suite('plugins'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
    suite.addTests(get_suite('testautomation'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
    # Tests can also be loaded from a file:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
    #suite.addTests(get_suite_from_file('cone/public/tests/unittest_rules_on_configuration.py'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
    # Force-reload all ConE plug-in reader classes, since the __init__.py
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
    # files in the imported test cases have added plug-in sources to sys.path
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
    cone.public.plugin.ImplFactory.force_reload_reader_classes()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
    return suite
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
def _run_without_nose():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
    suite = _collect_suite()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
    unittest.TextTestRunner(verbosity=2).run(suite)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
def _run_with_nose():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
    # Call plugin_utils.init_all() so that all plug-ins are loaded
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
    # (otherwise script tests, plug-in unit tests and plug-in integration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
    # tests would not work)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
    PLUGIN_SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, 'plugins'))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
    assert os.path.isdir(PLUGIN_SOURCE_ROOT)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
    sys.path.append(PLUGIN_SOURCE_ROOT)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
    import plugin_utils
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
    plugin_utils.init_all()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
    # Find all unittest_*.py files
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
    test_files = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
    def add_tests(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
        test_files.extend(_find_unittest_files(os.path.join(ROOT_PATH, path)))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
    add_tests('cone')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
    add_tests('scripts/tests')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
    add_tests('plugins')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
    add_tests('testautomation')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
    # Configure nose
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
    import nose
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
    plugins = nose.plugins.manager.DefaultPluginManager()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
    conf = nose.config.Config(plugins=plugins, testNames=test_files)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
    # Run the tests
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
    args = ['--verbosity=3',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
            '--with-xunit',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
            '--xunit-file=cone-alltests.xml',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
            #'--collect-only',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
            ]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
    nose.run(config=conf, argv=[sys.argv[0]] + args)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
def main():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
    if '--with-nose' in sys.argv:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
        _run_with_nose()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
        _run_without_nose()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
if __name__ == '__main__':
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
    main()