def test_create_event_request_with_missing_contiguity_metrics(): app = app_helper.setup_app_state('quast', 'missing_g75_values') event = post.create_event_request(app, post.list_outputs(app)) nose.assert_equal(event["success"], True) nose.assert_in("nga50", event["metrics"]) nose.assert_equal(event["metrics"]["nga50"], 17378.0) nose.assert_equal(event["metrics"]["nga75"], 0.0)
def test_run_container(): app = app_helper.setup_app_state('quast', 'execute') id_ = run.create_container(app)['Id'] docker.client().start(id_) docker.client().wait(id_) nose.assert_equal(container.did_exit_succcessfully(id_), True) image_helper.clean_up_container(id_)
def test_gaet_complete_run_through(): app = app_helper.setup_app_state('gaet', 'execute') image_helper.execute_image(app) file_helper.assert_is_file( fs.get_task_file_path(app, 'outputs/assembly_metrics/d70c163200')) file_helper.assert_is_file( fs.get_task_file_path(app, 'outputs/container_log/1661337965'))
def test_quast_complete_run_through(): app = app_helper.setup_app_state('quast', 'execute') image_helper.execute_image(app) file_helper.assert_is_file( fs.get_task_file_path(app, 'outputs/assembly_metrics/684281f282')) file_helper.assert_is_file( fs.get_task_file_path(app, 'outputs/container_log/86bbc499b0'))
def test_copy_container_output_files_with_no_files(): app = app_helper.setup_app_state('quast', 'execute') input_files = { 'container_log': 'meta/log.txt', 'assembly_metrics': 'tmp/combined_quast_output/report.tsv' } fs.copy_container_output_files(app, input_files)
def test_get_task_metadata_with_existing_metadata_json(): import json, shutil app = app_helper.setup_app_state('sra') shutil.copy('example_data/tasks/short_read_assembler.json', app['path'] + '/metadata.json') app["api"] = None # Ensure data is not collected from the API metadata = util.get_task_metadata("1", app) nose.assert_in("id", metadata)
def test_complete_run_through(): app = app_helper.setup_app_state('sra', 'inputs') image_helper.execute_image(app) file_helper.assert_is_file(fs.get_task_file_path(app, 'outputs/contig_fasta/01eb7cec61')) file_helper.assert_is_file(fs.get_task_file_path(app, 'outputs/container_runtime_metrics/metrics.json.gz')) file_helper.assert_is_file(fs.get_task_file_path(app, 'outputs/container_log/1099992390'))
def test_upload_output_file(): app = app_helper.setup_app_state('sra', 'task') url = "s3://nucleotides-testing/upload/" path = file_helper.create_benchmark_file(app, '/outputs/contig_fasta/d1b2a59fbe', 'contents') post.upload_output_file(app, post.output_file_metadata(url, path)) expected_path = "upload/d1/d1b2a59fbea7e20077af9f91b27e95e865061b270be03ff539ab3b73587882e8" s3_helper.assert_s3_file_exists("nucleotides-testing", expected_path) s3_helper.delete_s3_file("nucleotides-testing", expected_path)
def test_fetch_short_read_assembler_input_files(): db_helper.reset_database() app = app_helper.setup_app_state('sra', 'task') fetch.create_input_files(app) file_helper.assert_is_file( app["path"] + "/inputs/short_read_fastq/24b5b01b08482053d7d13acd514e359fb0b726f1e8ae36aa194b6ddc07335298.fq.gz" )
def test_short_read_assembler_successful_event_with_incomplete_cgroup_data(): app = app_helper.setup_app_state('sra', 'incomplete_cgroup') outputs = [{ "type" : "contig_fasta", "location" : "/local/path", "sha256" : "digest_1", "url" : "s3://url/dir/file"}] event = post.create_event_request(app, outputs) nose.assert_equal(event['metrics']['total_rss_in_mibibytes'], 0.0)
def test_assembly_benchmark_unsuccessful_event(): app = app_helper.setup_app_state('quast', 'task') # No tmp/biobox.yaml event = post.create_event_request(app, post.list_outputs(app)) nose.assert_equal(event, { "task": 6, "success": False, "files": [], "metrics": {} })
def test_create_event_request_with_a_successful_quast_event(): app = app_helper.setup_app_state('quast', 'outputs') event = post.create_event_request(app, post.list_outputs(app)) nose.assert_equal(event["task"], 6) nose.assert_equal(event["success"], True) nose.assert_equal(event["files"][0]["type"], "assembly_metrics") nose.assert_in("total_aligned_length", event["metrics"]) nose.assert_in("lga75", event["metrics"]) nose.assert_equal(event["metrics"]["lga75"], 70.0) nose.assert_equal(event["metrics"]["total_aligned_length"], 679979.0)
def test_execution_with_empty_contig_file(): app = app_helper.setup_app_state('quast', 'execute') input_contigs = fs.get_task_file_path(app, "inputs/contig_fasta/de3d9f6d31.fa") open(input_contigs, "w").truncate() image_helper.execute_image(app) file_helper.assert_is_empty_directory( fs.get_task_file_path(app, 'outputs/assembly_metrics/')) file_helper.assert_is_empty_directory( fs.get_task_file_path(app, 'outputs/container_log/'))
def test_list_outputs(): app = app_helper.setup_app_state('sra', 'outputs') app["s3-upload"] = "s3://url/" outputs = post.list_outputs(app) nose.assert_equal(len(outputs), 3) nose.assert_in({ "type" : "contig_fasta", "location" : fs.get_task_path_file_without_name(app, "outputs/contig_fasta"), "sha256" : "de3d9f6d31285985139aedd9e3f4b4ad04dadb4274c3c0ce28261a8e8e542a0f", "url" : "s3://url/de/de3d9f6d31285985139aedd9e3f4b4ad04dadb4274c3c0ce28261a8e8e542a0f"}, outputs)
def test_post_event(): db_helper.reset_database() event = { "task": 1, "success": False, "files": [{ "url": "s3://url", "sha256": "adef5c", "type": "container_log" }] } app = app_helper.setup_app_state('sra')
def test_fetch_reference_assembler_input_files(): db_helper.reset_database() app = app_helper.setup_app_state('quast', 'task') fetch.create_input_files(app) file_helper.assert_is_file( app["path"] + "/inputs/reference_fasta/6bac51cc35ee2d11782e7e31ea1bfd7247de2bfcdec205798a27c820b2810414.fa.gz" ) file_helper.assert_is_file( app["path"] + "/inputs/contig_fasta/57601ff10b7faf7fcf53a7268e3615db58088db34eb8e8bf31cb475c24381451.fa" )
def test_copy_container_output_files_with_intermediates(): app = app_helper.setup_app_state('quast', 'intermediates') input_files = { 'container_log': 'meta/log.txt', 'assembly_metrics': 'tmp/report.tsv' } output_files = ['assembly_metrics/63d2a18fa1', 'container_log/e0e8af3790'] fs.copy_container_output_files(app, input_files) for f in output_files: loc = fs.get_task_file_path(app, "outputs/" + f) assert os.path.isfile(loc), "Output file should be copied: {}".format( loc)
def test_failing_image_with_no_outputs(): image = { "name": "bioboxes/crash-test-biobox", "sha256": "eaf1ab35314712db9d3fff0d265613629fe628ed9b058a9a4fe94424184f8c41", "task": "exit-1", "type": "short_read_assembler" } app = app_helper.setup_app_state('sra', 'inputs') app["task"]["image"] = image app_helper.rewrite_app_task(app) image_helper.execute_image(app) file_helper.assert_is_file( fs.get_task_file_path( app, 'outputs/container_runtime_metrics/metrics.json.gz'))
def test_create_event_request_with_non_numeric_quast_values(): app = app_helper.setup_app_state('quast', 'outputs') import fileinput for line in fileinput.input(app['path'] + '/outputs/assembly_metrics/67ba437ffa', inplace=True): if 'NGA50' in line: print line.replace("6456", "-"), else: print line.replace("\n", "") event = post.create_event_request(app, post.list_outputs(app)) nose.assert_equal(event["success"], True) nose.assert_in("nga50", event["metrics"]) nose.assert_equal(event["metrics"]["nga50"], 0.0)
def test_create_event_request_with_a_successful_gaet_event(): app = app_helper.setup_app_state('gaet', 'outputs') event = post.create_event_request(app, post.list_outputs(app)) nose.assert_equal(event["task"], 6) nose.assert_equal(event["success"], True) nose.assert_equal(event["files"][0]["type"], "assembly_metrics") nose.assert_in("comparison.gene_type_distance.cds.n_symmetric_difference", event["metrics"]) nose.assert_equal( event["metrics"] ["comparison.gene_type_distance.cds.n_symmetric_difference"], 7.0) nose.assert_in("assembly.minimum_gene_set.single_copy", event["metrics"]) nose.assert_equal( event["metrics"]["assembly.minimum_gene_set.single_copy"], 0.0)
def test_fetch_reference_assembler_input_files_with_short_contigs(): db_helper.reset_database() app = app_helper.setup_app_state('quast_short_contigs', 'task') fetch.create_input_files(app) # If the short contig are filtered as part of the download process, the input # file should have the same SHA256 as the contig.fa without the short contigs. file_helper.assert_is_file( app["path"] + "/inputs/contig_fasta/de3d9f6d31285985139aedd9e3f4b4ad04dadb4274c3c0ce28261a8e8e542a0f.fa" ) file_helper.assert_is_not_file( app["path"] + "/inputs/contig_fasta/1ff29bcb6940b7d629d2d070fd67b23604e3459c9fd0167cdb6d1dcb26966c87.fa" ) file_helper.assert_is_not_file( app["path"] + "/inputs/contig_fasta/1ff29bcb6940b7d629d2d070fd67b23604e3459c9fd0167cdb6d1dcb26966c87.fa.fai" )
def test_short_read_assembler_successful_event_without_cgroup_data(): """ It is possible that an assembler could finish before the first set of cgroup metrics are collected. In this case, we would not want the task to be considered failed as long as contig files have been produced. """ app = app_helper.setup_app_state('sra', 'missing_cgroup') outputs = [{ "type" : "contig_fasta", "location" : "/local/path", "sha256" : "digest_1", "url" : "s3://url/dir/file"}] event = post.create_event_request(app, outputs) nose.assert_equal({ "task" : 4, "success" : True, "metrics" : {}, "files" : [ {"url" : "s3://url/dir/file", "sha256" : "digest_1", "type" : "contig_fasta"}]}, event)
def test_short_read_assembler_successful_event_with_cgroup_data(): app = app_helper.setup_app_state('sra', 'outputs') outputs = [{ "type" : "contig_fasta", "location" : "/local/path", "sha256" : "digest_1", "url" : "s3://url/dir/file"}] event = post.create_event_request(app, outputs) nose.assert_equal({ "task" : 4, "success" : True, "metrics" : { "total_cpu_usage_in_seconds" : 53.546, "total_cpu_usage_in_seconds_in_kernelmode" : 1.75, "total_cpu_usage_in_seconds_in_usermode" : 11.11, "total_memory_usage_in_mibibytes" : 175.348, "total_rss_in_mibibytes" : 80.543, "total_read_io_in_mibibytes" : 38.641, "total_write_io_in_mibibytes" : 0.0, "total_wall_clock_time_in_seconds" : 0.0}, "files" : [ {"url" : "s3://url/dir/file", "sha256" : "digest_1", "type" : "contig_fasta"}]}, event)
def test_create_container(): app = app_helper.setup_app_state('sra', 'inputs') cnt = run.create_container(app) assert "Id" in cnt image_helper.clean_up_container(cnt["Id"])
def test_output_file_paths(): app = app_helper.setup_app_state('sra', 'intermediates') paths = task().output_file_paths(app) for (_, f) in paths.items(): location = fs.get_task_file_path(app, "tmp/" + f) nose.assert_true(os.path.isfile(location))
def test_copy_output_files(): app = app_helper.setup_app_state('sra', 'intermediates') run.copy_output_files(app) file_helper.assert_is_file(fs.get_task_file_path(app, 'outputs/container_log/e0e8af3790')) file_helper.assert_is_file(fs.get_task_file_path(app, 'outputs/contig_fasta/de3d9f6d31'))
def test_create_container(): app = app_helper.setup_app_state('quast', 'execute') cnt = run.create_container(app) assert "Id" in cnt image_helper.clean_up_container(cnt["Id"])
def test_fetch_task_from_invalid_url(): app = app_helper.setup_app_state('sra') app["api"] = "localhost:98765" response = api.fetch_task("1", app)
def test_fetch_task_from_valid_url(): db_helper.reset_database() app = app_helper.setup_app_state('sra') response = api.fetch_task("1", app) nose.assert_in("id", response) nose.assert_equal(response["id"], 1)
def test_create_event_request_with_missing_alignment_values(): app = app_helper.setup_app_state('quast', 'missing_alignment') event = post.create_event_request(app, post.list_outputs(app)) nose.assert_equal(event["success"], False) nose.assert_equal(event["metrics"], {})