1 new commit in galaxy-central: https://bitbucket.org/galaxy/galaxy-central/changeset/607e9db258f2/ changeset: 607e9db258f2 user: greg date: 2012-11-29 18:42:04 summary: Fixes for tool shed functional tests. affected #: 4 files diff -r 60786207e48d952a69ccef95fd8fdc1740970923 -r 607e9db258f20ad47b8bb813508bd6a9056596b8 test/tool_shed/base/twilltestcase.py --- a/test/tool_shed/base/twilltestcase.py +++ b/test/tool_shed/base/twilltestcase.py @@ -1,4 +1,5 @@ from base.twilltestcase import * +import ConfigParser class ShedTwillTestCase( TwillTestCase ): def setUp( self ): @@ -6,6 +7,7 @@ self.security = security.SecurityHelper( id_secret='changethisinproductiontoo' ) self.history_id = None self.hgweb_config_manager = None + self.hgweb_config_dir = os.environ.get( 'TEST_HG_WEB_CONFIG_DIR' ) self.host = os.environ.get( 'TOOL_SHED_TEST_HOST' ) self.port = os.environ.get( 'TOOL_SHED_TEST_PORT' ) self.url = "http://%s:%s" % ( self.host, self.port ) @@ -108,8 +110,8 @@ self.check_for_strings( strings_displayed, strings_not_displayed ) def delete_files_from_repository( self, repository, filenames=[], strings_displayed=[ 'were deleted from the repository' ], strings_not_displayed=[] ): files_to_delete = [] - basepath = self.get_repository_base_path_from_browse_page( repository ) - repository_files = self.get_repository_file_list( repository, basepath ) + basepath = self.get_repo_path( repository ) + repository_files = self.get_repository_file_list( base_path=basepath, current_path=None ) # Verify that the files to delete actually exist in the repository. for filename in repository_files: if filename in filenames: @@ -133,14 +135,15 @@ self.check_for_strings( strings_displayed, strings_not_displayed ) def display_repository_file_contents( self, repository, filename, filepath=None, strings_displayed=[], strings_not_displayed=[] ): '''Find a file in the repository and display the contents.''' - basepath = self.get_repository_base_path_from_browse_page( repository ) + basepath = self.get_repo_path( repository ) repository_file_list = [] - relative_path = filename - if filepath is not None: - relative_path = os.path.join( filepath, filename ) - repository_file_list = self.get_repository_file_list( repository, basepath ) - assert relative_path in repository_file_list, 'File %s not found in the repository under %s.' % ( filename, filepath ) - url = '/repository/get_file_contents?file_path=%s' % os.path.join( basepath, relative_path ).replace( '/', '%2f' ) + if filepath: + relative_path = os.path.join( basepath, filepath ) + else: + relative_path = basepath + repository_file_list = self.get_repository_file_list( base_path=relative_path, current_path=None ) + assert filename in repository_file_list, 'File %s not found in the repository under %s.' % ( filename, relative_path ) + url = '/repository/get_file_contents?file_path=%s' % os.path.join( relative_path, filename ) self.visit_url( url ) self.check_for_strings( strings_displayed, strings_not_displayed ) def edit_repository_categories( self, repository, categories_to_add=[], categories_to_remove=[], restore_original=True ): @@ -196,27 +199,27 @@ def get_latest_repository_metadata_for_repository( self, repository ): # TODO: This will not work as expected. Fix it. return repository.metadata_revisions[ 0 ] - def get_repository_base_path_from_browse_page( self, repository ): - '''Get the base path from the javascript dynatree parameters. This must be updated if the browse feature is altered.''' - self.visit_url( '/repository/browse_repository?id=%s' % self.security.encode_id( repository.id ) ) - html = self.last_page() - found_file = None - basepath = None - search = re.search( 'data: { folder_path: "([^"]+)" },', html ) - if search is not None: - basepath = search.group( 1 ) - return basepath - def get_repository_file_list( self, repository, base_path, current_path=None ): - ''' - Recursively load repository folder contents and append them to a list. Similar to os.walk, - but via /repository/open_folder. - ''' + def get_repo_path( self, repository ): + # An entry in the hgweb.config file looks something like: repos/test/mira_assembler = database/community_files/000/repo_123 + lhs = "repos/%s/%s" % ( repository.user.username, repository.name ) + hgweb_config = "%s/hgweb.config" % self.hgweb_config_dir + if not os.path.exists( hgweb_config ): + raise Exception( "Required file hgweb.config does not exist in directory %s" % self.hgweb_config_dir ) + config = ConfigParser.ConfigParser() + config.read( hgweb_config ) + for option in config.options( "paths" ): + if option == lhs: + return config.get( "paths", option ) + raise Exception( "Entry for repository %s missing in %s/hgweb.config file." % ( lhs, self.hgweb_config_dir ) ) + def get_repository_file_list( self, base_path, current_path=None ): + '''Recursively load repository folder contents and append them to a list. Similar to os.walk but via /repository/open_folder.''' if current_path is None: - full_path = base_path + request_param_path = base_path else: - full_path = os.path.join( base_path, current_path ) + request_param_path = os.path.join( base_path, current_path ) + #request_param_path = request_param_path.replace( '/', '%2f' ) # Get the current folder's contents. - url = '/repository/open_folder?folder_path=%s' % full_path.replace( '/', '%2f' ) + url = '/repository/open_folder?folder_path=%s' % request_param_path self.visit_url( url ) file_list = from_json_string( self.last_page() ) returned_file_list = [] @@ -228,10 +231,10 @@ # This is a folder. Get the contents of the folder and append it to the list, # prefixed with the path relative to the repository root, if any. if current_path is None: - returned_file_list.extend( self.get_repository_file_list( repository, base_path, file_dict[ 'title' ] ) ) + returned_file_list.extend( self.get_repository_file_list( base_path=base_path, current_path=file_dict[ 'title' ] ) ) else: sub_path = os.path.join( current_path, file_dict[ 'title' ] ) - returned_file_list.extend( self.get_repository_file_list( repository, base_path, sub_path ) ) + returned_file_list.extend( self.get_repository_file_list( base_path=base_path, current_path=sub_path ) ) else: # This is a regular file, prefix the filename with the current path and append it to the list. if current_path is not None: diff -r 60786207e48d952a69ccef95fd8fdc1740970923 -r 607e9db258f20ad47b8bb813508bd6a9056596b8 test/tool_shed/functional/test_0000_basic_repository_features.py --- a/test/tool_shed/functional/test_0000_basic_repository_features.py +++ b/test/tool_shed/functional/test_0000_basic_repository_features.py @@ -15,7 +15,7 @@ repository_description = "Galaxy's filtering tool" repository_long_description = "Long description of Galaxy's filtering tool" -class TestCreateRepository( ShedTwillTestCase ): +class TestBasicRepositoryFeatures( ShedTwillTestCase ): def test_0000_initiate_users( self ): """Create necessary user accounts and login as an admin user.""" @@ -89,9 +89,13 @@ strings_displayed=[ 'has been marked as not deprecated', 'Mark as deprecated' ], set_deprecated=False ) def test_0045_display_repository_tip_file( self ): - '''Display the contents of a file in the repository tip revision''' + '''Display the contents of filtering.xml in the repository tip revision''' repository = get_repository_by_name_and_owner( repository_name, admin_username ) - self.display_repository_file_contents( repository, filename='filtering.xml', strings_displayed=[ '1.1.0' ] ) + self.display_repository_file_contents( repository=repository, + filename='filtering.xml', + filepath=None, + strings_displayed=[ '1.1.0' ], + strings_not_displayed=[] ) def test_0050_upload_filtering_txt_file( self ): '''Upload filtering.txt file associated with tool version 1.1.0.''' repository = get_repository_by_name_and_owner( repository_name, admin_username ) @@ -105,7 +109,11 @@ '''Upload filtering test data.''' repository = get_repository_by_name_and_owner( repository_name, admin_username ) self.upload_file( repository, 'filtering_test_data.tar', commit_message="Uploaded filtering test data", remove_repo_files_not_in_tar='No' ) - self.display_repository_file_contents( repository, filename='1.bed', filepath='test-data' ) + self.display_repository_file_contents( repository=repository, + filename='1.bed', + filepath='test-data', + strings_displayed=[], + strings_not_displayed=[] ) self.check_repository_metadata( repository, tip_only=True ) def test_0060_upload_filtering_2_2_0( self ): '''Upload filtering version 2.2.0''' diff -r 60786207e48d952a69ccef95fd8fdc1740970923 -r 607e9db258f20ad47b8bb813508bd6a9056596b8 test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py --- /dev/null +++ b/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py @@ -0,0 +1,19 @@ +from tool_shed.base.twilltestcase import * +from tool_shed.base.test_db_util import * + +admin_user = None +admin_user_private_role = None +admin_email = 'test@bx.psu.edu' +admin_username = 'admin-user' + +regular_user = None +regular_user_private_role = None +regular_email = 'test-1@bx.psu.edu' +regular_username = 'user1' + +repository_name = 'freebayes' +repository_description = "Galaxy's freebayes tool" +repository_long_description = "Long description of Galaxy's freebayes tool" + +class TestRepositoryWithToolDependencies( ShedTwillTestCase ): + pass \ No newline at end of file diff -r 60786207e48d952a69ccef95fd8fdc1740970923 -r 607e9db258f20ad47b8bb813508bd6a9056596b8 test/tool_shed/functional_tests.py --- a/test/tool_shed/functional_tests.py +++ b/test/tool_shed/functional_tests.py @@ -6,6 +6,10 @@ cwd = os.getcwd() tool_shed_home_directory = os.path.join( cwd, 'test', 'tool_shed' ) default_tool_shed_test_file_dir = os.path.join( tool_shed_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. +tool_shed_test_tmp_dir = os.path.join( tool_shed_home_directory, 'tmp' ) new_path = [ os.path.join( cwd, "lib" ) ] new_path.extend( sys.path[1:] ) sys.path = new_path @@ -31,7 +35,6 @@ import galaxy.webapps.community.app from galaxy.webapps.community.app import UniverseApplication from galaxy.webapps.community import buildapp -#from galaxy.webapps.community.util.hgweb_config import * import nose.core import nose.config @@ -81,6 +84,8 @@ use_distributed_object_store = os.environ.get( 'TOOL_SHED_USE_DISTRIBUTED_OBJECT_STORE', False ) if start_server: + if not os.path.isdir( tool_shed_test_tmp_dir ): + os.mkdir( tool_shed_test_tmp_dir ) psu_production = False tool_shed_test_proxy_port = None if 'TOOL_SHED_TEST_PSU_PRODUCTION' in os.environ: @@ -102,7 +107,8 @@ if not nginx_upload_store: raise Exception( 'Set TOOL_SHED_TEST_NGINX_UPLOAD_STORE to the path where the nginx upload module places uploaded files' ) file_path = tempfile.mkdtemp( dir=base_file_path ) - new_file_path = tempfile.mkdtemp( dir=base_new_file_path ) + new_repos_path = tempfile.mkdtemp( dir=base_new_file_path ) + hgweb_config_file_path = tempfile.mkdtemp( dir=tool_shed_test_tmp_dir ) kwargs = dict( database_engine_option_pool_size = '10', database_engine_option_max_overflow = '20', database_engine_option_strategy = 'threadlocal', @@ -113,16 +119,17 @@ if 'TOOL_SHED_TEST_DBPATH' in os.environ: db_path = os.environ[ 'TOOL_SHED_TEST_DBPATH' ] else: - tempdir = tempfile.mkdtemp() + tempdir = tempfile.mkdtemp( dir=tool_shed_test_tmp_dir ) db_path = os.path.join( tempdir, 'database' ) file_path = os.path.join( db_path, 'files' ) - new_file_path = os.path.join( db_path, 'tmp' ) + hgweb_config_file_path = tempfile.mkdtemp( dir=tool_shed_test_tmp_dir ) + new_repos_path = tempfile.mkdtemp( dir=tool_shed_test_tmp_dir ) if 'TOOL_SHED_TEST_DBURI' in os.environ: database_connection = os.environ[ 'TOOL_SHED_TEST_DBURI' ] else: database_connection = 'sqlite:///' + os.path.join( db_path, 'universe.sqlite' ) kwargs = {} - for dir in file_path, new_file_path: + for dir in tool_shed_test_tmp_dir: try: os.makedirs( dir ) except OSError: @@ -130,6 +137,11 @@ print "Database connection:", database_connection + hgweb_config_dir = hgweb_config_file_path + os.environ[ 'TEST_HG_WEB_CONFIG_DIR' ] = hgweb_config_dir + + print "Directory location for hgweb.config:", hgweb_config_dir + # ---- Build Application -------------------------------------------------- app = None if start_server: @@ -150,7 +162,7 @@ database_connection = database_connection, database_engine_option_pool_size = '10', file_path = file_path, - new_file_path = new_file_path, + new_file_path = new_repos_path, tool_path=tool_path, datatype_converters_config_file = 'datatype_converters_conf.xml.sample', tool_parse_help = False, @@ -163,9 +175,8 @@ admin_users = 'test@bx.psu.edu', global_conf = global_conf, running_functional_tests = True, - hgweb_config_dir = new_file_path, + hgweb_config_dir = hgweb_config_dir, **kwargs ) -# app.hgweb_config_manager = HgWebConfigManager() log.info( "Embedded Universe application started" ) @@ -254,20 +265,14 @@ app.shutdown() app = None log.info( "Embedded Universe application stopped" ) - try: - if os.path.exists( tempdir ) and 'TOOL_SHED_TEST_NO_CLEANUP' not in os.environ: - log.info( "Cleaning up temporary files in %s" % tempdir ) - shutil.rmtree( tempdir ) - except: - pass - if psu_production and 'TOOL_SHED_TEST_NO_CLEANUP' not in os.environ: - for dir in ( file_path, new_file_path ): - try: + if 'TOOL_SHED_TEST_NO_CLEANUP' not in os.environ: + try: + for dir in [ tool_shed_test_tmp_dir ]: if os.path.exists( dir ): - log.info( 'Cleaning up temporary files in %s' % dir ) + log.info( "Cleaning up temporary files in %s" % dir ) shutil.rmtree( dir ) - except: - pass + except: + pass if success: return 0 else: 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.