tests: Make FST kill_pid() more robust
authorJouni Malinen <jouni@qca.qualcomm.com>
Mon, 22 Aug 2016 10:17:44 +0000 (13:17 +0300)
committerJouni Malinen <j@w1.fi>
Mon, 22 Aug 2016 14:44:05 +0000 (17:44 +0300)
It looks like the attempt to read the process id from a PID file can
return empty data. This resulted in kill_pid() failing to kill the
process and all the following FST test cases using the extra interface
failing. While the PID file is really supposed to have a valid PID value
when we get this far, it is better to try multiple times to avoid
failing large number of test cases.

The current os_daemonize() implementation ends up calling daemon() first
and then writing the PID file from the remaining process that is running
in the background. This leaves a short race condition where an external
process that started hostapd/wpa_supplicant could end up trying to read
the PID file before it has been written.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
tests/hwsim/test_fst_config.py

index 73ceea4..03287b2 100644 (file)
@@ -234,9 +234,17 @@ class FstLauncher:
                 return
         pid = -1
         try:
-            pf = file(pidfile, 'r')
-            pid = int(pf.read().strip())
-            pf.close()
+            for i in range(3):
+                pf = file(pidfile, 'r')
+                pidtxt = pf.read().strip()
+                self.logger.debug("kill_pid: %s: '%s'" % (pidfile, pidtxt))
+                pf.close()
+                try:
+                    pid = int(pidtxt)
+                    break
+                except Exception, e:
+                    self.logger.debug("kill_pid: No valid PID found: %s" % str(e))
+                    time.sleep(1)
             self.logger.debug("kill_pid %s --> pid %d" % (pidfile, pid))
             os.kill(pid, signal.SIGTERM)
             for i in range(10):