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:
parent
aef394895d
commit
5067654a6d
@ -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()))
|
||||||
|
Loading…
Reference in New Issue
Block a user