def test_iter_job_args_fail(tmpdir): submit_dir = str(tmpdir.mkdir('submit')) # Check _iter_job_args raises a ValueError if input Job is not built job = Job('testjob', example_script, submit=submit_dir) with pytest.raises(ValueError) as excinfo: i = _iter_job_args(job) node_name, arg = next(i) error = ('Job {} must be built before adding it to a ' 'Dagman'.format(job.name)) assert error == str(excinfo.value) # Check _iter_job_args raises a StopIteration exception on a Job w/o args job.build() with pytest.raises(StopIteration): i = _iter_job_args(job) node_name, arg = next(i) # Check _iter_job_args raises a TypeError when input is not a Job with pytest.raises(TypeError) as excinfo: not_job = 'thisisastring' i = _iter_job_args(not_job) node_name, arg = next(i) error = 'Expecting a Job object, got {}'.format(type(not_job)) assert error == str(excinfo.value)
def test_init_arguments_type_fail(): with pytest.raises(TypeError) as excinfo: job_with_arg = Job(name='jobname', executable=example_script, arguments=50) job_with_arg.build() error = 'arguments must be a string or an iterable' assert error == str(excinfo.value)
def test_build_executeable_not_found_fail(tmpdir): submit_dir = str(tmpdir.mkdir('submit')) with pytest.raises(IOError) as excinfo: ex = '/path/to/executable' job = Job('jobname', ex, submit=submit_dir) job.build(makedirs=False) error = 'The executable {} does not exist'.format(ex) assert error == str(excinfo.value)
def test_job_submit_env_variable_dir(tmpdir, monkeypatch): # Use monkeypatch fixture to set pycondor environment variable dir_path = str(tmpdir.mkdir('submit')) monkeypatch.setenv('PYCONDOR_SUBMIT_DIR', dir_path) job = Job('jobname', example_script) job.build() tmpdir_path = os.path.join(str(tmpdir), 'submit') job_path = os.path.dirname(getattr(job, 'submit_file')) assert tmpdir_path == job_path
def test_job_args_and_queue_raises(tmpdir): submit_dir = str(tmpdir.join('submit')) with pytest.raises(NotImplementedError) as excinfo: job = Job('job', example_script, submit=submit_dir, queue=2) job.add_args(str(i) for i in range(10)) job.build() error = ('At this time multiple arguments and queue values ' 'are only supported through Dagman') assert error == str(excinfo.value)
def test_job_env_variable_dir(tmpdir, monkeypatch, env_var): submit_dir = str(tmpdir) # Use monkeypatch fixture to set pycondor environment variable dir_path = str(tmpdir.mkdir(env_var)) monkeypatch.setenv('PYCONDOR_{}_DIR'.format(env_var.upper()), dir_path) job = Job('jobname', example_script, submit=submit_dir) job.build() tmpdir_path = os.path.join(str(tmpdir), env_var) job_path = os.path.dirname(getattr(job, '{}_file'.format(env_var))) assert tmpdir_path == job_path
def test_job_subdag_build(tmpdir): submit_dir = str(tmpdir.join('submit')) extra_lines = ['first extra line', 'second extra line'] job = Job('job', example_script, submit=submit_dir, extra_lines=extra_lines) job.build() with open(job.submit_file, 'r') as f: assert set(extra_lines) <= set(line.rstrip('\n') for line in f)
def test_submit_job_parents_raises(tmpdir, monkeypatch_condor_submit): # Test submitting a Job with parents (not in a Dagman) raises an error submit = str(tmpdir) job = Job('jobname', example_script, submit=submit) parent_job = Job('parent_jobname', example_script, submit=submit) job.add_parent(parent_job) job.build() with pytest.raises(ValueError) as excinfo: job.submit_job() error = ('Attempting to submit a Job with parents. ' 'Interjob relationships requires Dagman.') assert error == str(excinfo.value)
def test_iter_job_args(tmpdir): # Check node names yielded by _iter_job_args submit_dir = str(tmpdir.mkdir('submit')) job = Job('testjob', example_script, submit=submit_dir) job.add_arg('argument1', name='arg1') job.add_arg('argument2') job.build() for idx, (node_name, jobarg) in enumerate(_iter_job_args(job)): if jobarg.name is not None: assert node_name == '{}_{}'.format(job.submit_name, jobarg.name) else: assert node_name == '{}_arg_{}'.format(job.submit_name, idx)
def test_queue_written_to_submit_file(tmpdir): # Test to check that the queue parameter is properly written # to submit file when Job is created. See issue #38. submit_dir = str(tmpdir.mkdir('submit')) # Build Job object with queue=5 job = Job('jobname', example_script, submit=submit_dir, queue=5) job.build(fancyname=False) # Read the built submit file and check that the 'queue 5' is # contained in the file. with open(job.submit_file, 'r') as f: lines = f.readlines() assert 'queue 5' in lines
def test_job_dag_submit_file_same(tmpdir, dagman): # Test to check that the submit file for a Job with no arguments is the # same whether built from a Dagman or not. See issue #38. submit_dir = str(tmpdir.mkdir('submit')) # Build Job object that will be built outside of a Dagman job_outside_dag = Job('test_job', example_script, submit=submit_dir, queue=5) job_outside_dag.build(fancyname=False) # Build Job object that will be built inside of a Dagman job_inside_dag = Job('test_job', example_script, submit=submit_dir, queue=5) dagman.add_job(job_inside_dag) dagman.build(fancyname=False) # Check that the contents of the two Job submit files are the same assert filecmp.cmp(job_outside_dag.submit_file, job_inside_dag.submit_file, shallow=False)
def test_init_retry_type_fail(): with pytest.raises(TypeError) as excinfo: job_with_retry = Job('jobname', example_script, retry='20') job_with_retry.build() error = 'retry must be an int' assert error == str(excinfo.value)
def test_init_arg_type_fail(): with pytest.raises(TypeError) as excinfo: job_with_arg = Job('jobname', example_script, argument=50) job_with_arg.build() error = 'arg must be a string' assert error == str(excinfo.value)