comparison tests/test_shm_csr.py @ 90:6809c63d9161 draft

"planemo upload commit fd64827ff6e63df008f6f50ddb8576ad2b1dbb26"
author rhpvorderman
date Tue, 25 Jan 2022 11:28:29 +0000
parents 729738462297
children cf8ad181628f
comparison
equal deleted inserted replaced
89:3c9d4d976c47 90:6809c63d9161
22 import shutil 22 import shutil
23 import subprocess 23 import subprocess
24 import sys 24 import sys
25 import tempfile 25 import tempfile
26 from pathlib import Path 26 from pathlib import Path
27 from xml.etree import ElementTree
28 from xml.etree.ElementTree import Element
27 29
28 import pytest 30 import pytest
29 31
30 GIT_ROOT = str(Path(__file__).parent.parent.absolute()) 32 GIT_ROOT = Path(__file__).parent.parent.absolute()
31 TEST_DIR = Path(__file__).parent 33 TEST_DIR = Path(__file__).parent
32 TEST_DATA_DIR = TEST_DIR / "data" 34 TEST_DATA_DIR = TEST_DIR / "data"
33 VALIDATION_DATA_DIR = TEST_DIR / "validation_data" 35 VALIDATION_DATA_DIR = TEST_DIR / "validation_data"
34 CONTROL_NWK377_PB_IGHC_MID1_40nt_2 = TEST_DATA_DIR / "CONTROL_NWK377_PB_IGHC_MID1_40nt_2.txz" 36 CONTROL_NWK377_PB_IGHC_MID1_40nt_2 = TEST_DATA_DIR / "CONTROL_NWK377_PB_IGHC_MID1_40nt_2.txz"
35 37
36 38
39 def get_container():
40 tool = ElementTree.parse(GIT_ROOT / "shm_csr.xml").getroot()
41 requirements: Element = tool.find("requirements")
42 container = requirements.find("container")
43 return container.text
44
45
37 @pytest.fixture(scope="module") 46 @pytest.fixture(scope="module")
38 def shm_csr_result(): 47 def shm_csr_result():
39 temp_dir = tempfile.mktemp() 48 temp_dir = Path(tempfile.mkdtemp())
40 shutil.copytree(GIT_ROOT, temp_dir) 49 tool_dir = temp_dir / "shm_csr"
50 shutil.copytree(GIT_ROOT, tool_dir)
51 working_dir = temp_dir / "working"
52 working_dir.mkdir(parents=True)
53 output_dir = temp_dir / "outputs"
54 output_dir.mkdir(parents=True)
55 wrapper = str(tool_dir / "wrapper.sh")
41 input = str(CONTROL_NWK377_PB_IGHC_MID1_40nt_2) 56 input = str(CONTROL_NWK377_PB_IGHC_MID1_40nt_2)
42 out_files_path = os.path.join(temp_dir, "results") 57 out_files_path = output_dir / "results"
43 out_file = os.path.join(out_files_path, "result.html") 58 out_file = out_files_path / "result.html"
44 infile_name = "input_data" 59 infile_name = "input_data"
45 functionality = "productive" 60 functionality = "productive"
46 unique = "Sequence.ID" 61 unique = "Sequence.ID"
47 naive_output = "no" 62 naive_output = "no"
48 naive_output_ca = "None" 63 naive_output_ca = "None"
55 class_filter = '70_70' 70 class_filter = '70_70'
56 empty_region_filter = 'FR1' 71 empty_region_filter = 'FR1'
57 fast = 'no' 72 fast = 'no'
58 cmd = [ 73 cmd = [
59 "bash", 74 "bash",
60 "wrapper.sh", 75 wrapper,
61 input, 76 input,
62 "custom", 77 "custom",
63 out_file, 78 str(out_file),
64 out_files_path, 79 str(out_files_path),
65 infile_name, 80 infile_name,
66 "-", 81 "-",
67 functionality, 82 functionality,
68 unique, 83 unique,
69 naive_output, 84 naive_output,
76 filter_unique_count, 91 filter_unique_count,
77 class_filter, 92 class_filter,
78 empty_region_filter, 93 empty_region_filter,
79 fast 94 fast
80 ] 95 ]
81 subprocess.run(cmd, cwd=temp_dir, stdout=sys.stdout, stderr=sys.stderr, 96 docker_cmd = ["docker", "run", "-v", f"{temp_dir}:{temp_dir}",
82 check=True) 97 "--rm", # Remove container after running
98 "-v", f"{input}:{input}",
99 "-w", str(working_dir),
100 # Run as current user which allows deletion of files.
101 # It also mitigates some security considerations
102 "-u", f"{os.getuid()}:{os.getgid()}",
103 # Run with default seccomp profile to mitigate mitigation slowdown
104 # http://mamememo.blogspot.com/2020/05/cpu-intensive-rubypython-code-runs.html
105 # This knocks down test runtime from 8 to 6 minutes.
106 "--security-opt", "seccomp=unconfined",
107 # Use a mulled container generated with `planemo mull`
108 "quay.io/biocontainers/mulled-v2-f7d31c9d7424063a492fc0e5ecbf89bc757c0107:2b50bdd4d8c1fefc6ec24b0753fad0dcecec843b-0"
109 ] + cmd
110 with open(temp_dir / "stderr", "wt") as stderr_file:
111 with open(temp_dir / "stdout", "wt") as stdout_file:
112 subprocess.run(docker_cmd, cwd=working_dir, stdout=stdout_file,
113 stderr=stderr_file, check=True)
83 yield Path(out_files_path) 114 yield Path(out_files_path)
84 #shutil.rmtree(temp_dir)
85 115
86 116
87 def test_check_output(shm_csr_result): 117 def test_check_output(shm_csr_result):
88 assert shm_csr_result.exists() 118 assert shm_csr_result.exists()
89 119
90 120
91 @pytest.mark.parametrize("filename", os.listdir(VALIDATION_DATA_DIR)) 121 @pytest.mark.parametrize("filename", os.listdir(VALIDATION_DATA_DIR))
92 def test_results_match_validation(shm_csr_result, filename): 122 def test_results_match_validation(shm_csr_result, filename):
93 if filename == "shm_overview.txt":
94 # TODO: Fix errors in shm_overview.
95 return
96 with open(Path(shm_csr_result, filename)) as result_h: 123 with open(Path(shm_csr_result, filename)) as result_h:
97 with open(Path(VALIDATION_DATA_DIR, filename)) as validate_h: 124 with open(Path(VALIDATION_DATA_DIR, filename)) as validate_h:
98 for line in result_h: 125 for line in result_h:
99 assert line == validate_h.readline() 126 # Skip two faulty lines in shm_overview.
127 # TODO: Fix the issue.
128 validation_line = validate_h.readline()
129 if filename == "shm_overview.txt":
130 if (line.startswith("RGYW (%)") or
131 line.startswith("WRCY (%)")):
132 continue
133 assert line == validation_line
100 134
101 135
102 def test_nt_overview(shm_csr_result): 136 def test_nt_overview(shm_csr_result):
103 with open(Path(shm_csr_result, "sequence_overview", "ntoverview.txt") 137 with open(Path(shm_csr_result, "sequence_overview", "ntoverview.txt")
104 ) as result_h: 138 ) as result_h: