1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/b9c93f559efa/
changeset: b9c93f559efa
user: inithello
date: 2013-02-20 20:27:36
summary: Extension of framework to automate the installation of a list of tool shed repositories to also run any functional tests in the tools contained within each repository.
affected #: 6 files
diff -r efebd50fd708aa3af73f954e4da68e88f2bced9a -r b9c93f559efa7a50cfa445b5f79c579690155589 install_and_test_tool_shed_repositories.sh
--- /dev/null
+++ b/install_and_test_tool_shed_repositories.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# A good place to look for nose info: http://somethingaboutorange.com/mrl/projects/nose/
+#rm -f ./test/tool_shed/run_functional_tests.log
+
+python test/install_and_test_tool_shed_repositories/functional_tests.py -v --with-nosehtml --html-report-file ./test/install_and_test_tool_shed_repositories/run_functional_tests.html test/install_and_test_tool_shed_repositories/functional/test_install_repositories.py test/functional/test_toolbox.py
+
diff -r efebd50fd708aa3af73f954e4da68e88f2bced9a -r b9c93f559efa7a50cfa445b5f79c579690155589 scripts/functional_tests.py
--- a/scripts/functional_tests.py
+++ b/scripts/functional_tests.py
@@ -4,10 +4,12 @@
# Assume we are run from the galaxy root directory, add lib to the python path
cwd = os.getcwd()
-new_path = [ os.path.join( cwd, "lib" ) ]
+new_path = [ os.path.join( cwd, "lib" ), os.path.join( cwd, "test" ) ]
new_path.extend( sys.path[1:] )
sys.path = new_path
+from base.util import parse_tool_panel_config
+
from galaxy import eggs
eggs.require( "nose" )
@@ -85,73 +87,6 @@
global_conf.update( get_static_settings() )
return global_conf
-def parse_tool_panel_config( config, shed_tools_dict ):
- """
- Parse a shed-related tool panel config to generate the shed_tools_dict. This only happens when testing tools installed from the tool shed.
- """
- last_galaxy_test_file_dir = None
- last_tested_repository_name = None
- last_tested_changeset_revision = None
- tool_path = None
- tree = util.parse_xml( config )
- root = tree.getroot()
- tool_path = root.get('tool_path')
- for elem in root:
- if elem.tag == 'tool':
- galaxy_test_file_dir, \
- last_tested_repository_name, \
- last_tested_changeset_revision = get_installed_repository_info( elem,
- last_galaxy_test_file_dir,
- last_tested_repository_name,
- last_tested_changeset_revision,
- tool_path )
- if galaxy_test_file_dir:
- if galaxy_test_file_dir != last_galaxy_test_file_dir:
- if not os.path.isabs( galaxy_test_file_dir ):
- galaxy_test_file_dir = os.path.join( os.getcwd(), galaxy_test_file_dir )
- guid = elem.get( 'guid' )
- shed_tools_dict[ guid ] = galaxy_test_file_dir
- last_galaxy_test_file_dir = galaxy_test_file_dir
- elif elem.tag == 'section':
- for section_elem in elem:
- if section_elem.tag == 'tool':
- galaxy_test_file_dir, \
- last_tested_repository_name, \
- last_tested_changeset_revision = get_installed_repository_info( section_elem,
- last_galaxy_test_file_dir,
- last_tested_repository_name,
- last_tested_changeset_revision,
- tool_path )
- if galaxy_test_file_dir:
- if galaxy_test_file_dir != last_galaxy_test_file_dir:
- if not os.path.isabs( galaxy_test_file_dir ):
- galaxy_test_file_dir = os.path.join( os.getcwd(), galaxy_test_file_dir )
- guid = section_elem.get( 'guid' )
- shed_tools_dict[ guid ] = galaxy_test_file_dir
- last_galaxy_test_file_dir = galaxy_test_file_dir
- return shed_tools_dict
-
-def get_installed_repository_info( elem, last_galaxy_test_file_dir, last_tested_repository_name, last_tested_changeset_revision, tool_path ):
- """
- Return the GALAXY_TEST_FILE_DIR, the containing repository name and the change set revision for the tool elem.
- This only happens when testing tools installed from the tool shed.
- """
- tool_config_path = elem.get( 'file' )
- installed_tool_path_items = tool_config_path.split( '/repos/' )
- sans_shed = installed_tool_path_items[ 1 ]
- path_items = sans_shed.split( '/' )
- repository_owner = path_items[ 0 ]
- repository_name = path_items[ 1 ]
- changeset_revision = path_items[ 2 ]
- if repository_name != last_tested_repository_name or changeset_revision != last_tested_changeset_revision:
- # Locate the test-data directory.
- installed_tool_path = os.path.join( installed_tool_path_items[ 0 ], 'repos', repository_owner, repository_name, changeset_revision )
- for root, dirs, files in os.walk( os.path.join(tool_path, installed_tool_path )):
- if 'test-data' in dirs:
- return os.path.join( root, 'test-data' ), repository_name, changeset_revision
- return None, repository_name, changeset_revision
- return last_galaxy_test_file_dir, last_tested_repository_name, last_tested_changeset_revision
-
def run_tests( test_config ):
loader = nose.loader.TestLoader( config=test_config )
plug_loader = test_config.plugins.prepareTestLoader( loader )
diff -r efebd50fd708aa3af73f954e4da68e88f2bced9a -r b9c93f559efa7a50cfa445b5f79c579690155589 test/base/util.py
--- /dev/null
+++ b/test/base/util.py
@@ -0,0 +1,80 @@
+import os, sys
+
+cwd = os.getcwd()
+if cwd not in sys.path:
+ sys.path.append( cwd )
+
+new_path = [ os.path.join( cwd, "lib" ) ]
+if new_path not in sys.path:
+ new_path.extend( sys.path )
+ sys.path = new_path
+
+from galaxy.util import parse_xml
+
+def get_installed_repository_info( elem, last_galaxy_test_file_dir, last_tested_repository_name, last_tested_changeset_revision, tool_path ):
+ """
+ Return the GALAXY_TEST_FILE_DIR, the containing repository name and the change set revision for the tool elem.
+ This only happens when testing tools installed from the tool shed.
+ """
+ tool_config_path = elem.get( 'file' )
+ installed_tool_path_items = tool_config_path.split( '/repos/' )
+ sans_shed = installed_tool_path_items[ 1 ]
+ path_items = sans_shed.split( '/' )
+ repository_owner = path_items[ 0 ]
+ repository_name = path_items[ 1 ]
+ changeset_revision = path_items[ 2 ]
+ if repository_name != last_tested_repository_name or changeset_revision != last_tested_changeset_revision:
+ # Locate the test-data directory.
+ installed_tool_path = os.path.join( installed_tool_path_items[ 0 ], 'repos', repository_owner, repository_name, changeset_revision )
+ for root, dirs, files in os.walk( os.path.join(tool_path, installed_tool_path )):
+ if 'test-data' in dirs:
+ return os.path.join( root, 'test-data' ), repository_name, changeset_revision
+ return None, repository_name, changeset_revision
+ return last_galaxy_test_file_dir, last_tested_repository_name, last_tested_changeset_revision
+
+def parse_tool_panel_config( config, shed_tools_dict ):
+ """
+ Parse a shed-related tool panel config to generate the shed_tools_dict. This only happens when testing tools installed from the tool shed.
+ """
+ last_galaxy_test_file_dir = None
+ last_tested_repository_name = None
+ last_tested_changeset_revision = None
+ tool_path = None
+ tree = parse_xml( config )
+ root = tree.getroot()
+ tool_path = root.get('tool_path')
+ for elem in root:
+ if elem.tag == 'tool':
+ galaxy_test_file_dir, \
+ last_tested_repository_name, \
+ last_tested_changeset_revision = get_installed_repository_info( elem,
+ last_galaxy_test_file_dir,
+ last_tested_repository_name,
+ last_tested_changeset_revision,
+ tool_path )
+ if galaxy_test_file_dir:
+ if galaxy_test_file_dir != last_galaxy_test_file_dir:
+ if not os.path.isabs( galaxy_test_file_dir ):
+ galaxy_test_file_dir = os.path.join( os.getcwd(), galaxy_test_file_dir )
+ guid = elem.get( 'guid' )
+ shed_tools_dict[ guid ] = galaxy_test_file_dir
+ last_galaxy_test_file_dir = galaxy_test_file_dir
+ elif elem.tag == 'section':
+ for section_elem in elem:
+ if section_elem.tag == 'tool':
+ galaxy_test_file_dir, \
+ last_tested_repository_name, \
+ last_tested_changeset_revision = get_installed_repository_info( section_elem,
+ last_galaxy_test_file_dir,
+ last_tested_repository_name,
+ last_tested_changeset_revision,
+ tool_path )
+ if galaxy_test_file_dir:
+ if galaxy_test_file_dir != last_galaxy_test_file_dir:
+ if not os.path.isabs( galaxy_test_file_dir ):
+ galaxy_test_file_dir = os.path.join( os.getcwd(), galaxy_test_file_dir )
+ guid = section_elem.get( 'guid' )
+ shed_tools_dict[ guid ] = galaxy_test_file_dir
+ last_galaxy_test_file_dir = galaxy_test_file_dir
+ return shed_tools_dict
+
diff -r efebd50fd708aa3af73f954e4da68e88f2bced9a -r b9c93f559efa7a50cfa445b5f79c579690155589 test/install_and_test_tool_shed_repositories/base/twilltestcase.py
--- a/test/install_and_test_tool_shed_repositories/base/twilltestcase.py
+++ b/test/install_and_test_tool_shed_repositories/base/twilltestcase.py
@@ -121,4 +121,12 @@
( timeout_counter, repository.status ) )
break
time.sleep( 1 )
+ def uninstall_repository( self, installed_repository ):
+ url = '/admin_toolshed/deactivate_or_uninstall_repository?id=%s' % self.security.encode_id( installed_repository.id )
+ self.visit_url( url )
+ tc.fv ( 1, "remove_from_disk", 'true' )
+ tc.submit( 'deactivate_or_uninstall_repository_button' )
+ strings_displayed = [ 'The repository named' ]
+ strings_displayed.append( 'has been uninstalled' )
+ self.check_for_strings( strings_displayed, strings_not_displayed=[] )
diff -r efebd50fd708aa3af73f954e4da68e88f2bced9a -r b9c93f559efa7a50cfa445b5f79c579690155589 test/install_and_test_tool_shed_repositories/functional/test_install_repositories.py
--- a/test/install_and_test_tool_shed_repositories/functional/test_install_repositories.py
+++ b/test/install_and_test_tool_shed_repositories/functional/test_install_repositories.py
@@ -1,18 +1,33 @@
-import new
+import new, logging
import install_and_test_tool_shed_repositories.base.test_db_util as test_db_util
from install_and_test_tool_shed_repositories.base.twilltestcase import InstallTestRepository
+log = logging.getLogger(__name__)
class TestInstallRepositories( InstallTestRepository ):
- """Abstract test case that installs a predefined list of repositories."""
+ """Abstract test case that installs and uninstalls a predefined list of repositories."""
def do_installation( self, repository_info_dict ):
self.logout()
self.login( email='test(a)bx.psu.edu', username='test' )
admin_user = test_db_util.get_user( 'test(a)bx.psu.edu' )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
admin_user_private_role = test_db_util.get_private_role( admin_user )
+ # Install the repository through the web interface using twill.
self.install_repository( repository_info_dict )
-def build_tests( repository_dict=None ):
+ def do_uninstallation( self, repository_info_dict ):
+ self.logout()
+ self.login( email='test(a)bx.psu.edu', username='test' )
+ admin_user = test_db_util.get_user( 'test(a)bx.psu.edu' )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ # Get the repository from the database.
+ repository = test_db_util.get_installed_repository_by_name_owner_changeset_revision( repository_info_dict[ 'name' ],
+ repository_info_dict[ 'owner' ],
+ repository_info_dict[ 'changeset_revision' ] )
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ # Uninstall the repository through the web interface using twill.
+ self.uninstall_repository( repository )
+
+def generate_install_method( repository_dict=None ):
"""Generate abstract test cases for the defined list of repositories."""
if repository_dict is None:
return
@@ -20,7 +35,7 @@
G = globals()
# Eliminate all previous tests from G.
for key, val in G.items():
- if key.startswith( 'TestInstallRepository_' ):
+ if key.startswith( 'TestInstallRepository_' ) or key.startswith( 'TestUninstallRepository_' ):
del G[ key ]
# Create a new subclass with a method named install_repository_XXX that installs the repository specified by the provided dict.
name = "TestInstallRepository_" + repository_dict[ 'name' ]
@@ -37,3 +52,29 @@
# from baseclasses (which should be a tuple of classes) and with namespace dict.
new_class_obj = new.classobj( name, baseclasses, namespace )
G[ name ] = new_class_obj
+
+def generate_uninstall_method( repository_dict=None ):
+ """Generate abstract test cases for the defined list of repositories."""
+ if repository_dict is None:
+ return
+ # Push all the toolbox tests to module level
+ G = globals()
+ # Eliminate all previous tests from G.
+ for key, val in G.items():
+ if key.startswith( 'TestInstallRepository_' ) or key.startswith( 'TestUninstallRepository_' ):
+ del G[ key ]
+ # Create a new subclass with a method named install_repository_XXX that installs the repository specified by the provided dict.
+ name = "TestUninstallRepository_" + repository_dict[ 'name' ]
+ baseclasses = ( TestInstallRepositories, )
+ namespace = dict()
+ def make_uninstall_method( repository_dict ):
+ def test_install_repository( self ):
+ self.do_uninstallation( repository_dict )
+ return test_install_repository
+ test_method = make_uninstall_method( repository_dict )
+ test_method.__doc__ = "Uninstall the repository %s." % repository_dict[ 'name' ]
+ namespace[ 'install_repository_%s' % repository_dict[ 'name' ] ] = test_method
+ # The new.classobj function returns a new class object, with name name, derived
+ # from baseclasses (which should be a tuple of classes) and with namespace dict.
+ new_class_obj = new.classobj( name, baseclasses, namespace )
+ G[ name ] = new_class_obj
diff -r efebd50fd708aa3af73f954e4da68e88f2bced9a -r b9c93f559efa7a50cfa445b5f79c579690155589 test/install_and_test_tool_shed_repositories/functional_tests.py
--- a/test/install_and_test_tool_shed_repositories/functional_tests.py
+++ b/test/install_and_test_tool_shed_repositories/functional_tests.py
@@ -1,5 +1,9 @@
#!/usr/bin/env python
+# NOTE: This script cannot be run directly, because it needs to have test/functional/test_toolbox.py in sys.argv in
+# order to run functional tests on repository tools after installation. The install_and_test_tool_shed_repositories.sh
+# will execute this script with the appropriate parameters.
+
import os, sys, shutil, tempfile, re, string
# Assume we are run from the galaxy root directory, add lib to the python path
@@ -8,9 +12,9 @@
test_home_directory = os.path.join( cwd, 'test', 'install_and_test_tool_shed_repositories' )
default_test_file_dir = os.path.join( test_home_directory, 'test_data' )
+
# Here's the directory where everything happens. Temporary directories are created within this directory to contain
-# the hgweb.config file, the database, new repositories, etc. Since the tool shed browses repository contents via HTTP,
-# the full path to the temporary directroy wher eht repositories are located cannot contain invalid url characters.
+# the database, new repositories, etc.
galaxy_test_tmp_dir = os.path.join( test_home_directory, 'tmp' )
default_galaxy_locales = 'en'
default_galaxy_test_file_dir = "test-data"
@@ -43,12 +47,15 @@
import galaxy.app
from galaxy.app import UniverseApplication
from galaxy.web import buildapp
+from galaxy.util import parse_xml
import nose.core
import nose.config
import nose.loader
import nose.plugins.manager
+from base.util import parse_tool_panel_config
+
log = logging.getLogger( 'install_and_test_repositories' )
default_galaxy_test_port_min = 10000
@@ -66,11 +73,13 @@
</tool_sheds>
'''
+# Create a blank shed_tool_conf.xml to hold the installed repositories.
shed_tool_conf_xml_template = '''<?xml version="1.0"?><toolbox tool_path="${shed_tool_path}"></toolbox>
'''
+# Since we will be running functional tests, we'll need the upload tool, but the rest can be omitted.
tool_conf_xml = '''<?xml version="1.0"?><toolbox><section name="Get Data" id="getext">
@@ -79,11 +88,13 @@
</toolbox>
'''
+# And set up a blank tool_data_table_conf.xml and shed_tool_data_table_conf.xml.
tool_data_table_conf_xml_template = '''<?xml version="1.0"?><tables></tables>
'''
+# Define a default location to find the list of repositories to check.
galaxy_repository_list = os.environ.get( 'GALAXY_INSTALL_TEST_REPOSITORY_FILE', 'repository_list.json' )
if 'GALAXY_INSTALL_TEST_SECRET' not in os.environ:
@@ -92,7 +103,7 @@
else:
galaxy_encode_secret = os.environ[ 'GALAXY_INSTALL_TEST_SECRET' ]
-def get_repositories_to_install():
+def get_repositories_to_install( format='json' ):
'''
Get a list of repository info dicts to install. This method expects a json list of dicts with the following structure:
[
@@ -107,7 +118,10 @@
]
NOTE: If the tool shed URL specified in any dict is not present in the tool_sheds_conf.xml, the installation will fail.
'''
- return simplejson.loads( file( galaxy_repository_list, 'r' ).read() )
+ if format == 'json':
+ return simplejson.loads( file( galaxy_repository_list, 'r' ).read() )
+ else:
+ raise AssertonError( 'Unknown format %s.' % format )
def run_tests( test_config ):
loader = nose.loader.TestLoader( config=test_config )
@@ -126,7 +140,7 @@
def main():
# ---- Configuration ------------------------------------------------------
galaxy_test_host = os.environ.get( 'GALAXY_INSTALL_TEST_HOST', default_galaxy_test_host )
- galaxy_test_port = os.environ.get( 'GALAXY_INSTALL_TEST_PORT', None )
+ galaxy_test_port = os.environ.get( 'GALAXY_INSTALL_TEST_PORT', str( default_galaxy_test_port_max ) )
tool_path = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_PATH', 'tools' )
if 'HTTP_ACCEPT_LANGUAGE' not in os.environ:
@@ -134,28 +148,32 @@
galaxy_test_file_dir = os.environ.get( 'GALAXY_INSTALL_TEST_FILE_DIR', default_galaxy_test_file_dir )
if not os.path.isabs( galaxy_test_file_dir ):
galaxy_test_file_dir = os.path.abspath( galaxy_test_file_dir )
+ # Set up the tool dependency path for the Galaxy instance.
tool_dependency_dir = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_DEPENDENCY_DIR', None )
use_distributed_object_store = os.environ.get( 'GALAXY_INSTALL_TEST_USE_DISTRIBUTED_OBJECT_STORE', False )
if not os.path.isdir( galaxy_test_tmp_dir ):
os.mkdir( galaxy_test_tmp_dir )
galaxy_test_proxy_port = None
+ # Set up the configuration files for the Galaxy instance.
shed_tool_data_table_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_SHED_TOOL_DATA_TABLE_CONF', os.path.join( galaxy_test_tmp_dir, 'test_shed_tool_data_table_conf.xml' ) )
galaxy_tool_data_table_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_DATA_TABLE_CONF', os.path.join( galaxy_test_tmp_dir, 'test_tool_data_table_conf.xml' ) )
galaxy_tool_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_CONF', os.path.join( galaxy_test_tmp_dir, 'test_tool_conf.xml' ) )
galaxy_shed_tool_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_SHED_TOOL_CONF', os.path.join( galaxy_test_tmp_dir, 'test_shed_tool_conf.xml' ) )
galaxy_migrated_tool_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_MIGRATED_TOOL_CONF', os.path.join( galaxy_test_tmp_dir, 'test_migrated_tool_conf.xml' ) )
galaxy_tool_sheds_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_SHEDS_CONF', os.path.join( galaxy_test_tmp_dir, 'test_tool_sheds_conf.xml' ) )
- shed_tool_dict = os.environ.get( 'GALAXY_INSTALL_TEST_SHED_TOOL_DICT_FILE', os.path.join( galaxy_test_tmp_dir, 'shed_tool_dict' ) )
+ galaxy_shed_tools_dict = os.environ.get( 'GALAXY_INSTALL_TEST_SHED_TOOL_DICT_FILE', os.path.join( galaxy_test_tmp_dir, 'shed_tool_dict' ) )
if 'GALAXY_INSTALL_TEST_TOOL_DATA_PATH' in os.environ:
tool_data_path = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_DATA_PATH' )
else:
tool_data_path = tempfile.mkdtemp( dir=galaxy_test_tmp_dir )
os.environ[ 'GALAXY_INSTALL_TEST_TOOL_DATA_PATH' ] = tool_data_path
+ # Configure the database connection and path.
if 'GALAXY_INSTALL_TEST_DBPATH' in os.environ:
galaxy_db_path = os.environ[ 'GALAXY_INSTALL_TEST_DBPATH' ]
else:
tempdir = tempfile.mkdtemp( dir=galaxy_test_tmp_dir )
galaxy_db_path = os.path.join( tempdir, 'database' )
+ # Configure the paths Galaxy needs to install and test tools.
galaxy_file_path = os.path.join( galaxy_db_path, 'files' )
new_repos_path = tempfile.mkdtemp( dir=galaxy_test_tmp_dir )
galaxy_tempfiles = tempfile.mkdtemp( dir=galaxy_test_tmp_dir )
@@ -239,6 +257,7 @@
static_enabled=False,
app=app )
+ # Serve the app on a specified or random port.
if galaxy_test_port is not None:
server = httpserver.serve( webapp, host=galaxy_test_host, port=galaxy_test_port, start_loop=False )
else:
@@ -260,9 +279,10 @@
os.environ[ 'GALAXY_INSTALL_TEST_PORT' ] = galaxy_test_proxy_port
else:
os.environ[ 'GALAXY_INSTALL_TEST_PORT' ] = galaxy_test_port
+ # Start the server.
t = threading.Thread( target=server.serve_forever )
t.start()
- # Test if the server is up
+ # Test if the server is up.
for i in range( 10 ):
# Directly test the app, not the proxy.
conn = httplib.HTTPConnection( galaxy_test_host, galaxy_test_port )
@@ -273,27 +293,71 @@
else:
raise Exception( "Test HTTP server did not return '200 OK' after 10 tries" )
log.info( "Embedded galaxy web server started" )
- # ---- Load the module to generate installation methods -------------------
+ # ---- Load the modules to generate installation, testing, and uninstallation methods -------------------
import install_and_test_tool_shed_repositories.functional.test_install_repositories as test_install_repositories
+ import functional.test_toolbox as test_toolbox
if galaxy_test_proxy_port:
log.info( "Tests will be run against %s:%s" % ( galaxy_test_host, galaxy_test_proxy_port ) )
else:
log.info( "Tests will be run against %s:%s" % ( galaxy_test_host, galaxy_test_port ) )
success = False
try:
+ # Iterate through a list of repository info dicts.
for repository_dict in get_repositories_to_install():
- test_install_repositories.build_tests( repository_dict )
+ # Generate the method that will install this repository into the running Galaxy instance.
+ test_install_repositories.generate_install_method( repository_dict )
os.environ[ 'GALAXY_INSTALL_TEST_HOST' ] = galaxy_test_host
+ # Configure nose to run the install method as a test.
test_config = nose.config.Config( env=os.environ, plugins=nose.plugins.manager.DefaultPluginManager() )
test_config.configure( sys.argv )
- # Run the tests.
+ # Run the configured install method as a test. This method uses the Galaxy web interface to install the specified
+ # repository, with tool and repository dependencies also selected for installation.
result = run_tests( test_config )
success = result.wasSuccessful()
+ # If the installation succeeds, set up and run functional tests for this repository. This is equivalent to
+ # sh run_functional_tests.sh -installed
+ if success:
+ log.debug( 'Installation of %s succeeded, running any defined functional tests.' % repository_dict[ 'name' ] )
+ # Parse the tool panel config to get the test-data path for this repository.
+ shed_tools_dict = parse_tool_panel_config( galaxy_shed_tool_conf_file, {} )
+ # Write this to a file, so the functional test framework can find it.
+ file( galaxy_shed_tools_dict, 'w' ).write( simplejson.dumps( shed_tools_dict ) )
+ # Set up the environment so that test.functional.test_toolbox can find the Galaxy server we configured in this framework.
+ os.environ[ 'GALAXY_TOOL_SHED_TEST_FILE' ] = galaxy_shed_tools_dict
+ os.environ[ 'GALAXY_TEST_HOST' ] = galaxy_test_host
+ os.environ[ 'GALAXY_TEST_PORT' ] = galaxy_test_port
+ # Set the module-level variable 'toolbox', so that test.functional.test_toolbox will generate the appropriate test methods.
+ test_toolbox.toolbox = app.toolbox
+ # Generate the test methods for this installed repository. We need to pass in True here, or it will look
+ # in $GALAXY_HOME/test-data for test data, which may result in missing or invalid test files.
+ test_toolbox.build_tests( testing_shed_tools=True )
+ # Set up nose to run the generated functional tests.
+ test_config = nose.config.Config( env=os.environ, plugins=nose.plugins.manager.DefaultPluginManager() )
+ test_config.configure( sys.argv )
+ # Run the configured tests.
+ result = run_tests( test_config )
+ success = result.wasSuccessful()
+ if success:
+ log.debug( 'Repository %s installed and passed functional tests.' % repository_dict[ 'name' ] )
+ else:
+ log.debug( 'Repository %s installed, but did not pass functional tests.' % repository_dict[ 'name' ] )
+ # Generate an uninstall method for this repository, so that the next repository has a clean environment for testing.
+ test_install_repositories.generate_uninstall_method( repository_dict )
+ # Set up nose to run the generated uninstall method as a functional test.
+ test_config = nose.config.Config( env=os.environ, plugins=nose.plugins.manager.DefaultPluginManager() )
+ test_config.configure( sys.argv )
+ # Run the uninstall method. This method uses the Galaxy web interface to uninstall the previously installed
+ # repository and delete it from disk.
+ result = run_tests( test_config )
+ success = result.wasSuccessful()
+ else:
+ log.debug( 'Repository %s failed to install correctly.' % repository_dict[ 'name' ] )
except:
log.exception( "Failure running tests" )
log.info( "Shutting down" )
# ---- Tear down -----------------------------------------------------------
+ # Gracefully shut down the embedded web server and UniverseApplication.
if server:
log.info( "Shutting down embedded galaxy web server" )
server.server_close()
@@ -304,6 +368,7 @@
app.shutdown()
app = None
log.info( "Embedded galaxy application stopped" )
+ # Clean up test files unless otherwise specified.
if 'GALAXY_INSTALL_TEST_NO_CLEANUP' not in os.environ:
try:
for dir in [ galaxy_test_tmp_dir ]:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/5ac8d92a066e/
changeset: 5ac8d92a066e
branch: stable
user: inithello
date: 2013-02-20 14:56:36
summary: Fix missing import in repository controller.
affected #: 1 file
diff -r d5896e8a60fa948f1713d4b5e30126a12a958679 -r 5ac8d92a066edefa4ab63936372ec9bcc689cafc lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -1,4 +1,4 @@
-import os, logging, re, tempfile, shutil, ConfigParser
+import os, logging, re, tempfile, shutil, ConfigParser, string
from time import gmtime, strftime
from datetime import date, datetime
from galaxy import util, web
https://bitbucket.org/galaxy/galaxy-central/commits/efebd50fd708/
changeset: efebd50fd708
user: inithello
date: 2013-02-20 14:56:36
summary: Fix missing import in repository controller.
affected #: 1 file
diff -r 1895646e8ce0ed905f7fef8a8fc184ae1606a006 -r efebd50fd708aa3af73f954e4da68e88f2bced9a lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -1,4 +1,4 @@
-import os, logging, re, tempfile, shutil, ConfigParser
+import os, logging, re, tempfile, shutil, ConfigParser, string
from time import gmtime, strftime
from datetime import date, datetime
from galaxy import util, web
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/bc0114ce0f7b/
changeset: bc0114ce0f7b
user: carlfeberhard
date: 2013-02-19 22:21:16
summary: functional_tests: fix import
affected #: 1 file
diff -r 7bf93ff108fe4a62ee3084d84a77fa9b71c8b1f7 -r bc0114ce0f7b5224cd4ef58d1dd2ef8b30c77a69 scripts/functional_tests.py
--- a/scripts/functional_tests.py
+++ b/scripts/functional_tests.py
@@ -40,6 +40,7 @@
import nose.loader
import nose.plugins.manager
+import pprint
log = logging.getLogger( "functional_tests.py" )
default_galaxy_test_host = "localhost"
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.