-โ Failed (1)
-
- -
- ๐ test_utils_duo.py
-
- โณ Function: test_list_pgroups
- -
- โ Test 6
-
- **_*๐ Setup phase*_**
-
- **duration:**
-
- ```python
- 0.0001274608075618744
- ```
-
- **outcome:**
-
- ```python
- passed
- ```
-
- **_*๐ Call phase*_**
-
- **duration:**
-
- ```python
- 0.0537314279936254
+ 0.004251067992299795
```
**outcome:**
@@ -292,69 +40,213 @@
**crash:**
```python
- path: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/requests/models.py
- lineno: 1024
- message: requests.exceptions.HTTPError: 404 Client Error: Unknown p-group: for url: https://duo.psi.ch/duo/api.php/v1/CalendarInfos/pgroup/
+ path: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError: [Errno 2] No such file or directory: 'mako'
```
**traceback:**
```python
- - path: tests/test_utils_duo.py
- lineno: 143
+ - path: tests/test_utils_dbusnotify.py
+ lineno: 29
message: None
- - path: .pixi/envs/default/lib/python3.8/site-packages/requests/models.py
- lineno: 1024
- message: HTTPError
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 858
+ message: in __init__
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError
```
**longrepr:**
```python
- def test_list_pgroups():
- """Return the list of available pgroups (IDs and names)."""
- KEY = "fried-BRAN-gorgon-togo-fledge-mummify-dustbin-advert"
- headers = {"x-api-secret": KEY}
+ @pytest.fixture(scope="session", autouse=True)
+ def mako_daemon():
+ """Start mako in headless logger mode and ensure cleanup."""
+ global _MAKO_PROC
- resp = requests.get(URL, headers=headers)
- > resp.raise_for_status()
+ # Ensure old log removed
+ if os.path.exists(_MAKO_LOGFILE):
+ os.remove(_MAKO_LOGFILE)
+
+ # Launch mako with --output (no graphical deps, only logs)
+ > _MAKO_PROC = subprocess.Popen(
+ ["mako", f"--output={_MAKO_LOGFILE}"],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
- tests/test_utils_duo.py:143:
+ tests/test_utils_dbusnotify.py:29:
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+ .pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__
+ self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
- self =
+ self =
+ args = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'
+ preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
+ startupinfo = None, creationflags = 0, shell = False, p2cread = -1
+ p2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15
+ restore_signals = True, start_new_session = False
- def raise_for_status(self):
- """Raises :class:`HTTPError`, if one occurred."""
+ 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)"""
- http_error_msg = ""
- if isinstance(self.reason, bytes):
- # We attempt to decode utf-8 first because some servers
- # choose to localize their reason strings. If the string
- # isn't utf-8, we fall back to iso-8859-1 for all other
- # encodings. (See PR #3538)
- try:
- reason = self.reason.decode("utf-8")
- except UnicodeDecodeError:
- reason = self.reason.decode("iso-8859-1")
+ if isinstance(args, (str, bytes)):
+ args = [args]
+ elif isinstance(args, os.PathLike):
+ if shell:
+ raise TypeError('path-like args is not allowed when '
+ 'shell is true')
+ args = [args]
else:
- reason = self.reason
+ args = list(args)
- if 400 <= self.status_code < 500:
- http_error_msg = (
- f"{self.status_code} Client Error: {reason} for url: {self.url}"
- )
+ 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
- elif 500 <= self.status_code < 600:
- http_error_msg = (
- f"{self.status_code} Server Error: {reason} for url: {self.url}"
- )
+ if executable is None:
+ executable = args[0]
- if http_error_msg:
- > raise HTTPError(http_error_msg, response=self)
- E requests.exceptions.HTTPError: 404 Client Error: Unknown p-group: for url: https://duo.psi.ch/duo/api.php/v1/CalendarInfos/pgroup/
+ sys.audit("subprocess.Popen", executable, args, cwd, env)
+
+ if (_USE_POSIX_SPAWN
+ and os.path.dirname(executable)
+ and preexec_fn is None
+ and not close_fds
+ and not pass_fds
+ and cwd is None
+ and (p2cread == -1 or p2cread > 2)
+ and (c2pwrite == -1 or c2pwrite > 2)
+ and (errwrite == -1 or errwrite > 2)
+ and not start_new_session):
+ self._posix_spawn(args, executable, env, restore_signals,
+ p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+ return
+
+ 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._close_pipe_fds(p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+
+ # 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)
+ > raise child_exception_type(errno_num, err_msg, err_filename)
+ E FileNotFoundError: [Errno 2] No such file or directory: 'mako'
- .pixi/envs/default/lib/python3.8/site-packages/requests/models.py:1024: HTTPError
+ .pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError
```
**_*๐ Teardown phase*_**
@@ -362,7 +254,1471 @@
**duration:**
```python
- 0.00021975208073854446
+ 0.0003444352187216282
+ ```
+
+ **outcome:**
+
+ ```python
+ passed
+ ```
+
+ โณ Function: test_notify_update
+ -
+ โ Test 2
+
+ **_*๐ Setup phase*_**
+
+ **duration:**
+
+ ```python
+ 0.0002047787420451641
+ ```
+
+ **outcome:**
+
+ ```python
+ failed
+ ```
+
+ **crash:**
+
+ ```python
+ path: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+ ```
+
+ **traceback:**
+
+ ```python
+ - path: tests/test_utils_dbusnotify.py
+ lineno: 29
+ message: None
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 858
+ message: in __init__
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError
+ ```
+
+ **longrepr:**
+
+ ```python
+ @pytest.fixture(scope="session", autouse=True)
+ def mako_daemon():
+ """Start mako in headless logger mode and ensure cleanup."""
+ global _MAKO_PROC
+
+ # Ensure old log removed
+ if os.path.exists(_MAKO_LOGFILE):
+ os.remove(_MAKO_LOGFILE)
+
+ # Launch mako with --output (no graphical deps, only logs)
+ > _MAKO_PROC = subprocess.Popen(
+ ["mako", f"--output={_MAKO_LOGFILE}"],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+
+ tests/test_utils_dbusnotify.py:29:
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+ .pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__
+ self._execute_child(args, executable, preexec_fn, close_fds,
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+ self =
+ args = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'
+ preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
+ startupinfo = None, creationflags = 0, shell = False, p2cread = -1
+ p2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15
+ 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]
+ elif isinstance(args, os.PathLike):
+ if shell:
+ raise TypeError('path-like args is not allowed when '
+ 'shell is true')
+ 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]
+
+ sys.audit("subprocess.Popen", executable, args, cwd, env)
+
+ if (_USE_POSIX_SPAWN
+ and os.path.dirname(executable)
+ and preexec_fn is None
+ and not close_fds
+ and not pass_fds
+ and cwd is None
+ and (p2cread == -1 or p2cread > 2)
+ and (c2pwrite == -1 or c2pwrite > 2)
+ and (errwrite == -1 or errwrite > 2)
+ and not start_new_session):
+ self._posix_spawn(args, executable, env, restore_signals,
+ p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+ return
+
+ 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._close_pipe_fds(p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+
+ # 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)
+ > raise child_exception_type(errno_num, err_msg, err_filename)
+ E FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+
+ .pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError
+ ```
+
+ **_*๐ Teardown phase*_**
+
+ **duration:**
+
+ ```python
+ 0.00022171391174197197
+ ```
+
+ **outcome:**
+
+ ```python
+ passed
+ ```
+
+ โณ Function: test_get_server_info
+ -
+ โ Test 3
+
+ **_*๐ Setup phase*_**
+
+ **duration:**
+
+ ```python
+ 0.00018394412472844124
+ ```
+
+ **outcome:**
+
+ ```python
+ failed
+ ```
+
+ **crash:**
+
+ ```python
+ path: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+ ```
+
+ **traceback:**
+
+ ```python
+ - path: tests/test_utils_dbusnotify.py
+ lineno: 29
+ message: None
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 858
+ message: in __init__
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError
+ ```
+
+ **longrepr:**
+
+ ```python
+ @pytest.fixture(scope="session", autouse=True)
+ def mako_daemon():
+ """Start mako in headless logger mode and ensure cleanup."""
+ global _MAKO_PROC
+
+ # Ensure old log removed
+ if os.path.exists(_MAKO_LOGFILE):
+ os.remove(_MAKO_LOGFILE)
+
+ # Launch mako with --output (no graphical deps, only logs)
+ > _MAKO_PROC = subprocess.Popen(
+ ["mako", f"--output={_MAKO_LOGFILE}"],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+
+ tests/test_utils_dbusnotify.py:29:
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+ .pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__
+ self._execute_child(args, executable, preexec_fn, close_fds,
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+ self =
+ args = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'
+ preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
+ startupinfo = None, creationflags = 0, shell = False, p2cread = -1
+ p2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15
+ 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]
+ elif isinstance(args, os.PathLike):
+ if shell:
+ raise TypeError('path-like args is not allowed when '
+ 'shell is true')
+ 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]
+
+ sys.audit("subprocess.Popen", executable, args, cwd, env)
+
+ if (_USE_POSIX_SPAWN
+ and os.path.dirname(executable)
+ and preexec_fn is None
+ and not close_fds
+ and not pass_fds
+ and cwd is None
+ and (p2cread == -1 or p2cread > 2)
+ and (c2pwrite == -1 or c2pwrite > 2)
+ and (errwrite == -1 or errwrite > 2)
+ and not start_new_session):
+ self._posix_spawn(args, executable, env, restore_signals,
+ p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+ return
+
+ 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._close_pipe_fds(p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+
+ # 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)
+ > raise child_exception_type(errno_num, err_msg, err_filename)
+ E FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+
+ .pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError
+ ```
+
+ **_*๐ Teardown phase*_**
+
+ **duration:**
+
+ ```python
+ 0.0002314755693078041
+ ```
+
+ **outcome:**
+
+ ```python
+ passed
+ ```
+
+ โณ Function: test_get_capabilities
+ -
+ โ Test 4
+
+ **_*๐ Setup phase*_**
+
+ **duration:**
+
+ ```python
+ 0.00018874090164899826
+ ```
+
+ **outcome:**
+
+ ```python
+ failed
+ ```
+
+ **crash:**
+
+ ```python
+ path: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+ ```
+
+ **traceback:**
+
+ ```python
+ - path: tests/test_utils_dbusnotify.py
+ lineno: 29
+ message: None
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 858
+ message: in __init__
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError
+ ```
+
+ **longrepr:**
+
+ ```python
+ @pytest.fixture(scope="session", autouse=True)
+ def mako_daemon():
+ """Start mako in headless logger mode and ensure cleanup."""
+ global _MAKO_PROC
+
+ # Ensure old log removed
+ if os.path.exists(_MAKO_LOGFILE):
+ os.remove(_MAKO_LOGFILE)
+
+ # Launch mako with --output (no graphical deps, only logs)
+ > _MAKO_PROC = subprocess.Popen(
+ ["mako", f"--output={_MAKO_LOGFILE}"],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+
+ tests/test_utils_dbusnotify.py:29:
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+ .pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__
+ self._execute_child(args, executable, preexec_fn, close_fds,
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+ self =
+ args = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'
+ preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
+ startupinfo = None, creationflags = 0, shell = False, p2cread = -1
+ p2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15
+ 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]
+ elif isinstance(args, os.PathLike):
+ if shell:
+ raise TypeError('path-like args is not allowed when '
+ 'shell is true')
+ 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]
+
+ sys.audit("subprocess.Popen", executable, args, cwd, env)
+
+ if (_USE_POSIX_SPAWN
+ and os.path.dirname(executable)
+ and preexec_fn is None
+ and not close_fds
+ and not pass_fds
+ and cwd is None
+ and (p2cread == -1 or p2cread > 2)
+ and (c2pwrite == -1 or c2pwrite > 2)
+ and (errwrite == -1 or errwrite > 2)
+ and not start_new_session):
+ self._posix_spawn(args, executable, env, restore_signals,
+ p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+ return
+
+ 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._close_pipe_fds(p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+
+ # 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)
+ > raise child_exception_type(errno_num, err_msg, err_filename)
+ E FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+
+ .pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError
+ ```
+
+ **_*๐ Teardown phase*_**
+
+ **duration:**
+
+ ```python
+ 0.0002180039882659912
+ ```
+
+ **outcome:**
+
+ ```python
+ passed
+ ```
+
+ โณ Function: test_notify_and_close
+ -
+ โ Test 5
+
+ **_*๐ Setup phase*_**
+
+ **duration:**
+
+ ```python
+ 0.0001881709322333336
+ ```
+
+ **outcome:**
+
+ ```python
+ failed
+ ```
+
+ **crash:**
+
+ ```python
+ path: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+ ```
+
+ **traceback:**
+
+ ```python
+ - path: tests/test_utils_dbusnotify.py
+ lineno: 29
+ message: None
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 858
+ message: in __init__
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError
+ ```
+
+ **longrepr:**
+
+ ```python
+ @pytest.fixture(scope="session", autouse=True)
+ def mako_daemon():
+ """Start mako in headless logger mode and ensure cleanup."""
+ global _MAKO_PROC
+
+ # Ensure old log removed
+ if os.path.exists(_MAKO_LOGFILE):
+ os.remove(_MAKO_LOGFILE)
+
+ # Launch mako with --output (no graphical deps, only logs)
+ > _MAKO_PROC = subprocess.Popen(
+ ["mako", f"--output={_MAKO_LOGFILE}"],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+
+ tests/test_utils_dbusnotify.py:29:
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+ .pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__
+ self._execute_child(args, executable, preexec_fn, close_fds,
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+ self =
+ args = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'
+ preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
+ startupinfo = None, creationflags = 0, shell = False, p2cread = -1
+ p2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15
+ 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]
+ elif isinstance(args, os.PathLike):
+ if shell:
+ raise TypeError('path-like args is not allowed when '
+ 'shell is true')
+ 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]
+
+ sys.audit("subprocess.Popen", executable, args, cwd, env)
+
+ if (_USE_POSIX_SPAWN
+ and os.path.dirname(executable)
+ and preexec_fn is None
+ and not close_fds
+ and not pass_fds
+ and cwd is None
+ and (p2cread == -1 or p2cread > 2)
+ and (c2pwrite == -1 or c2pwrite > 2)
+ and (errwrite == -1 or errwrite > 2)
+ and not start_new_session):
+ self._posix_spawn(args, executable, env, restore_signals,
+ p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+ return
+
+ 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._close_pipe_fds(p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+
+ # 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)
+ > raise child_exception_type(errno_num, err_msg, err_filename)
+ E FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+
+ .pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError
+ ```
+
+ **_*๐ Teardown phase*_**
+
+ **duration:**
+
+ ```python
+ 0.00021681608632206917
+ ```
+
+ **outcome:**
+
+ ```python
+ passed
+ ```
+
+ โณ Function: test_notify_invalid_value
+ -
+ โ Test 6
+
+ **_*๐ Setup phase*_**
+
+ **duration:**
+
+ ```python
+ 0.00023002317175269127
+ ```
+
+ **outcome:**
+
+ ```python
+ failed
+ ```
+
+ **crash:**
+
+ ```python
+ path: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+ ```
+
+ **traceback:**
+
+ ```python
+ - path: tests/test_utils_dbusnotify.py
+ lineno: 29
+ message: None
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 858
+ message: in __init__
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError
+ ```
+
+ **longrepr:**
+
+ ```python
+ @pytest.fixture(scope="session", autouse=True)
+ def mako_daemon():
+ """Start mako in headless logger mode and ensure cleanup."""
+ global _MAKO_PROC
+
+ # Ensure old log removed
+ if os.path.exists(_MAKO_LOGFILE):
+ os.remove(_MAKO_LOGFILE)
+
+ # Launch mako with --output (no graphical deps, only logs)
+ > _MAKO_PROC = subprocess.Popen(
+ ["mako", f"--output={_MAKO_LOGFILE}"],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+
+ tests/test_utils_dbusnotify.py:29:
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+ .pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__
+ self._execute_child(args, executable, preexec_fn, close_fds,
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+ self =
+ args = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'
+ preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
+ startupinfo = None, creationflags = 0, shell = False, p2cread = -1
+ p2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15
+ 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]
+ elif isinstance(args, os.PathLike):
+ if shell:
+ raise TypeError('path-like args is not allowed when '
+ 'shell is true')
+ 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]
+
+ sys.audit("subprocess.Popen", executable, args, cwd, env)
+
+ if (_USE_POSIX_SPAWN
+ and os.path.dirname(executable)
+ and preexec_fn is None
+ and not close_fds
+ and not pass_fds
+ and cwd is None
+ and (p2cread == -1 or p2cread > 2)
+ and (c2pwrite == -1 or c2pwrite > 2)
+ and (errwrite == -1 or errwrite > 2)
+ and not start_new_session):
+ self._posix_spawn(args, executable, env, restore_signals,
+ p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+ return
+
+ 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._close_pipe_fds(p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+
+ # 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)
+ > raise child_exception_type(errno_num, err_msg, err_filename)
+ E FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+
+ .pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError
+ ```
+
+ **_*๐ Teardown phase*_**
+
+ **duration:**
+
+ ```python
+ 0.00021888269111514091
+ ```
+
+ **outcome:**
+
+ ```python
+ passed
+ ```
+
+ โณ Function: test_convert_dbus_strings
+ -
+ โ Test 7
+
+ **_*๐ Setup phase*_**
+
+ **duration:**
+
+ ```python
+ 0.00018321815878152847
+ ```
+
+ **outcome:**
+
+ ```python
+ failed
+ ```
+
+ **crash:**
+
+ ```python
+ path: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+ ```
+
+ **traceback:**
+
+ ```python
+ - path: tests/test_utils_dbusnotify.py
+ lineno: 29
+ message: None
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 858
+ message: in __init__
+ - path: .pixi/envs/default/lib/python3.8/subprocess.py
+ lineno: 1720
+ message: FileNotFoundError
+ ```
+
+ **longrepr:**
+
+ ```python
+ @pytest.fixture(scope="session", autouse=True)
+ def mako_daemon():
+ """Start mako in headless logger mode and ensure cleanup."""
+ global _MAKO_PROC
+
+ # Ensure old log removed
+ if os.path.exists(_MAKO_LOGFILE):
+ os.remove(_MAKO_LOGFILE)
+
+ # Launch mako with --output (no graphical deps, only logs)
+ > _MAKO_PROC = subprocess.Popen(
+ ["mako", f"--output={_MAKO_LOGFILE}"],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+
+ tests/test_utils_dbusnotify.py:29:
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+ .pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__
+ self._execute_child(args, executable, preexec_fn, close_fds,
+ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+ self =
+ args = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'
+ preexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None
+ startupinfo = None, creationflags = 0, shell = False, p2cread = -1
+ p2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15
+ 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]
+ elif isinstance(args, os.PathLike):
+ if shell:
+ raise TypeError('path-like args is not allowed when '
+ 'shell is true')
+ 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]
+
+ sys.audit("subprocess.Popen", executable, args, cwd, env)
+
+ if (_USE_POSIX_SPAWN
+ and os.path.dirname(executable)
+ and preexec_fn is None
+ and not close_fds
+ and not pass_fds
+ and cwd is None
+ and (p2cread == -1 or p2cread > 2)
+ and (c2pwrite == -1 or c2pwrite > 2)
+ and (errwrite == -1 or errwrite > 2)
+ and not start_new_session):
+ self._posix_spawn(args, executable, env, restore_signals,
+ p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+ return
+
+ 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._close_pipe_fds(p2cread, p2cwrite,
+ c2pread, c2pwrite,
+ errread, errwrite)
+
+ # 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)
+ > raise child_exception_type(errno_num, err_msg, err_filename)
+ E FileNotFoundError: [Errno 2] No such file or directory: 'mako'
+
+ .pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError
+ ```
+
+ **_*๐ Teardown phase*_**
+
+ **duration:**
+
+ ```python
+ 0.00028424011543393135
```
**outcome:**
@@ -387,97 +1743,57 @@
- **result:**
```python
- - nodeid: tests/test_utils_duo.py
+ - nodeid: tests/test_utils_dbusnotify.py
type: Module
```
-โ
tests (3 tests)
+โ
tests (2 tests)
-
- โ
tests/test_utils_duo.py
+ โ
tests/test_utils_dbusnotify.py
- **Outcome:** `passed`
- **result:**
```python
- - nodeid: tests/test_utils_duo.py::TestPickledDictReal
- type: Class
- - nodeid: tests/test_utils_duo.py::TestSecrets
- type: Class
- - nodeid: tests/test_utils_duo.py::test_list_pgroups
+ - nodeid: tests/test_utils_dbusnotify.py::DBusTestCase
+ type: UnitTestCase
+ - nodeid: tests/test_utils_dbusnotify.py::test_notify_create
type: Function
- lineno: 136
+ lineno: 74
+ - nodeid: tests/test_utils_dbusnotify.py::test_notify_update
+ type: Function
+ lineno: 88
+ - nodeid: tests/test_utils_dbusnotify.py::test_get_server_info
+ type: Function
+ lineno: 101
+ - nodeid: tests/test_utils_dbusnotify.py::test_get_capabilities
+ type: Function
+ lineno: 112
+ - nodeid: tests/test_utils_dbusnotify.py::test_notify_and_close
+ type: Function
+ lineno: 127
+ - nodeid: tests/test_utils_dbusnotify.py::test_notify_invalid_value
+ type: Function
+ lineno: 138
+ - nodeid: tests/test_utils_dbusnotify.py::test_convert_dbus_strings
+ type: Function
+ lineno: 144
```
-
- โ
tests/test_utils_duo.py::TestPickledDictReal
+ โ
tests/test_utils_dbusnotify.py::DBusTestCase
- **Outcome:** `passed`
- **result:**
```python
- - nodeid: tests/test_utils_duo.py::TestPickledDictReal::test_set_get
- type: Function
- lineno: 16
- - nodeid: tests/test_utils_duo.py::TestPickledDictReal::test_load
- type: Function
- lineno: 50
- ```
-
-
- -
- โ
tests/test_utils_duo.py::TestSecrets
-
- - **Outcome:** `passed`
- - **result:**
-
- ```python
- - nodeid: tests/test_utils_duo.py::TestSecrets::test_secret_workflow
- type: Function
- lineno: 94
- - nodeid: tests/test_utils_duo.py::TestSecrets::test_multiple_secrets
- type: Function
- lineno: 111
- - nodeid: tests/test_utils_duo.py::TestSecrets::test_keyboard_interrupt
- type: Function
- lineno: 123
+ []
```
-## โ ๏ธ Warnings
-
-
-
-Warnings nยบ1
-
-```python
-message: invalid escape sequence \-
-category: DeprecationWarning
-when: collect
-filename: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/bsread/h5.py
-lineno: 207
-```
-
-
-
-
-
-
-Warnings nยบ2
-
-```python
-message: The module numpy.dual is deprecated. Instead of using dual, use the functions directly from numpy or scipy.
-category: DeprecationWarning
-when: collect
-filename: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/scipy/fft/__init__.py
-lineno: 97
-```
-
-
-
-
diff --git a/markdown/coverage-summary.md b/markdown/coverage-summary.md
index 79ead1176..91083c6b4 100644
--- a/markdown/coverage-summary.md
+++ b/markdown/coverage-summary.md
@@ -52036,3 +52036,230 @@
| slic/utils/utils.py | 17 | 8 | 53% |
| slic/utils/xrange.py | 33 | 30 | 9% |
| **TOTAL** | **9984** | **7442** | **25%** |
+| Name | Stmts | Miss | Cover |
+|----------------------------------------------- | -------: | -------: | -----: |
+| slic/\_\_init\_\_.py | 20 | 20 | 0% |
+| slic/core/\_\_init\_\_.py | 5 | 5 | 0% |
+| slic/core/acquisition/\_\_init\_\_.py | 7 | 7 | 0% |
+| slic/core/acquisition/acquisition.py | 56 | 56 | 0% |
+| slic/core/acquisition/baseacquisition.py | 5 | 5 | 0% |
+| slic/core/acquisition/broker/\_\_init\_\_.py | 2 | 2 | 0% |
+| slic/core/acquisition/broker/brokerclient.py | 104 | 104 | 0% |
+| slic/core/acquisition/broker/brokerconfig.py | 102 | 102 | 0% |
+| slic/core/acquisition/broker/pedestal.py | 66 | 66 | 0% |
+| slic/core/acquisition/broker/pids.py | 17 | 17 | 0% |
+| slic/core/acquisition/broker/post\_retrieve.py | 120 | 120 | 0% |
+| slic/core/acquisition/broker/requeststatus.py | 77 | 77 | 0% |
+| slic/core/acquisition/broker/restapi.py | 147 | 147 | 0% |
+| slic/core/acquisition/broker/tools.py | 52 | 52 | 0% |
+| slic/core/acquisition/bsacquisition.py | 10 | 10 | 0% |
+| slic/core/acquisition/bschannels.py | 30 | 30 | 0% |
+| slic/core/acquisition/channels.py | 51 | 51 | 0% |
+| slic/core/acquisition/dbacquisition.py | 19 | 19 | 0% |
+| slic/core/acquisition/detcfg.py | 82 | 82 | 0% |
+| slic/core/acquisition/diaacquisition.py | 111 | 111 | 0% |
+| slic/core/acquisition/diaconfig.py | 36 | 36 | 0% |
+| slic/core/acquisition/dummyacquisition.py | 12 | 12 | 0% |
+| slic/core/acquisition/fakeacquisition.py | 76 | 76 | 0% |
+| slic/core/acquisition/pedestals.py | 69 | 69 | 0% |
+| slic/core/acquisition/pvacquisition.py | 60 | 60 | 0% |
+| slic/core/acquisition/pvchannels.py | 13 | 13 | 0% |
+| slic/core/acquisition/sfacquisition.py | 159 | 159 | 0% |
+| slic/core/acquisition/sfpaths.py | 23 | 23 | 0% |
+| slic/core/acquisition/spreadsheet.py | 45 | 45 | 0% |
+| slic/core/adjustable/\_\_init\_\_.py | 11 | 11 | 0% |
+| slic/core/adjustable/adjustable.py | 50 | 50 | 0% |
+| slic/core/adjustable/baseadjustable.py | 28 | 28 | 0% |
+| slic/core/adjustable/collection.py | 22 | 22 | 0% |
+| slic/core/adjustable/combined.py | 15 | 15 | 0% |
+| slic/core/adjustable/convenience.py | 35 | 35 | 0% |
+| slic/core/adjustable/converted.py | 16 | 16 | 0% |
+| slic/core/adjustable/dummyadjustable.py | 41 | 41 | 0% |
+| slic/core/adjustable/error.py | 2 | 2 | 0% |
+| slic/core/adjustable/genericadjustable.py | 32 | 32 | 0% |
+| slic/core/adjustable/limited.py | 29 | 29 | 0% |
+| slic/core/adjustable/linked.py | 22 | 22 | 0% |
+| slic/core/adjustable/pvadjustable.py | 119 | 119 | 0% |
+| slic/core/adjustable/pvchangemon.py | 77 | 77 | 0% |
+| slic/core/adjustable/pvenumadjustable.py | 38 | 38 | 0% |
+| slic/core/adjustable/scaler.py | 22 | 22 | 0% |
+| slic/core/condition/\_\_init\_\_.py | 2 | 2 | 0% |
+| slic/core/condition/basecondition.py | 8 | 8 | 0% |
+| slic/core/condition/condition.py | 107 | 107 | 0% |
+| slic/core/condition/pvcondition.py | 21 | 21 | 0% |
+| slic/core/condition/valuecondition.py | 22 | 22 | 0% |
+| slic/core/device/\_\_init\_\_.py | 2 | 2 | 0% |
+| slic/core/device/auto.py | 12 | 12 | 0% |
+| slic/core/device/basedevice.py | 2 | 2 | 0% |
+| slic/core/device/device.py | 46 | 46 | 0% |
+| slic/core/device/filtered.py | 23 | 23 | 0% |
+| slic/core/device/simpledevice.py | 6 | 6 | 0% |
+| slic/core/scanner/\_\_init\_\_.py | 1 | 1 | 0% |
+| slic/core/scanner/runname.py | 36 | 36 | 0% |
+| slic/core/scanner/scanbackend.py | 232 | 232 | 0% |
+| slic/core/scanner/scaninfo.py | 45 | 45 | 0% |
+| slic/core/scanner/scanner.py | 136 | 136 | 0% |
+| slic/core/sensor/\_\_init\_\_.py | 8 | 8 | 0% |
+| slic/core/sensor/basesensor.py | 12 | 12 | 0% |
+| slic/core/sensor/bscombined.py | 9 | 9 | 0% |
+| slic/core/sensor/bsmonitor.py | 102 | 102 | 0% |
+| slic/core/sensor/bsnorm.py | 12 | 12 | 0% |
+| slic/core/sensor/bssensor.py | 6 | 6 | 0% |
+| slic/core/sensor/combined.py | 31 | 31 | 0% |
+| slic/core/sensor/monitor.py | 62 | 62 | 0% |
+| slic/core/sensor/norm.py | 9 | 9 | 0% |
+| slic/core/sensor/pvsensor.py | 32 | 32 | 0% |
+| slic/core/sensor/remoteplot.py | 15 | 15 | 0% |
+| slic/core/sensor/sensor.py | 60 | 60 | 0% |
+| slic/core/task/\_\_init\_\_.py | 4 | 4 | 0% |
+| slic/core/task/basetask.py | 11 | 11 | 0% |
+| slic/core/task/daqtask.py | 23 | 23 | 0% |
+| slic/core/task/loop.py | 57 | 57 | 0% |
+| slic/core/task/producer.py | 25 | 25 | 0% |
+| slic/core/task/task.py | 62 | 62 | 0% |
+| slic/devices/\_\_init\_\_.py | 7 | 7 | 0% |
+| slic/devices/cameras/\_\_init\_\_.py | 4 | 4 | 0% |
+| slic/devices/cameras/basler.py | 8 | 8 | 0% |
+| slic/devices/cameras/camera\_bs.py | 13 | 13 | 0% |
+| slic/devices/cameras/camera\_ca.py | 34 | 34 | 0% |
+| slic/devices/cameras/camerabase.py | 17 | 17 | 0% |
+| slic/devices/cameras/screenpanel.py | 31 | 31 | 0% |
+| slic/devices/endstations/\_\_init\_\_.py | 3 | 3 | 0% |
+| slic/devices/endstations/alvra\_flex.py | 10 | 10 | 0% |
+| slic/devices/endstations/alvra\_huber.py | 8 | 8 | 0% |
+| slic/devices/endstations/alvra\_prime.py | 48 | 48 | 0% |
+| slic/devices/endstations/alvra\_xtg.py | 8 | 8 | 0% |
+| slic/devices/endstations/bernina\_cameras.py | 33 | 33 | 0% |
+| slic/devices/endstations/bernina\_platform.py | 46 | 46 | 0% |
+| slic/devices/general/\_\_init\_\_.py | 4 | 4 | 0% |
+| slic/devices/general/delay\_compensation.py | 13 | 13 | 0% |
+| slic/devices/general/delay\_stage.py | 57 | 57 | 0% |
+| slic/devices/general/detectors/\_\_init\_\_.py | 2 | 2 | 0% |
+| slic/devices/general/detectors/buffer.py | 66 | 66 | 0% |
+| slic/devices/general/detectors/digitizer.py | 13 | 13 | 0% |
+| slic/devices/general/detectors/pvdatastream.py | 33 | 33 | 0% |
+| slic/devices/general/detectors/timer.py | 15 | 15 | 0% |
+| slic/devices/general/micosstage.py | 7 | 7 | 0% |
+| slic/devices/general/motor.py | 128 | 128 | 0% |
+| slic/devices/general/shutter.py | 22 | 22 | 0% |
+| slic/devices/general/shutterctx.py | 18 | 18 | 0% |
+| slic/devices/general/smaract.py | 169 | 169 | 0% |
+| slic/devices/loptics/\_\_init\_\_.py | 2 | 2 | 0% |
+| slic/devices/loptics/alvra\_explaser.py | 29 | 29 | 0% |
+| slic/devices/loptics/bernina\_explaser.py | 28 | 28 | 0% |
+| slic/devices/loptics/lasershutter.py | 22 | 22 | 0% |
+| slic/devices/timing/\_\_init\_\_.py | 0 | 0 | 100% |
+| slic/devices/timing/events/\_\_init\_\_.py | 3 | 3 | 0% |
+| slic/devices/timing/events/codes.py | 5 | 5 | 0% |
+| slic/devices/timing/events/ctaseq.py | 190 | 190 | 0% |
+| slic/devices/timing/events/evr.py | 37 | 37 | 0% |
+| slic/devices/timing/events/tma.py | 40 | 40 | 0% |
+| slic/devices/timing/lasertiming.py | 253 | 253 | 0% |
+| slic/devices/xdiagnostics/\_\_init\_\_.py | 2 | 2 | 0% |
+| slic/devices/xdiagnostics/intensitymonitor.py | 124 | 124 | 0% |
+| slic/devices/xdiagnostics/profilemonitor.py | 19 | 19 | 0% |
+| slic/devices/xdiagnostics/timetools.py | 48 | 48 | 0% |
+| slic/devices/xoptics/\_\_init\_\_.py | 7 | 7 | 0% |
+| slic/devices/xoptics/aramis\_attenuator.py | 96 | 96 | 0% |
+| slic/devices/xoptics/aramis\_reflaser.py | 23 | 23 | 0% |
+| slic/devices/xoptics/dcm.py | 211 | 211 | 0% |
+| slic/devices/xoptics/kb.py | 30 | 30 | 0% |
+| slic/devices/xoptics/offsetmirrors.py | 9 | 9 | 0% |
+| slic/devices/xoptics/pulsepicker.py | 56 | 56 | 0% |
+| slic/devices/xoptics/slits/\_\_init\_\_.py | 5 | 5 | 0% |
+| slic/devices/xoptics/slits/slitblades.py | 66 | 66 | 0% |
+| slic/devices/xoptics/slits/slittwinunit.py | 12 | 12 | 0% |
+| slic/devices/xoptics/slits/slitunit.py | 14 | 14 | 0% |
+| slic/devices/xoptics/slits/slitunitcw.py | 7 | 7 | 0% |
+| slic/devices/xoptics/slits/slitunitjj.py | 8 | 8 | 0% |
+| slic/gui/\_\_init\_\_.py | 1 | 1 | 0% |
+| slic/gui/daqframe.py | 75 | 75 | 0% |
+| slic/gui/daqpanels/\_\_init\_\_.py | 6 | 6 | 0% |
+| slic/gui/daqpanels/config.py | 98 | 98 | 0% |
+| slic/gui/daqpanels/goto.py | 92 | 92 | 0% |
+| slic/gui/daqpanels/run.py | 56 | 56 | 0% |
+| slic/gui/daqpanels/scan2d.py | 77 | 77 | 0% |
+| slic/gui/daqpanels/scan.py | 63 | 63 | 0% |
+| slic/gui/daqpanels/sfx.py | 77 | 77 | 0% |
+| slic/gui/daqpanels/special.py | 63 | 63 | 0% |
+| slic/gui/daqpanels/static.py | 46 | 46 | 0% |
+| slic/gui/daqpanels/tools.py | 140 | 140 | 0% |
+| slic/gui/daqpanels/tweak.py | 149 | 149 | 0% |
+| slic/gui/gui.py | 16 | 16 | 0% |
+| slic/gui/icon.py | 8 | 8 | 0% |
+| slic/gui/persist.py | 68 | 68 | 0% |
+| slic/gui/widgets/\_\_init\_\_.py | 11 | 11 | 0% |
+| slic/gui/widgets/alarm.py | 21 | 21 | 0% |
+| slic/gui/widgets/alternative.py | 51 | 51 | 0% |
+| slic/gui/widgets/boxes.py | 33 | 33 | 0% |
+| slic/gui/widgets/checkbox.py | 8 | 8 | 0% |
+| slic/gui/widgets/completers.py | 27 | 27 | 0% |
+| slic/gui/widgets/dyncombo.py | 49 | 49 | 0% |
+| slic/gui/widgets/entries.py | 253 | 253 | 0% |
+| slic/gui/widgets/exc2warn.py | 15 | 15 | 0% |
+| slic/gui/widgets/fname.py | 60 | 60 | 0% |
+| slic/gui/widgets/jfcfg.py | 290 | 290 | 0% |
+| slic/gui/widgets/jfmodcoords.py | 88 | 88 | 0% |
+| slic/gui/widgets/labeled.py | 19 | 19 | 0% |
+| slic/gui/widgets/lists.py | 96 | 96 | 0% |
+| slic/gui/widgets/mods.py | 25 | 25 | 0% |
+| slic/gui/widgets/nope.py | 26 | 26 | 0% |
+| slic/gui/widgets/plotting.py | 68 | 68 | 0% |
+| slic/gui/widgets/tools.py | 11 | 11 | 0% |
+| slic/gui/widgets/twobuttons.py | 43 | 43 | 0% |
+| slic/gui/wxdebug.py | 15 | 15 | 0% |
+| slic/utils/\_\_init\_\_.py | 24 | 24 | 0% |
+| slic/utils/argfwd.py | 53 | 53 | 0% |
+| slic/utils/ask\_yes\_no.py | 27 | 27 | 0% |
+| slic/utils/channels.py | 17 | 17 | 0% |
+| slic/utils/config.py | 5 | 5 | 0% |
+| slic/utils/cprint.py | 41 | 41 | 0% |
+| slic/utils/dbusnotify.py | 40 | 40 | 0% |
+| slic/utils/debug.py | 16 | 16 | 0% |
+| slic/utils/dictext.py | 30 | 30 | 0% |
+| slic/utils/dotdir.py | 10 | 10 | 0% |
+| slic/utils/duo.py | 77 | 77 | 0% |
+| slic/utils/elog.py | 31 | 31 | 0% |
+| slic/utils/eval.py | 49 | 49 | 0% |
+| slic/utils/exceptions.py | 22 | 22 | 0% |
+| slic/utils/get\_adj.py | 17 | 17 | 0% |
+| slic/utils/hastyepics.py | 37 | 37 | 0% |
+| slic/utils/ioc/\_\_init\_\_.py | 1 | 1 | 0% |
+| slic/utils/ioc/adjdrv.py | 31 | 31 | 0% |
+| slic/utils/ioc/ioc.py | 63 | 63 | 0% |
+| slic/utils/ipy.py | 22 | 22 | 0% |
+| slic/utils/jsonext.py | 24 | 24 | 0% |
+| slic/utils/lazypv.py | 12 | 12 | 0% |
+| slic/utils/logbook.py | 442 | 442 | 0% |
+| slic/utils/logbook\_exceptions.py | 13 | 13 | 0% |
+| slic/utils/logcfg.py | 52 | 52 | 0% |
+| slic/utils/logign.py | 22 | 22 | 0% |
+| slic/utils/marker.py | 48 | 48 | 0% |
+| slic/utils/metaclasses.py | 8 | 8 | 0% |
+| slic/utils/namespace.py | 5 | 5 | 0% |
+| slic/utils/npy.py | 71 | 71 | 0% |
+| slic/utils/opmsg.py | 122 | 122 | 0% |
+| slic/utils/path.py | 32 | 32 | 0% |
+| slic/utils/picklio.py | 7 | 7 | 0% |
+| slic/utils/printing.py | 77 | 77 | 0% |
+| slic/utils/pv.py | 30 | 30 | 0% |
+| slic/utils/pvpreload.py | 50 | 50 | 0% |
+| slic/utils/pyepics.py | 64 | 64 | 0% |
+| slic/utils/rangebar.py | 92 | 92 | 0% |
+| slic/utils/readable.py | 12 | 12 | 0% |
+| slic/utils/registry.py | 33 | 33 | 0% |
+| slic/utils/reprate.py | 55 | 55 | 0% |
+| slic/utils/richcfg.py | 21 | 21 | 0% |
+| slic/utils/run\_later.py | 64 | 64 | 0% |
+| slic/utils/screenshot.py | 30 | 30 | 0% |
+| slic/utils/sendmail.py | 49 | 49 | 0% |
+| slic/utils/sendsms.py | 5 | 5 | 0% |
+| slic/utils/shortcut.py | 38 | 38 | 0% |
+| slic/utils/snapshot.py | 6 | 6 | 0% |
+| slic/utils/termtitle.py | 3 | 3 | 0% |
+| slic/utils/tqdm\_mod.py | 28 | 28 | 0% |
+| slic/utils/trinary.py | 4 | 4 | 0% |
+| slic/utils/typecast.py | 19 | 19 | 0% |
+| slic/utils/utils.py | 17 | 17 | 0% |
+| slic/utils/xrange.py | 33 | 33 | 0% |
+| **TOTAL** | **9984** | **9984** | **0%** |
diff --git a/markdown/pytest-report.json b/markdown/pytest-report.json
index 75b5637e9..fc77d6211 100644
--- a/markdown/pytest-report.json
+++ b/markdown/pytest-report.json
@@ -1 +1 @@
-{"created": 1755521231.8154826, "duration": 5.467590093612671, "exitcode": 1, "root": "/workspace/tligui_y/slic", "environment": {}, "summary": {"passed": 5, "failed": 1, "total": 6, "collected": 6}, "collectors": [{"nodeid": "", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_duo.py", "type": "Module"}]}, {"nodeid": "tests/test_utils_duo.py::TestPickledDictReal", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_duo.py::TestPickledDictReal::test_set_get", "type": "Function", "lineno": 16}, {"nodeid": "tests/test_utils_duo.py::TestPickledDictReal::test_load", "type": "Function", "lineno": 50}]}, {"nodeid": "tests/test_utils_duo.py::TestSecrets", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_duo.py::TestSecrets::test_secret_workflow", "type": "Function", "lineno": 94}, {"nodeid": "tests/test_utils_duo.py::TestSecrets::test_multiple_secrets", "type": "Function", "lineno": 111}, {"nodeid": "tests/test_utils_duo.py::TestSecrets::test_keyboard_interrupt", "type": "Function", "lineno": 123}]}, {"nodeid": "tests/test_utils_duo.py", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_duo.py::TestPickledDictReal", "type": "Class"}, {"nodeid": "tests/test_utils_duo.py::TestSecrets", "type": "Class"}, {"nodeid": "tests/test_utils_duo.py::test_list_pgroups", "type": "Function", "lineno": 136}]}], "tests": [{"nodeid": "tests/test_utils_duo.py::TestPickledDictReal::test_set_get", "lineno": 16, "outcome": "passed", "keywords": ["test_set_get", "TestPickledDictReal", "test_utils_duo.py", "tests", "slic", ""], "setup": {"duration": 0.0003845398314297199, "outcome": "passed"}, "call": {"duration": 0.029990892857313156, "outcome": "passed"}, "teardown": {"duration": 0.0003507360816001892, "outcome": "passed"}}, {"nodeid": "tests/test_utils_duo.py::TestPickledDictReal::test_load", "lineno": 50, "outcome": "passed", "keywords": ["test_load", "TestPickledDictReal", "test_utils_duo.py", "tests", "slic", ""], "setup": {"duration": 0.00014052679762244225, "outcome": "passed"}, "call": {"duration": 0.019240790978074074, "outcome": "passed"}, "teardown": {"duration": 0.00017424626275897026, "outcome": "passed"}}, {"nodeid": "tests/test_utils_duo.py::TestSecrets::test_secret_workflow", "lineno": 94, "outcome": "passed", "keywords": ["test_secret_workflow", "TestSecrets", "test_utils_duo.py", "tests", "slic", ""], "setup": {"duration": 0.0008502216078341007, "outcome": "passed"}, "call": {"duration": 0.011314416769891977, "outcome": "passed"}, "teardown": {"duration": 0.000452475156635046, "outcome": "passed"}}, {"nodeid": "tests/test_utils_duo.py::TestSecrets::test_multiple_secrets", "lineno": 111, "outcome": "passed", "keywords": ["test_multiple_secrets", "TestSecrets", "test_utils_duo.py", "tests", "slic", ""], "setup": {"duration": 0.0007388610392808914, "outcome": "passed"}, "call": {"duration": 0.0041467780247330666, "outcome": "passed"}, "teardown": {"duration": 0.0021499176509678364, "outcome": "passed"}}, {"nodeid": "tests/test_utils_duo.py::TestSecrets::test_keyboard_interrupt", "lineno": 123, "outcome": "passed", "keywords": ["test_keyboard_interrupt", "TestSecrets", "test_utils_duo.py", "tests", "slic", ""], "setup": {"duration": 0.0006002751179039478, "outcome": "passed"}, "call": {"duration": 0.0007952856831252575, "outcome": "passed"}, "teardown": {"duration": 0.00032347580417990685, "outcome": "passed"}}, {"nodeid": "tests/test_utils_duo.py::test_list_pgroups", "lineno": 136, "outcome": "failed", "keywords": ["test_list_pgroups", "test_utils_duo.py", "tests", "slic", ""], "setup": {"duration": 0.0001274608075618744, "outcome": "passed"}, "call": {"duration": 0.0537314279936254, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/requests/models.py", "lineno": 1024, "message": "requests.exceptions.HTTPError: 404 Client Error: Unknown p-group: for url: https://duo.psi.ch/duo/api.php/v1/CalendarInfos/pgroup/"}, "traceback": [{"path": "tests/test_utils_duo.py", "lineno": 143, "message": ""}, {"path": ".pixi/envs/default/lib/python3.8/site-packages/requests/models.py", "lineno": 1024, "message": "HTTPError"}], "longrepr": "def test_list_pgroups():\n \"\"\"Return the list of available pgroups (IDs and names).\"\"\"\n KEY = \"fried-BRAN-gorgon-togo-fledge-mummify-dustbin-advert\"\n headers = {\"x-api-secret\": KEY}\n \n resp = requests.get(URL, headers=headers)\n> resp.raise_for_status()\n\ntests/test_utils_duo.py:143: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \n\n def raise_for_status(self):\n \"\"\"Raises :class:`HTTPError`, if one occurred.\"\"\"\n \n http_error_msg = \"\"\n if isinstance(self.reason, bytes):\n # We attempt to decode utf-8 first because some servers\n # choose to localize their reason strings. If the string\n # isn't utf-8, we fall back to iso-8859-1 for all other\n # encodings. (See PR #3538)\n try:\n reason = self.reason.decode(\"utf-8\")\n except UnicodeDecodeError:\n reason = self.reason.decode(\"iso-8859-1\")\n else:\n reason = self.reason\n \n if 400 <= self.status_code < 500:\n http_error_msg = (\n f\"{self.status_code} Client Error: {reason} for url: {self.url}\"\n )\n \n elif 500 <= self.status_code < 600:\n http_error_msg = (\n f\"{self.status_code} Server Error: {reason} for url: {self.url}\"\n )\n \n if http_error_msg:\n> raise HTTPError(http_error_msg, response=self)\nE requests.exceptions.HTTPError: 404 Client Error: Unknown p-group: for url: https://duo.psi.ch/duo/api.php/v1/CalendarInfos/pgroup/\n\n.pixi/envs/default/lib/python3.8/site-packages/requests/models.py:1024: HTTPError"}, "teardown": {"duration": 0.00021975208073854446, "outcome": "passed"}}], "warnings": [{"message": "invalid escape sequence \\-", "category": "DeprecationWarning", "when": "collect", "filename": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/bsread/h5.py", "lineno": 207}, {"message": "The module numpy.dual is deprecated. Instead of using dual, use the functions directly from numpy or scipy.", "category": "DeprecationWarning", "when": "collect", "filename": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/scipy/fft/__init__.py", "lineno": 97}]}
\ No newline at end of file
+{"created": 1755525234.2244782, "duration": 1.397437334060669, "exitcode": 1, "root": "/workspace/tligui_y/slic", "environment": {}, "summary": {"error": 7, "total": 7, "collected": 7}, "collectors": [{"nodeid": "", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_dbusnotify.py", "type": "Module"}]}, {"nodeid": "tests/test_utils_dbusnotify.py::DBusTestCase", "outcome": "passed", "result": []}, {"nodeid": "tests/test_utils_dbusnotify.py", "outcome": "passed", "result": [{"nodeid": "tests/test_utils_dbusnotify.py::DBusTestCase", "type": "UnitTestCase"}, {"nodeid": "tests/test_utils_dbusnotify.py::test_notify_create", "type": "Function", "lineno": 74}, {"nodeid": "tests/test_utils_dbusnotify.py::test_notify_update", "type": "Function", "lineno": 88}, {"nodeid": "tests/test_utils_dbusnotify.py::test_get_server_info", "type": "Function", "lineno": 101}, {"nodeid": "tests/test_utils_dbusnotify.py::test_get_capabilities", "type": "Function", "lineno": 112}, {"nodeid": "tests/test_utils_dbusnotify.py::test_notify_and_close", "type": "Function", "lineno": 127}, {"nodeid": "tests/test_utils_dbusnotify.py::test_notify_invalid_value", "type": "Function", "lineno": 138}, {"nodeid": "tests/test_utils_dbusnotify.py::test_convert_dbus_strings", "type": "Function", "lineno": 144}]}], "tests": [{"nodeid": "tests/test_utils_dbusnotify.py::test_notify_create", "lineno": 74, "outcome": "error", "keywords": ["test_notify_create", "test_utils_dbusnotify.py", "tests", "slic", ""], "setup": {"duration": 0.004251067992299795, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError: [Errno 2] No such file or directory: 'mako'"}, "traceback": [{"path": "tests/test_utils_dbusnotify.py", "lineno": 29, "message": ""}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 858, "message": "in __init__"}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError"}], "longrepr": "@pytest.fixture(scope=\"session\", autouse=True)\n def mako_daemon():\n \"\"\"Start mako in headless logger mode and ensure cleanup.\"\"\"\n global _MAKO_PROC\n \n # Ensure old log removed\n if os.path.exists(_MAKO_LOGFILE):\n os.remove(_MAKO_LOGFILE)\n \n # Launch mako with --output (no graphical deps, only logs)\n> _MAKO_PROC = subprocess.Popen(\n [\"mako\", f\"--output={_MAKO_LOGFILE}\"],\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE,\n )\n\ntests/test_utils_dbusnotify.py:29: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n.pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__\n self._execute_child(args, executable, preexec_fn, close_fds,\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nargs = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'\npreexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None\nstartupinfo = None, creationflags = 0, shell = False, p2cread = -1\np2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15\nrestore_signals = True, start_new_session = False\n\n def _execute_child(self, args, executable, preexec_fn, close_fds,\n pass_fds, cwd, env,\n startupinfo, creationflags, shell,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite,\n restore_signals, start_new_session):\n \"\"\"Execute program (POSIX version)\"\"\"\n \n if isinstance(args, (str, bytes)):\n args = [args]\n elif isinstance(args, os.PathLike):\n if shell:\n raise TypeError('path-like args is not allowed when '\n 'shell is true')\n args = [args]\n else:\n args = list(args)\n \n if shell:\n # On Android the default shell is at '/system/bin/sh'.\n unix_shell = ('/system/bin/sh' if\n hasattr(sys, 'getandroidapilevel') else '/bin/sh')\n args = [unix_shell, \"-c\"] + args\n if executable:\n args[0] = executable\n \n if executable is None:\n executable = args[0]\n \n sys.audit(\"subprocess.Popen\", executable, args, cwd, env)\n \n if (_USE_POSIX_SPAWN\n and os.path.dirname(executable)\n and preexec_fn is None\n and not close_fds\n and not pass_fds\n and cwd is None\n and (p2cread == -1 or p2cread > 2)\n and (c2pwrite == -1 or c2pwrite > 2)\n and (errwrite == -1 or errwrite > 2)\n and not start_new_session):\n self._posix_spawn(args, executable, env, restore_signals,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n return\n \n orig_executable = executable\n \n # For transferring possible exec failure from child to parent.\n # Data format: \"exception name:hex errno:description\"\n # Pickle is not used; it is complex and involves memory allocation.\n errpipe_read, errpipe_write = os.pipe()\n # errpipe_write must not be in the standard io 0, 1, or 2 fd range.\n low_fds_to_close = []\n while errpipe_write < 3:\n low_fds_to_close.append(errpipe_write)\n errpipe_write = os.dup(errpipe_write)\n for low_fd in low_fds_to_close:\n os.close(low_fd)\n try:\n try:\n # We must avoid complex work that could involve\n # malloc or free in the child process to avoid\n # potential deadlocks, thus we do all this here.\n # and pass it to fork_exec()\n \n if env is not None:\n env_list = []\n for k, v in env.items():\n k = os.fsencode(k)\n if b'=' in k:\n raise ValueError(\"illegal environment variable name\")\n env_list.append(k + b'=' + os.fsencode(v))\n else:\n env_list = None # Use execv instead of execve.\n executable = os.fsencode(executable)\n if os.path.dirname(executable):\n executable_list = (executable,)\n else:\n # This matches the behavior of os._execvpe().\n executable_list = tuple(\n os.path.join(os.fsencode(dir), executable)\n for dir in os.get_exec_path(env))\n fds_to_keep = set(pass_fds)\n fds_to_keep.add(errpipe_write)\n self.pid = _posixsubprocess.fork_exec(\n args, executable_list,\n close_fds, tuple(sorted(map(int, fds_to_keep))),\n cwd, env_list,\n p2cread, p2cwrite, c2pread, c2pwrite,\n errread, errwrite,\n errpipe_read, errpipe_write,\n restore_signals, start_new_session, preexec_fn)\n self._child_created = True\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_write)\n \n self._close_pipe_fds(p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n \n # Wait for exec to fail or succeed; possibly raising an\n # exception (limited in size)\n errpipe_data = bytearray()\n while True:\n part = os.read(errpipe_read, 50000)\n errpipe_data += part\n if not part or len(errpipe_data) > 50000:\n break\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_read)\n \n if errpipe_data:\n try:\n pid, sts = os.waitpid(self.pid, 0)\n if pid == self.pid:\n self._handle_exitstatus(sts)\n else:\n self.returncode = sys.maxsize\n except ChildProcessError:\n pass\n \n try:\n exception_name, hex_errno, err_msg = (\n errpipe_data.split(b':', 2))\n # The encoding here should match the encoding\n # written in by the subprocess implementations\n # like _posixsubprocess\n err_msg = err_msg.decode()\n except ValueError:\n exception_name = b'SubprocessError'\n hex_errno = b'0'\n err_msg = 'Bad exception data from child: {!r}'.format(\n bytes(errpipe_data))\n child_exception_type = getattr(\n builtins, exception_name.decode('ascii'),\n SubprocessError)\n if issubclass(child_exception_type, OSError) and hex_errno:\n errno_num = int(hex_errno, 16)\n child_exec_never_called = (err_msg == \"noexec\")\n if child_exec_never_called:\n err_msg = \"\"\n # The error must be from chdir(cwd).\n err_filename = cwd\n else:\n err_filename = orig_executable\n if errno_num != 0:\n err_msg = os.strerror(errno_num)\n> raise child_exception_type(errno_num, err_msg, err_filename)\nE FileNotFoundError: [Errno 2] No such file or directory: 'mako'\n\n.pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError"}, "teardown": {"duration": 0.0003444352187216282, "outcome": "passed"}}, {"nodeid": "tests/test_utils_dbusnotify.py::test_notify_update", "lineno": 88, "outcome": "error", "keywords": ["test_notify_update", "test_utils_dbusnotify.py", "tests", "slic", ""], "setup": {"duration": 0.0002047787420451641, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError: [Errno 2] No such file or directory: 'mako'"}, "traceback": [{"path": "tests/test_utils_dbusnotify.py", "lineno": 29, "message": ""}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 858, "message": "in __init__"}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError"}], "longrepr": "@pytest.fixture(scope=\"session\", autouse=True)\n def mako_daemon():\n \"\"\"Start mako in headless logger mode and ensure cleanup.\"\"\"\n global _MAKO_PROC\n \n # Ensure old log removed\n if os.path.exists(_MAKO_LOGFILE):\n os.remove(_MAKO_LOGFILE)\n \n # Launch mako with --output (no graphical deps, only logs)\n> _MAKO_PROC = subprocess.Popen(\n [\"mako\", f\"--output={_MAKO_LOGFILE}\"],\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE,\n )\n\ntests/test_utils_dbusnotify.py:29: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n.pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__\n self._execute_child(args, executable, preexec_fn, close_fds,\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nargs = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'\npreexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None\nstartupinfo = None, creationflags = 0, shell = False, p2cread = -1\np2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15\nrestore_signals = True, start_new_session = False\n\n def _execute_child(self, args, executable, preexec_fn, close_fds,\n pass_fds, cwd, env,\n startupinfo, creationflags, shell,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite,\n restore_signals, start_new_session):\n \"\"\"Execute program (POSIX version)\"\"\"\n \n if isinstance(args, (str, bytes)):\n args = [args]\n elif isinstance(args, os.PathLike):\n if shell:\n raise TypeError('path-like args is not allowed when '\n 'shell is true')\n args = [args]\n else:\n args = list(args)\n \n if shell:\n # On Android the default shell is at '/system/bin/sh'.\n unix_shell = ('/system/bin/sh' if\n hasattr(sys, 'getandroidapilevel') else '/bin/sh')\n args = [unix_shell, \"-c\"] + args\n if executable:\n args[0] = executable\n \n if executable is None:\n executable = args[0]\n \n sys.audit(\"subprocess.Popen\", executable, args, cwd, env)\n \n if (_USE_POSIX_SPAWN\n and os.path.dirname(executable)\n and preexec_fn is None\n and not close_fds\n and not pass_fds\n and cwd is None\n and (p2cread == -1 or p2cread > 2)\n and (c2pwrite == -1 or c2pwrite > 2)\n and (errwrite == -1 or errwrite > 2)\n and not start_new_session):\n self._posix_spawn(args, executable, env, restore_signals,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n return\n \n orig_executable = executable\n \n # For transferring possible exec failure from child to parent.\n # Data format: \"exception name:hex errno:description\"\n # Pickle is not used; it is complex and involves memory allocation.\n errpipe_read, errpipe_write = os.pipe()\n # errpipe_write must not be in the standard io 0, 1, or 2 fd range.\n low_fds_to_close = []\n while errpipe_write < 3:\n low_fds_to_close.append(errpipe_write)\n errpipe_write = os.dup(errpipe_write)\n for low_fd in low_fds_to_close:\n os.close(low_fd)\n try:\n try:\n # We must avoid complex work that could involve\n # malloc or free in the child process to avoid\n # potential deadlocks, thus we do all this here.\n # and pass it to fork_exec()\n \n if env is not None:\n env_list = []\n for k, v in env.items():\n k = os.fsencode(k)\n if b'=' in k:\n raise ValueError(\"illegal environment variable name\")\n env_list.append(k + b'=' + os.fsencode(v))\n else:\n env_list = None # Use execv instead of execve.\n executable = os.fsencode(executable)\n if os.path.dirname(executable):\n executable_list = (executable,)\n else:\n # This matches the behavior of os._execvpe().\n executable_list = tuple(\n os.path.join(os.fsencode(dir), executable)\n for dir in os.get_exec_path(env))\n fds_to_keep = set(pass_fds)\n fds_to_keep.add(errpipe_write)\n self.pid = _posixsubprocess.fork_exec(\n args, executable_list,\n close_fds, tuple(sorted(map(int, fds_to_keep))),\n cwd, env_list,\n p2cread, p2cwrite, c2pread, c2pwrite,\n errread, errwrite,\n errpipe_read, errpipe_write,\n restore_signals, start_new_session, preexec_fn)\n self._child_created = True\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_write)\n \n self._close_pipe_fds(p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n \n # Wait for exec to fail or succeed; possibly raising an\n # exception (limited in size)\n errpipe_data = bytearray()\n while True:\n part = os.read(errpipe_read, 50000)\n errpipe_data += part\n if not part or len(errpipe_data) > 50000:\n break\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_read)\n \n if errpipe_data:\n try:\n pid, sts = os.waitpid(self.pid, 0)\n if pid == self.pid:\n self._handle_exitstatus(sts)\n else:\n self.returncode = sys.maxsize\n except ChildProcessError:\n pass\n \n try:\n exception_name, hex_errno, err_msg = (\n errpipe_data.split(b':', 2))\n # The encoding here should match the encoding\n # written in by the subprocess implementations\n # like _posixsubprocess\n err_msg = err_msg.decode()\n except ValueError:\n exception_name = b'SubprocessError'\n hex_errno = b'0'\n err_msg = 'Bad exception data from child: {!r}'.format(\n bytes(errpipe_data))\n child_exception_type = getattr(\n builtins, exception_name.decode('ascii'),\n SubprocessError)\n if issubclass(child_exception_type, OSError) and hex_errno:\n errno_num = int(hex_errno, 16)\n child_exec_never_called = (err_msg == \"noexec\")\n if child_exec_never_called:\n err_msg = \"\"\n # The error must be from chdir(cwd).\n err_filename = cwd\n else:\n err_filename = orig_executable\n if errno_num != 0:\n err_msg = os.strerror(errno_num)\n> raise child_exception_type(errno_num, err_msg, err_filename)\nE FileNotFoundError: [Errno 2] No such file or directory: 'mako'\n\n.pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError"}, "teardown": {"duration": 0.00022171391174197197, "outcome": "passed"}}, {"nodeid": "tests/test_utils_dbusnotify.py::test_get_server_info", "lineno": 101, "outcome": "error", "keywords": ["test_get_server_info", "test_utils_dbusnotify.py", "tests", "slic", ""], "setup": {"duration": 0.00018394412472844124, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError: [Errno 2] No such file or directory: 'mako'"}, "traceback": [{"path": "tests/test_utils_dbusnotify.py", "lineno": 29, "message": ""}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 858, "message": "in __init__"}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError"}], "longrepr": "@pytest.fixture(scope=\"session\", autouse=True)\n def mako_daemon():\n \"\"\"Start mako in headless logger mode and ensure cleanup.\"\"\"\n global _MAKO_PROC\n \n # Ensure old log removed\n if os.path.exists(_MAKO_LOGFILE):\n os.remove(_MAKO_LOGFILE)\n \n # Launch mako with --output (no graphical deps, only logs)\n> _MAKO_PROC = subprocess.Popen(\n [\"mako\", f\"--output={_MAKO_LOGFILE}\"],\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE,\n )\n\ntests/test_utils_dbusnotify.py:29: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n.pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__\n self._execute_child(args, executable, preexec_fn, close_fds,\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nargs = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'\npreexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None\nstartupinfo = None, creationflags = 0, shell = False, p2cread = -1\np2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15\nrestore_signals = True, start_new_session = False\n\n def _execute_child(self, args, executable, preexec_fn, close_fds,\n pass_fds, cwd, env,\n startupinfo, creationflags, shell,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite,\n restore_signals, start_new_session):\n \"\"\"Execute program (POSIX version)\"\"\"\n \n if isinstance(args, (str, bytes)):\n args = [args]\n elif isinstance(args, os.PathLike):\n if shell:\n raise TypeError('path-like args is not allowed when '\n 'shell is true')\n args = [args]\n else:\n args = list(args)\n \n if shell:\n # On Android the default shell is at '/system/bin/sh'.\n unix_shell = ('/system/bin/sh' if\n hasattr(sys, 'getandroidapilevel') else '/bin/sh')\n args = [unix_shell, \"-c\"] + args\n if executable:\n args[0] = executable\n \n if executable is None:\n executable = args[0]\n \n sys.audit(\"subprocess.Popen\", executable, args, cwd, env)\n \n if (_USE_POSIX_SPAWN\n and os.path.dirname(executable)\n and preexec_fn is None\n and not close_fds\n and not pass_fds\n and cwd is None\n and (p2cread == -1 or p2cread > 2)\n and (c2pwrite == -1 or c2pwrite > 2)\n and (errwrite == -1 or errwrite > 2)\n and not start_new_session):\n self._posix_spawn(args, executable, env, restore_signals,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n return\n \n orig_executable = executable\n \n # For transferring possible exec failure from child to parent.\n # Data format: \"exception name:hex errno:description\"\n # Pickle is not used; it is complex and involves memory allocation.\n errpipe_read, errpipe_write = os.pipe()\n # errpipe_write must not be in the standard io 0, 1, or 2 fd range.\n low_fds_to_close = []\n while errpipe_write < 3:\n low_fds_to_close.append(errpipe_write)\n errpipe_write = os.dup(errpipe_write)\n for low_fd in low_fds_to_close:\n os.close(low_fd)\n try:\n try:\n # We must avoid complex work that could involve\n # malloc or free in the child process to avoid\n # potential deadlocks, thus we do all this here.\n # and pass it to fork_exec()\n \n if env is not None:\n env_list = []\n for k, v in env.items():\n k = os.fsencode(k)\n if b'=' in k:\n raise ValueError(\"illegal environment variable name\")\n env_list.append(k + b'=' + os.fsencode(v))\n else:\n env_list = None # Use execv instead of execve.\n executable = os.fsencode(executable)\n if os.path.dirname(executable):\n executable_list = (executable,)\n else:\n # This matches the behavior of os._execvpe().\n executable_list = tuple(\n os.path.join(os.fsencode(dir), executable)\n for dir in os.get_exec_path(env))\n fds_to_keep = set(pass_fds)\n fds_to_keep.add(errpipe_write)\n self.pid = _posixsubprocess.fork_exec(\n args, executable_list,\n close_fds, tuple(sorted(map(int, fds_to_keep))),\n cwd, env_list,\n p2cread, p2cwrite, c2pread, c2pwrite,\n errread, errwrite,\n errpipe_read, errpipe_write,\n restore_signals, start_new_session, preexec_fn)\n self._child_created = True\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_write)\n \n self._close_pipe_fds(p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n \n # Wait for exec to fail or succeed; possibly raising an\n # exception (limited in size)\n errpipe_data = bytearray()\n while True:\n part = os.read(errpipe_read, 50000)\n errpipe_data += part\n if not part or len(errpipe_data) > 50000:\n break\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_read)\n \n if errpipe_data:\n try:\n pid, sts = os.waitpid(self.pid, 0)\n if pid == self.pid:\n self._handle_exitstatus(sts)\n else:\n self.returncode = sys.maxsize\n except ChildProcessError:\n pass\n \n try:\n exception_name, hex_errno, err_msg = (\n errpipe_data.split(b':', 2))\n # The encoding here should match the encoding\n # written in by the subprocess implementations\n # like _posixsubprocess\n err_msg = err_msg.decode()\n except ValueError:\n exception_name = b'SubprocessError'\n hex_errno = b'0'\n err_msg = 'Bad exception data from child: {!r}'.format(\n bytes(errpipe_data))\n child_exception_type = getattr(\n builtins, exception_name.decode('ascii'),\n SubprocessError)\n if issubclass(child_exception_type, OSError) and hex_errno:\n errno_num = int(hex_errno, 16)\n child_exec_never_called = (err_msg == \"noexec\")\n if child_exec_never_called:\n err_msg = \"\"\n # The error must be from chdir(cwd).\n err_filename = cwd\n else:\n err_filename = orig_executable\n if errno_num != 0:\n err_msg = os.strerror(errno_num)\n> raise child_exception_type(errno_num, err_msg, err_filename)\nE FileNotFoundError: [Errno 2] No such file or directory: 'mako'\n\n.pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError"}, "teardown": {"duration": 0.0002314755693078041, "outcome": "passed"}}, {"nodeid": "tests/test_utils_dbusnotify.py::test_get_capabilities", "lineno": 112, "outcome": "error", "keywords": ["test_get_capabilities", "test_utils_dbusnotify.py", "tests", "slic", ""], "setup": {"duration": 0.00018874090164899826, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError: [Errno 2] No such file or directory: 'mako'"}, "traceback": [{"path": "tests/test_utils_dbusnotify.py", "lineno": 29, "message": ""}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 858, "message": "in __init__"}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError"}], "longrepr": "@pytest.fixture(scope=\"session\", autouse=True)\n def mako_daemon():\n \"\"\"Start mako in headless logger mode and ensure cleanup.\"\"\"\n global _MAKO_PROC\n \n # Ensure old log removed\n if os.path.exists(_MAKO_LOGFILE):\n os.remove(_MAKO_LOGFILE)\n \n # Launch mako with --output (no graphical deps, only logs)\n> _MAKO_PROC = subprocess.Popen(\n [\"mako\", f\"--output={_MAKO_LOGFILE}\"],\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE,\n )\n\ntests/test_utils_dbusnotify.py:29: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n.pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__\n self._execute_child(args, executable, preexec_fn, close_fds,\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nargs = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'\npreexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None\nstartupinfo = None, creationflags = 0, shell = False, p2cread = -1\np2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15\nrestore_signals = True, start_new_session = False\n\n def _execute_child(self, args, executable, preexec_fn, close_fds,\n pass_fds, cwd, env,\n startupinfo, creationflags, shell,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite,\n restore_signals, start_new_session):\n \"\"\"Execute program (POSIX version)\"\"\"\n \n if isinstance(args, (str, bytes)):\n args = [args]\n elif isinstance(args, os.PathLike):\n if shell:\n raise TypeError('path-like args is not allowed when '\n 'shell is true')\n args = [args]\n else:\n args = list(args)\n \n if shell:\n # On Android the default shell is at '/system/bin/sh'.\n unix_shell = ('/system/bin/sh' if\n hasattr(sys, 'getandroidapilevel') else '/bin/sh')\n args = [unix_shell, \"-c\"] + args\n if executable:\n args[0] = executable\n \n if executable is None:\n executable = args[0]\n \n sys.audit(\"subprocess.Popen\", executable, args, cwd, env)\n \n if (_USE_POSIX_SPAWN\n and os.path.dirname(executable)\n and preexec_fn is None\n and not close_fds\n and not pass_fds\n and cwd is None\n and (p2cread == -1 or p2cread > 2)\n and (c2pwrite == -1 or c2pwrite > 2)\n and (errwrite == -1 or errwrite > 2)\n and not start_new_session):\n self._posix_spawn(args, executable, env, restore_signals,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n return\n \n orig_executable = executable\n \n # For transferring possible exec failure from child to parent.\n # Data format: \"exception name:hex errno:description\"\n # Pickle is not used; it is complex and involves memory allocation.\n errpipe_read, errpipe_write = os.pipe()\n # errpipe_write must not be in the standard io 0, 1, or 2 fd range.\n low_fds_to_close = []\n while errpipe_write < 3:\n low_fds_to_close.append(errpipe_write)\n errpipe_write = os.dup(errpipe_write)\n for low_fd in low_fds_to_close:\n os.close(low_fd)\n try:\n try:\n # We must avoid complex work that could involve\n # malloc or free in the child process to avoid\n # potential deadlocks, thus we do all this here.\n # and pass it to fork_exec()\n \n if env is not None:\n env_list = []\n for k, v in env.items():\n k = os.fsencode(k)\n if b'=' in k:\n raise ValueError(\"illegal environment variable name\")\n env_list.append(k + b'=' + os.fsencode(v))\n else:\n env_list = None # Use execv instead of execve.\n executable = os.fsencode(executable)\n if os.path.dirname(executable):\n executable_list = (executable,)\n else:\n # This matches the behavior of os._execvpe().\n executable_list = tuple(\n os.path.join(os.fsencode(dir), executable)\n for dir in os.get_exec_path(env))\n fds_to_keep = set(pass_fds)\n fds_to_keep.add(errpipe_write)\n self.pid = _posixsubprocess.fork_exec(\n args, executable_list,\n close_fds, tuple(sorted(map(int, fds_to_keep))),\n cwd, env_list,\n p2cread, p2cwrite, c2pread, c2pwrite,\n errread, errwrite,\n errpipe_read, errpipe_write,\n restore_signals, start_new_session, preexec_fn)\n self._child_created = True\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_write)\n \n self._close_pipe_fds(p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n \n # Wait for exec to fail or succeed; possibly raising an\n # exception (limited in size)\n errpipe_data = bytearray()\n while True:\n part = os.read(errpipe_read, 50000)\n errpipe_data += part\n if not part or len(errpipe_data) > 50000:\n break\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_read)\n \n if errpipe_data:\n try:\n pid, sts = os.waitpid(self.pid, 0)\n if pid == self.pid:\n self._handle_exitstatus(sts)\n else:\n self.returncode = sys.maxsize\n except ChildProcessError:\n pass\n \n try:\n exception_name, hex_errno, err_msg = (\n errpipe_data.split(b':', 2))\n # The encoding here should match the encoding\n # written in by the subprocess implementations\n # like _posixsubprocess\n err_msg = err_msg.decode()\n except ValueError:\n exception_name = b'SubprocessError'\n hex_errno = b'0'\n err_msg = 'Bad exception data from child: {!r}'.format(\n bytes(errpipe_data))\n child_exception_type = getattr(\n builtins, exception_name.decode('ascii'),\n SubprocessError)\n if issubclass(child_exception_type, OSError) and hex_errno:\n errno_num = int(hex_errno, 16)\n child_exec_never_called = (err_msg == \"noexec\")\n if child_exec_never_called:\n err_msg = \"\"\n # The error must be from chdir(cwd).\n err_filename = cwd\n else:\n err_filename = orig_executable\n if errno_num != 0:\n err_msg = os.strerror(errno_num)\n> raise child_exception_type(errno_num, err_msg, err_filename)\nE FileNotFoundError: [Errno 2] No such file or directory: 'mako'\n\n.pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError"}, "teardown": {"duration": 0.0002180039882659912, "outcome": "passed"}}, {"nodeid": "tests/test_utils_dbusnotify.py::test_notify_and_close", "lineno": 127, "outcome": "error", "keywords": ["test_notify_and_close", "test_utils_dbusnotify.py", "tests", "slic", ""], "setup": {"duration": 0.0001881709322333336, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError: [Errno 2] No such file or directory: 'mako'"}, "traceback": [{"path": "tests/test_utils_dbusnotify.py", "lineno": 29, "message": ""}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 858, "message": "in __init__"}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError"}], "longrepr": "@pytest.fixture(scope=\"session\", autouse=True)\n def mako_daemon():\n \"\"\"Start mako in headless logger mode and ensure cleanup.\"\"\"\n global _MAKO_PROC\n \n # Ensure old log removed\n if os.path.exists(_MAKO_LOGFILE):\n os.remove(_MAKO_LOGFILE)\n \n # Launch mako with --output (no graphical deps, only logs)\n> _MAKO_PROC = subprocess.Popen(\n [\"mako\", f\"--output={_MAKO_LOGFILE}\"],\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE,\n )\n\ntests/test_utils_dbusnotify.py:29: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n.pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__\n self._execute_child(args, executable, preexec_fn, close_fds,\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nargs = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'\npreexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None\nstartupinfo = None, creationflags = 0, shell = False, p2cread = -1\np2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15\nrestore_signals = True, start_new_session = False\n\n def _execute_child(self, args, executable, preexec_fn, close_fds,\n pass_fds, cwd, env,\n startupinfo, creationflags, shell,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite,\n restore_signals, start_new_session):\n \"\"\"Execute program (POSIX version)\"\"\"\n \n if isinstance(args, (str, bytes)):\n args = [args]\n elif isinstance(args, os.PathLike):\n if shell:\n raise TypeError('path-like args is not allowed when '\n 'shell is true')\n args = [args]\n else:\n args = list(args)\n \n if shell:\n # On Android the default shell is at '/system/bin/sh'.\n unix_shell = ('/system/bin/sh' if\n hasattr(sys, 'getandroidapilevel') else '/bin/sh')\n args = [unix_shell, \"-c\"] + args\n if executable:\n args[0] = executable\n \n if executable is None:\n executable = args[0]\n \n sys.audit(\"subprocess.Popen\", executable, args, cwd, env)\n \n if (_USE_POSIX_SPAWN\n and os.path.dirname(executable)\n and preexec_fn is None\n and not close_fds\n and not pass_fds\n and cwd is None\n and (p2cread == -1 or p2cread > 2)\n and (c2pwrite == -1 or c2pwrite > 2)\n and (errwrite == -1 or errwrite > 2)\n and not start_new_session):\n self._posix_spawn(args, executable, env, restore_signals,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n return\n \n orig_executable = executable\n \n # For transferring possible exec failure from child to parent.\n # Data format: \"exception name:hex errno:description\"\n # Pickle is not used; it is complex and involves memory allocation.\n errpipe_read, errpipe_write = os.pipe()\n # errpipe_write must not be in the standard io 0, 1, or 2 fd range.\n low_fds_to_close = []\n while errpipe_write < 3:\n low_fds_to_close.append(errpipe_write)\n errpipe_write = os.dup(errpipe_write)\n for low_fd in low_fds_to_close:\n os.close(low_fd)\n try:\n try:\n # We must avoid complex work that could involve\n # malloc or free in the child process to avoid\n # potential deadlocks, thus we do all this here.\n # and pass it to fork_exec()\n \n if env is not None:\n env_list = []\n for k, v in env.items():\n k = os.fsencode(k)\n if b'=' in k:\n raise ValueError(\"illegal environment variable name\")\n env_list.append(k + b'=' + os.fsencode(v))\n else:\n env_list = None # Use execv instead of execve.\n executable = os.fsencode(executable)\n if os.path.dirname(executable):\n executable_list = (executable,)\n else:\n # This matches the behavior of os._execvpe().\n executable_list = tuple(\n os.path.join(os.fsencode(dir), executable)\n for dir in os.get_exec_path(env))\n fds_to_keep = set(pass_fds)\n fds_to_keep.add(errpipe_write)\n self.pid = _posixsubprocess.fork_exec(\n args, executable_list,\n close_fds, tuple(sorted(map(int, fds_to_keep))),\n cwd, env_list,\n p2cread, p2cwrite, c2pread, c2pwrite,\n errread, errwrite,\n errpipe_read, errpipe_write,\n restore_signals, start_new_session, preexec_fn)\n self._child_created = True\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_write)\n \n self._close_pipe_fds(p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n \n # Wait for exec to fail or succeed; possibly raising an\n # exception (limited in size)\n errpipe_data = bytearray()\n while True:\n part = os.read(errpipe_read, 50000)\n errpipe_data += part\n if not part or len(errpipe_data) > 50000:\n break\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_read)\n \n if errpipe_data:\n try:\n pid, sts = os.waitpid(self.pid, 0)\n if pid == self.pid:\n self._handle_exitstatus(sts)\n else:\n self.returncode = sys.maxsize\n except ChildProcessError:\n pass\n \n try:\n exception_name, hex_errno, err_msg = (\n errpipe_data.split(b':', 2))\n # The encoding here should match the encoding\n # written in by the subprocess implementations\n # like _posixsubprocess\n err_msg = err_msg.decode()\n except ValueError:\n exception_name = b'SubprocessError'\n hex_errno = b'0'\n err_msg = 'Bad exception data from child: {!r}'.format(\n bytes(errpipe_data))\n child_exception_type = getattr(\n builtins, exception_name.decode('ascii'),\n SubprocessError)\n if issubclass(child_exception_type, OSError) and hex_errno:\n errno_num = int(hex_errno, 16)\n child_exec_never_called = (err_msg == \"noexec\")\n if child_exec_never_called:\n err_msg = \"\"\n # The error must be from chdir(cwd).\n err_filename = cwd\n else:\n err_filename = orig_executable\n if errno_num != 0:\n err_msg = os.strerror(errno_num)\n> raise child_exception_type(errno_num, err_msg, err_filename)\nE FileNotFoundError: [Errno 2] No such file or directory: 'mako'\n\n.pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError"}, "teardown": {"duration": 0.00021681608632206917, "outcome": "passed"}}, {"nodeid": "tests/test_utils_dbusnotify.py::test_notify_invalid_value", "lineno": 138, "outcome": "error", "keywords": ["test_notify_invalid_value", "test_utils_dbusnotify.py", "tests", "slic", ""], "setup": {"duration": 0.00023002317175269127, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError: [Errno 2] No such file or directory: 'mako'"}, "traceback": [{"path": "tests/test_utils_dbusnotify.py", "lineno": 29, "message": ""}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 858, "message": "in __init__"}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError"}], "longrepr": "@pytest.fixture(scope=\"session\", autouse=True)\n def mako_daemon():\n \"\"\"Start mako in headless logger mode and ensure cleanup.\"\"\"\n global _MAKO_PROC\n \n # Ensure old log removed\n if os.path.exists(_MAKO_LOGFILE):\n os.remove(_MAKO_LOGFILE)\n \n # Launch mako with --output (no graphical deps, only logs)\n> _MAKO_PROC = subprocess.Popen(\n [\"mako\", f\"--output={_MAKO_LOGFILE}\"],\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE,\n )\n\ntests/test_utils_dbusnotify.py:29: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n.pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__\n self._execute_child(args, executable, preexec_fn, close_fds,\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nargs = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'\npreexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None\nstartupinfo = None, creationflags = 0, shell = False, p2cread = -1\np2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15\nrestore_signals = True, start_new_session = False\n\n def _execute_child(self, args, executable, preexec_fn, close_fds,\n pass_fds, cwd, env,\n startupinfo, creationflags, shell,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite,\n restore_signals, start_new_session):\n \"\"\"Execute program (POSIX version)\"\"\"\n \n if isinstance(args, (str, bytes)):\n args = [args]\n elif isinstance(args, os.PathLike):\n if shell:\n raise TypeError('path-like args is not allowed when '\n 'shell is true')\n args = [args]\n else:\n args = list(args)\n \n if shell:\n # On Android the default shell is at '/system/bin/sh'.\n unix_shell = ('/system/bin/sh' if\n hasattr(sys, 'getandroidapilevel') else '/bin/sh')\n args = [unix_shell, \"-c\"] + args\n if executable:\n args[0] = executable\n \n if executable is None:\n executable = args[0]\n \n sys.audit(\"subprocess.Popen\", executable, args, cwd, env)\n \n if (_USE_POSIX_SPAWN\n and os.path.dirname(executable)\n and preexec_fn is None\n and not close_fds\n and not pass_fds\n and cwd is None\n and (p2cread == -1 or p2cread > 2)\n and (c2pwrite == -1 or c2pwrite > 2)\n and (errwrite == -1 or errwrite > 2)\n and not start_new_session):\n self._posix_spawn(args, executable, env, restore_signals,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n return\n \n orig_executable = executable\n \n # For transferring possible exec failure from child to parent.\n # Data format: \"exception name:hex errno:description\"\n # Pickle is not used; it is complex and involves memory allocation.\n errpipe_read, errpipe_write = os.pipe()\n # errpipe_write must not be in the standard io 0, 1, or 2 fd range.\n low_fds_to_close = []\n while errpipe_write < 3:\n low_fds_to_close.append(errpipe_write)\n errpipe_write = os.dup(errpipe_write)\n for low_fd in low_fds_to_close:\n os.close(low_fd)\n try:\n try:\n # We must avoid complex work that could involve\n # malloc or free in the child process to avoid\n # potential deadlocks, thus we do all this here.\n # and pass it to fork_exec()\n \n if env is not None:\n env_list = []\n for k, v in env.items():\n k = os.fsencode(k)\n if b'=' in k:\n raise ValueError(\"illegal environment variable name\")\n env_list.append(k + b'=' + os.fsencode(v))\n else:\n env_list = None # Use execv instead of execve.\n executable = os.fsencode(executable)\n if os.path.dirname(executable):\n executable_list = (executable,)\n else:\n # This matches the behavior of os._execvpe().\n executable_list = tuple(\n os.path.join(os.fsencode(dir), executable)\n for dir in os.get_exec_path(env))\n fds_to_keep = set(pass_fds)\n fds_to_keep.add(errpipe_write)\n self.pid = _posixsubprocess.fork_exec(\n args, executable_list,\n close_fds, tuple(sorted(map(int, fds_to_keep))),\n cwd, env_list,\n p2cread, p2cwrite, c2pread, c2pwrite,\n errread, errwrite,\n errpipe_read, errpipe_write,\n restore_signals, start_new_session, preexec_fn)\n self._child_created = True\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_write)\n \n self._close_pipe_fds(p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n \n # Wait for exec to fail or succeed; possibly raising an\n # exception (limited in size)\n errpipe_data = bytearray()\n while True:\n part = os.read(errpipe_read, 50000)\n errpipe_data += part\n if not part or len(errpipe_data) > 50000:\n break\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_read)\n \n if errpipe_data:\n try:\n pid, sts = os.waitpid(self.pid, 0)\n if pid == self.pid:\n self._handle_exitstatus(sts)\n else:\n self.returncode = sys.maxsize\n except ChildProcessError:\n pass\n \n try:\n exception_name, hex_errno, err_msg = (\n errpipe_data.split(b':', 2))\n # The encoding here should match the encoding\n # written in by the subprocess implementations\n # like _posixsubprocess\n err_msg = err_msg.decode()\n except ValueError:\n exception_name = b'SubprocessError'\n hex_errno = b'0'\n err_msg = 'Bad exception data from child: {!r}'.format(\n bytes(errpipe_data))\n child_exception_type = getattr(\n builtins, exception_name.decode('ascii'),\n SubprocessError)\n if issubclass(child_exception_type, OSError) and hex_errno:\n errno_num = int(hex_errno, 16)\n child_exec_never_called = (err_msg == \"noexec\")\n if child_exec_never_called:\n err_msg = \"\"\n # The error must be from chdir(cwd).\n err_filename = cwd\n else:\n err_filename = orig_executable\n if errno_num != 0:\n err_msg = os.strerror(errno_num)\n> raise child_exception_type(errno_num, err_msg, err_filename)\nE FileNotFoundError: [Errno 2] No such file or directory: 'mako'\n\n.pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError"}, "teardown": {"duration": 0.00021888269111514091, "outcome": "passed"}}, {"nodeid": "tests/test_utils_dbusnotify.py::test_convert_dbus_strings", "lineno": 144, "outcome": "error", "keywords": ["test_convert_dbus_strings", "test_utils_dbusnotify.py", "tests", "slic", ""], "setup": {"duration": 0.00018321815878152847, "outcome": "failed", "crash": {"path": "/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError: [Errno 2] No such file or directory: 'mako'"}, "traceback": [{"path": "tests/test_utils_dbusnotify.py", "lineno": 29, "message": ""}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 858, "message": "in __init__"}, {"path": ".pixi/envs/default/lib/python3.8/subprocess.py", "lineno": 1720, "message": "FileNotFoundError"}], "longrepr": "@pytest.fixture(scope=\"session\", autouse=True)\n def mako_daemon():\n \"\"\"Start mako in headless logger mode and ensure cleanup.\"\"\"\n global _MAKO_PROC\n \n # Ensure old log removed\n if os.path.exists(_MAKO_LOGFILE):\n os.remove(_MAKO_LOGFILE)\n \n # Launch mako with --output (no graphical deps, only logs)\n> _MAKO_PROC = subprocess.Popen(\n [\"mako\", f\"--output={_MAKO_LOGFILE}\"],\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE,\n )\n\ntests/test_utils_dbusnotify.py:29: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n.pixi/envs/default/lib/python3.8/subprocess.py:858: in __init__\n self._execute_child(args, executable, preexec_fn, close_fds,\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = \nargs = ['mako', '--output=/tmp/mako-test.log'], executable = b'mako'\npreexec_fn = None, close_fds = True, pass_fds = (), cwd = None, env = None\nstartupinfo = None, creationflags = 0, shell = False, p2cread = -1\np2cwrite = -1, c2pread = 12, c2pwrite = 13, errread = 14, errwrite = 15\nrestore_signals = True, start_new_session = False\n\n def _execute_child(self, args, executable, preexec_fn, close_fds,\n pass_fds, cwd, env,\n startupinfo, creationflags, shell,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite,\n restore_signals, start_new_session):\n \"\"\"Execute program (POSIX version)\"\"\"\n \n if isinstance(args, (str, bytes)):\n args = [args]\n elif isinstance(args, os.PathLike):\n if shell:\n raise TypeError('path-like args is not allowed when '\n 'shell is true')\n args = [args]\n else:\n args = list(args)\n \n if shell:\n # On Android the default shell is at '/system/bin/sh'.\n unix_shell = ('/system/bin/sh' if\n hasattr(sys, 'getandroidapilevel') else '/bin/sh')\n args = [unix_shell, \"-c\"] + args\n if executable:\n args[0] = executable\n \n if executable is None:\n executable = args[0]\n \n sys.audit(\"subprocess.Popen\", executable, args, cwd, env)\n \n if (_USE_POSIX_SPAWN\n and os.path.dirname(executable)\n and preexec_fn is None\n and not close_fds\n and not pass_fds\n and cwd is None\n and (p2cread == -1 or p2cread > 2)\n and (c2pwrite == -1 or c2pwrite > 2)\n and (errwrite == -1 or errwrite > 2)\n and not start_new_session):\n self._posix_spawn(args, executable, env, restore_signals,\n p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n return\n \n orig_executable = executable\n \n # For transferring possible exec failure from child to parent.\n # Data format: \"exception name:hex errno:description\"\n # Pickle is not used; it is complex and involves memory allocation.\n errpipe_read, errpipe_write = os.pipe()\n # errpipe_write must not be in the standard io 0, 1, or 2 fd range.\n low_fds_to_close = []\n while errpipe_write < 3:\n low_fds_to_close.append(errpipe_write)\n errpipe_write = os.dup(errpipe_write)\n for low_fd in low_fds_to_close:\n os.close(low_fd)\n try:\n try:\n # We must avoid complex work that could involve\n # malloc or free in the child process to avoid\n # potential deadlocks, thus we do all this here.\n # and pass it to fork_exec()\n \n if env is not None:\n env_list = []\n for k, v in env.items():\n k = os.fsencode(k)\n if b'=' in k:\n raise ValueError(\"illegal environment variable name\")\n env_list.append(k + b'=' + os.fsencode(v))\n else:\n env_list = None # Use execv instead of execve.\n executable = os.fsencode(executable)\n if os.path.dirname(executable):\n executable_list = (executable,)\n else:\n # This matches the behavior of os._execvpe().\n executable_list = tuple(\n os.path.join(os.fsencode(dir), executable)\n for dir in os.get_exec_path(env))\n fds_to_keep = set(pass_fds)\n fds_to_keep.add(errpipe_write)\n self.pid = _posixsubprocess.fork_exec(\n args, executable_list,\n close_fds, tuple(sorted(map(int, fds_to_keep))),\n cwd, env_list,\n p2cread, p2cwrite, c2pread, c2pwrite,\n errread, errwrite,\n errpipe_read, errpipe_write,\n restore_signals, start_new_session, preexec_fn)\n self._child_created = True\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_write)\n \n self._close_pipe_fds(p2cread, p2cwrite,\n c2pread, c2pwrite,\n errread, errwrite)\n \n # Wait for exec to fail or succeed; possibly raising an\n # exception (limited in size)\n errpipe_data = bytearray()\n while True:\n part = os.read(errpipe_read, 50000)\n errpipe_data += part\n if not part or len(errpipe_data) > 50000:\n break\n finally:\n # be sure the FD is closed no matter what\n os.close(errpipe_read)\n \n if errpipe_data:\n try:\n pid, sts = os.waitpid(self.pid, 0)\n if pid == self.pid:\n self._handle_exitstatus(sts)\n else:\n self.returncode = sys.maxsize\n except ChildProcessError:\n pass\n \n try:\n exception_name, hex_errno, err_msg = (\n errpipe_data.split(b':', 2))\n # The encoding here should match the encoding\n # written in by the subprocess implementations\n # like _posixsubprocess\n err_msg = err_msg.decode()\n except ValueError:\n exception_name = b'SubprocessError'\n hex_errno = b'0'\n err_msg = 'Bad exception data from child: {!r}'.format(\n bytes(errpipe_data))\n child_exception_type = getattr(\n builtins, exception_name.decode('ascii'),\n SubprocessError)\n if issubclass(child_exception_type, OSError) and hex_errno:\n errno_num = int(hex_errno, 16)\n child_exec_never_called = (err_msg == \"noexec\")\n if child_exec_never_called:\n err_msg = \"\"\n # The error must be from chdir(cwd).\n err_filename = cwd\n else:\n err_filename = orig_executable\n if errno_num != 0:\n err_msg = os.strerror(errno_num)\n> raise child_exception_type(errno_num, err_msg, err_filename)\nE FileNotFoundError: [Errno 2] No such file or directory: 'mako'\n\n.pixi/envs/default/lib/python3.8/subprocess.py:1720: FileNotFoundError"}, "teardown": {"duration": 0.00028424011543393135, "outcome": "passed"}}]}
\ No newline at end of file
diff --git a/markdown/runtime_params.json b/markdown/runtime_params.json
index dfb2584be..0637a088a 100644
--- a/markdown/runtime_params.json
+++ b/markdown/runtime_params.json
@@ -1,26 +1 @@
-[
- {
- "nodeid": "tests/test_utils_duo.py::TestPickledDictReal::test_set_get",
- "callspec": null
- },
- {
- "nodeid": "tests/test_utils_duo.py::TestPickledDictReal::test_load",
- "callspec": null
- },
- {
- "nodeid": "tests/test_utils_duo.py::TestSecrets::test_secret_workflow",
- "callspec": null
- },
- {
- "nodeid": "tests/test_utils_duo.py::TestSecrets::test_multiple_secrets",
- "callspec": null
- },
- {
- "nodeid": "tests/test_utils_duo.py::TestSecrets::test_keyboard_interrupt",
- "callspec": null
- },
- {
- "nodeid": "tests/test_utils_duo.py::test_list_pgroups",
- "callspec": null
- }
-]
\ No newline at end of file
+[]
\ No newline at end of file