3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-11-25 17:59:25 +01:00

auto-t: end process_io on HUP signal, detect process crash

When HUP is received the IO read callback was never completing which
caused it to block indefinitely until waited for. This didn't matter
for most transient processes but for IWD, hostapd, wpa_supplicant
it would cause test-runner to hang if the process crashed.

Detecting a crash is somewhat hacky because we have no process
management like systemd and the return code isn't reliable as some
processes return non-zero under normal circumstances. So to detect
a crash the process output is being checked for the string:
"++++++++ backtrace ++++++++". This isn't 100% reliable obviously
since its dependent on how the binary is compiled, but even if the
crash itself isn't detected any test should still fail if written
correctly.

Doing this allows auto-tests to handle IWD crashes gracefully by
failing the test, printing the exception (event without debugging)
and continue with other tests.
This commit is contained in:
James Prestwood 2024-02-29 09:07:30 -08:00 committed by Denis Kenzior
parent aef394895d
commit 5067654a6d

View File

@ -175,23 +175,27 @@ class Process(subprocess.Popen):
def process_io(self, source, condition): def process_io(self, source, condition):
if condition & GLib.IO_HUP: if condition & GLib.IO_HUP:
self.hup = True self.hup = True
self.wait()
bt = self.out.partition("++++++++ backtrace ++++++++")
if bt[1]:
raise Exception(f"Process {self.args[0]} crashed!\n{bt[1] + bt[2]}")
data = source.read() data = source.read()
if not data: if not data:
return True return not self.hup
try: try:
data = data.decode('utf-8') data = data.decode('utf-8')
except: except:
return True return not self.hup
# Save data away in case the caller needs it (e.g. list_sta) # Save data away in case the caller needs it (e.g. list_sta)
self.out += data self.out += data
self._write_io(self, data) self._write_io(self, data)
return True return not self.hup
def _append_outfile(self, file, append=True): def _append_outfile(self, file, append=True):
gid = int(os.environ.get('SUDO_GID', os.getgid())) gid = int(os.environ.get('SUDO_GID', os.getgid()))