Source: diffoscope Version: 123 Severity: serious Hello, looks like the latest diffoscope in unstable has a test failure that is preventing it from entering testing:
snip of the test failure: ==================================== ERRORS ==================================== ____________________ ERROR at setup of test_identification _____________________ tmpdir = local('/tmp/pytest-of-debci/pytest-0/test_identification0') @pytest.fixture def cmi(tmpdir): input_ = str(tmpdir.join('{}.mli'.format(prefix))) output = str(tmpdir.join('{}.cmi'.format(prefix))) with open(input_, 'w') as f: pass > subprocess.check_call(('ocamlc', '-c', input_)) f = <_io.TextIOWrapper name='/tmp/pytest-of-debci/pytest-0/test_identification0/test1.mli' mode='w' encoding='UTF-8'> input_ = '/tmp/pytest-of-debci/pytest-0/test_identification0/test1.mli' output = '/tmp/pytest-of-debci/pytest-0/test_identification0/test1.cmi' prefix = 'test1' tmpdir = local('/tmp/pytest-of-debci/pytest-0/test_identification0') tests/comparators/test_ocaml.py:41: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.7/subprocess.py:342: in check_call retcode = call(*popenargs, **kwargs) /usr/lib/python3.7/subprocess.py:323: in call with Popen(*popenargs, **kwargs) as p: /usr/lib/python3.7/subprocess.py:775: in __init__ restore_signals, start_new_session) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <subprocess.Popen object at 0x7f9a4e7e9e90> args = ['ocamlc', '-c', '/tmp/pytest-of-debci/pytest-0/test_identification0/test1.mli'] executable = b'ocamlc', preexec_fn = None, close_fds = True, pass_fds = () cwd = None, env = None, startupinfo = None, creationflags = 0, shell = False p2cread = -1, p2cwrite = -1, c2pread = -1, c2pwrite = -1, errread = -1 errwrite = -1, restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) # self._devnull is not always defined. devnull_fd = getattr(self, '_devnull', None) if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd: os.close(p2cread) if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd: os.close(c2pwrite) if errwrite != -1 and errread != -1 and errwrite != devnull_fd: os.close(errwrite) if devnull_fd is not None: os.close(devnull_fd) # Prevent a double close of these fds from __init__ on error. self._closed_child_pipe_fds = True # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) if errno_num == errno.ENOENT: err_msg += ': ' + repr(err_filename) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'ocamlc': 'ocamlc' args = ['ocamlc', '-c', '/tmp/pytest-of-debci/pytest-0/test_identification0/test1.mli'] c2pread = -1 c2pwrite = -1 child_exception_type = <class 'OSError'> child_exec_never_called = False close_fds = True creationflags = 0 cwd = None devnull_fd = None env = None env_list = None err_filename = 'ocamlc' err_msg = "No such file or directory: 'ocamlc'" errno_num = 2 errpipe_data = bytearray(b'OSError:2:') errpipe_read = 8 errpipe_write = 10 errread = -1 errwrite = -1 exception_name = bytearray(b'OSError') executable = b'ocamlc' executable_list = (b'/usr/local/bin/ocamlc', b'/usr/bin/ocamlc', b'/bin/ocamlc', b'/usr/local/games/ocamlc', b'/usr/games/ocamlc', b'/sbin/ocamlc', b'/usr/sbin/ocamlc', b'/usr/local/sbin/ocamlc') fds_to_keep = {10} hex_errno = bytearray(b'2') low_fds_to_close = [] orig_executable = 'ocamlc' p2cread = -1 p2cwrite = -1 part = b'' pass_fds = () pid = 8251 preexec_fn = None restore_signals = True self = <subprocess.Popen object at 0x7f9a4e7e9e90> shell = False start_new_session = False startupinfo = None sts = 65280 /usr/lib/python3.7/subprocess.py:1522: FileNotFoundError ____________________ ERROR at setup of test_no_differences _____________________ tmpdir = local('/tmp/pytest-of-debci/pytest-0/test_no_differences0') @pytest.fixture def cmi(tmpdir): input_ = str(tmpdir.join('{}.mli'.format(prefix))) output = str(tmpdir.join('{}.cmi'.format(prefix))) with open(input_, 'w') as f: pass > subprocess.check_call(('ocamlc', '-c', input_)) f = <_io.TextIOWrapper name='/tmp/pytest-of-debci/pytest-0/test_no_differences0/test1.mli' mode='w' encoding='UTF-8'> input_ = '/tmp/pytest-of-debci/pytest-0/test_no_differences0/test1.mli' output = '/tmp/pytest-of-debci/pytest-0/test_no_differences0/test1.cmi' prefix = 'test1' tmpdir = local('/tmp/pytest-of-debci/pytest-0/test_no_differences0') tests/comparators/test_ocaml.py:41: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.7/subprocess.py:342: in check_call retcode = call(*popenargs, **kwargs) /usr/lib/python3.7/subprocess.py:323: in call with Popen(*popenargs, **kwargs) as p: /usr/lib/python3.7/subprocess.py:775: in __init__ restore_signals, start_new_session) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <subprocess.Popen object at 0x7f9a4e82b8d0> args = ['ocamlc', '-c', '/tmp/pytest-of-debci/pytest-0/test_no_differences0/test1.mli'] executable = b'ocamlc', preexec_fn = None, close_fds = True, pass_fds = () cwd = None, env = None, startupinfo = None, creationflags = 0, shell = False p2cread = -1, p2cwrite = -1, c2pread = -1, c2pwrite = -1, errread = -1 errwrite = -1, restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) # self._devnull is not always defined. devnull_fd = getattr(self, '_devnull', None) if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd: os.close(p2cread) if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd: os.close(c2pwrite) if errwrite != -1 and errread != -1 and errwrite != devnull_fd: os.close(errwrite) if devnull_fd is not None: os.close(devnull_fd) # Prevent a double close of these fds from __init__ on error. self._closed_child_pipe_fds = True # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) if errno_num == errno.ENOENT: err_msg += ': ' + repr(err_filename) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'ocamlc': 'ocamlc' args = ['ocamlc', '-c', '/tmp/pytest-of-debci/pytest-0/test_no_differences0/test1.mli'] c2pread = -1 c2pwrite = -1 child_exception_type = <class 'OSError'> child_exec_never_called = False close_fds = True creationflags = 0 cwd = None devnull_fd = None env = None env_list = None err_filename = 'ocamlc' err_msg = "No such file or directory: 'ocamlc'" errno_num = 2 errpipe_data = bytearray(b'OSError:2:') errpipe_read = 8 errpipe_write = 10 errread = -1 errwrite = -1 exception_name = bytearray(b'OSError') executable = b'ocamlc' executable_list = (b'/usr/local/bin/ocamlc', b'/usr/bin/ocamlc', b'/bin/ocamlc', b'/usr/local/games/ocamlc', b'/usr/games/ocamlc', b'/sbin/ocamlc', b'/usr/sbin/ocamlc', b'/usr/local/sbin/ocamlc') fds_to_keep = {10} hex_errno = bytearray(b'2') low_fds_to_close = [] orig_executable = 'ocamlc' p2cread = -1 p2cwrite = -1 part = b'' pass_fds = () pid = 8252 preexec_fn = None restore_signals = True self = <subprocess.Popen object at 0x7f9a4e82b8d0> shell = False start_new_session = False startupinfo = None sts = 65280 /usr/lib/python3.7/subprocess.py:1522: FileNotFoundError =========================== short test summary info ============================ ERROR tests/comparators/test_ocaml.py::test_identification ERROR tests/comparators/test_ocaml.py::test_no_differences