122 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 | 
						|
 | 
						|
# Copyright 2010 United States Government as represented by the
 | 
						|
# Administrator of the National Aeronautics and Space Administration.
 | 
						|
# All Rights Reserved.
 | 
						|
#
 | 
						|
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
						|
#    not use this file except in compliance with the License. You may obtain
 | 
						|
#    a copy of the License at
 | 
						|
#
 | 
						|
#         http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
#    Unless required by applicable law or agreed to in writing, software
 | 
						|
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
						|
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 | 
						|
#    License for the specific language governing permissions and limitations
 | 
						|
#    under the License.
 | 
						|
 | 
						|
"""
 | 
						|
This is our basic test running framework based on Twisted's Trial.
 | 
						|
 | 
						|
Usage Examples:
 | 
						|
 | 
						|
    # to run all the tests
 | 
						|
    python run_tests.py
 | 
						|
 | 
						|
    # to run a specific test suite imported here
 | 
						|
    python run_tests.py NodeConnectionTestCase
 | 
						|
 | 
						|
    # to run a specific test imported here
 | 
						|
    python run_tests.py NodeConnectionTestCase.test_reboot
 | 
						|
 | 
						|
    # to run some test suites elsewhere
 | 
						|
    python run_tests.py nova.tests.node_unittest
 | 
						|
    python run_tests.py nova.tests.node_unittest.NodeConnectionTestCase
 | 
						|
 | 
						|
Due to our use of multiprocessing it we frequently get some ignorable
 | 
						|
'Interrupted system call' exceptions after test completion.
 | 
						|
 | 
						|
"""
 | 
						|
import __main__
 | 
						|
import os
 | 
						|
import sys
 | 
						|
 | 
						|
 | 
						|
from twisted.scripts import trial as trial_script
 | 
						|
 | 
						|
from nova import datastore
 | 
						|
from nova import flags
 | 
						|
from nova import twistd
 | 
						|
 | 
						|
from nova.tests.access_unittest import *
 | 
						|
from nova.tests.auth_unittest import *
 | 
						|
from nova.tests.api_unittest import *
 | 
						|
from nova.tests.cloud_unittest import *
 | 
						|
from nova.tests.compute_unittest import *
 | 
						|
from nova.tests.model_unittest import *
 | 
						|
from nova.tests.network_unittest import *
 | 
						|
from nova.tests.objectstore_unittest import *
 | 
						|
from nova.tests.process_unittest import *
 | 
						|
from nova.tests.validator_unittest import *
 | 
						|
from nova.tests.volume_unittest import *
 | 
						|
 | 
						|
 | 
						|
FLAGS = flags.FLAGS
 | 
						|
 | 
						|
flags.DEFINE_bool('flush_db', True,
 | 
						|
                  'Flush the database before running fake tests')
 | 
						|
 | 
						|
flags.DEFINE_string('tests_stderr', 'run_tests.err.log',
 | 
						|
                    'Path to where to pipe STDERR during test runs. Default = "run_tests.err.log"')
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    OptionsClass = twistd.WrapTwistedOptions(trial_script.Options)
 | 
						|
    config = OptionsClass()
 | 
						|
    argv = config.parseOptions()
 | 
						|
 | 
						|
    FLAGS.verbose = True
 | 
						|
 | 
						|
    # TODO(termie): these should make a call instead of doing work on import
 | 
						|
    if FLAGS.fake_tests:
 | 
						|
        from nova.tests.fake_flags import *
 | 
						|
        # use db 8 for fake tests
 | 
						|
        FLAGS.redis_db = 8
 | 
						|
        if FLAGS.flush_db:
 | 
						|
            logging.info("Flushing redis datastore")
 | 
						|
            r = datastore.Redis.instance()
 | 
						|
            r.flushdb()
 | 
						|
    else:
 | 
						|
        from nova.tests.real_flags import *
 | 
						|
 | 
						|
    # Establish redirect for STDERR
 | 
						|
    sys.stderr.flush()
 | 
						|
    err = open(FLAGS.tests_stderr, 'w+', 0)
 | 
						|
    os.dup2(err.fileno(), sys.stderr.fileno())
 | 
						|
 | 
						|
    if len(argv) == 1 and len(config['tests']) == 0:
 | 
						|
        # If no tests were specified run the ones imported in this file
 | 
						|
        # NOTE(termie): "tests" is not a flag, just some Trial related stuff
 | 
						|
        config['tests'].update(['__main__'])
 | 
						|
    elif len(config['tests']):
 | 
						|
        # If we specified tests check first whether they are in __main__
 | 
						|
        for arg in config['tests']:
 | 
						|
            key = arg.split('.')[0]
 | 
						|
            if hasattr(__main__, key):
 | 
						|
                config['tests'].remove(arg)
 | 
						|
                config['tests'].add('__main__.%s' % arg)
 | 
						|
 | 
						|
    trial_script._initialDebugSetup(config)
 | 
						|
    trialRunner = trial_script._makeRunner(config)
 | 
						|
    suite = trial_script._getSuite(config)
 | 
						|
    if config['until-failure']:
 | 
						|
        test_result = trialRunner.runUntilFailure(suite)
 | 
						|
    else:
 | 
						|
        test_result = trialRunner.run(suite)
 | 
						|
    if config.tracer:
 | 
						|
        sys.settrace(None)
 | 
						|
        results = config.tracer.results()
 | 
						|
        results.write_results(show_missing=1, summary=False,
 | 
						|
                              coverdir=config.coverdir)
 | 
						|
    sys.exit(not test_result.wasSuccessful())
 |