Bug#940471: diffoscope: test failures

Gianfranco Costamagna locutusofborg at debian.org
Mon Sep 16 07:57:54 BST 2019


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



More information about the Reproducible-builds mailing list