Source code for glideinwms.unittests.test_lib_condorExe
#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2009 Fermi Research Alliance, LLC
# SPDX-License-Identifier: Apache-2.0
"""Unit tests for glideinwms/lib/condorExe.py
"""
import os
import sys
import unittest
import xmlrunner
from glideinwms.lib import condorExe
from glideinwms.lib.condorExe import exe_cmd, exe_cmd_sbin, ExeError, iexe_cmd
[docs]
class TestCondorExe(unittest.TestCase):
[docs]
def setUp(self):
# set the paths to the worker script directory for the purposes of our
# unittests
condorExe.condor_bin_path = os.path.join(sys.path[0], "worker_scripts")
condorExe.condor_sbin_path = condorExe.condor_bin_path
self.normal_exit_scripts = ["write_exit_0.sh", "write_exit_0.py"]
self.abnormal_exit_scripts = ["write_exit_1.sh", "write_exit_1.py"]
# exe_cmd and exe_cmd_sbin expect args but the worker scripts don't
# nor do they care, so just add some dummy args to complete the calls
self.dummy_args = "blah"
[docs]
def test_iexe_cmd(self):
"""
Test the iexe_cmd function for errors. There are two sets of worker
functions that will be executed. The first set writes 20k lines to
stdout and exits normally (exit code: 0). The second also writes 20k
lines to stdout, but these exit abnormally (exit code: 1). Both sets
of scripts consist of one written in python and one written in shell
script (bash).
The original code for iexe_cmd would block if the buffer was filled and
EOF wasn't in the buffer. The code was re-written to handle that use
case, but still blocked because the write side could still fill the
buffer without appending EOF. There are two solutions. One, give the
buffer read command a ridiculously small buffer size (but even that
isn't a guarantee since the read side doesn't know hat the buffer size
should be), or two, make the read buffers non-blocking.
Option two was selected. This unittest tests both the blocking
condition and error handling in the function.
"""
# Execution should proceed normally and exit with no exceptions.
try:
for script in self.normal_exit_scripts:
cmd = os.path.join(condorExe.condor_bin_path, script)
output = iexe_cmd(cmd) # noqa: F841 # test execution
except Exception as e:
self.fail("Exception Occurred: %s" % str(e))
# Execution should exit with an exception. If no exception, then fail
for script in self.abnormal_exit_scripts:
cmd = os.path.join(condorExe.condor_bin_path, script)
self.assertRaises(ExeError, iexe_cmd, cmd)
[docs]
def test_exe_cmd(self):
"""
exe_cmd is a wrapper for iexe_cmd. See test_iexe_cmd docstring for
full details.
"""
# Execution should proceed normally and exit with no exceptions.
try:
for script in self.normal_exit_scripts:
output = exe_cmd(script, self.dummy_args) # noqa: F841 # test execution
except Exception as e:
self.fail("Exception Occurred: %s" % str(e))
# Execution should exit with an exception. If no exception, then fail
for script in self.abnormal_exit_scripts:
self.assertRaises(ExeError, exe_cmd, script, self.dummy_args)
[docs]
def test_exe_cmd_sbin(self):
"""
exe_cmd_sbin is a wrapper for iexe_cmd. See test_iexe_cmd docstring
for full details.
"""
# Execution should proceed normally and exit with no exceptions.
try:
for script in self.normal_exit_scripts:
output = exe_cmd_sbin(script, self.dummy_args) # noqa: F841 # test execution
except Exception as e:
self.fail("Exception Occurred: %s" % str(e))
# Execution should exit with an exception. If no exception, then fail
for script in self.abnormal_exit_scripts:
self.assertRaises(ExeError, exe_cmd_sbin, script, self.dummy_args)
if __name__ == "__main__":
unittest.main(testRunner=xmlrunner.XMLTestRunner(output="unittests-reports"))