summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/lib/oeqa/core/target/ssh.py17
-rw-r--r--meta/lib/oeqa/runtime/cases/ssh.py3
2 files changed, 19 insertions, 1 deletions
diff --git a/meta/lib/oeqa/core/target/ssh.py b/meta/lib/oeqa/core/target/ssh.py
index f22836d390..f4dd0ca417 100644
--- a/meta/lib/oeqa/core/target/ssh.py
+++ b/meta/lib/oeqa/core/target/ssh.py
@@ -232,11 +232,12 @@ def SSHCall(command, logger, timeout=None, **opts):
232 output_raw = b'' 232 output_raw = b''
233 starttime = time.time() 233 starttime = time.time()
234 process = subprocess.Popen(command, **options) 234 process = subprocess.Popen(command, **options)
235 has_timeout = False
235 if timeout: 236 if timeout:
236 endtime = starttime + timeout 237 endtime = starttime + timeout
237 eof = False 238 eof = False
238 os.set_blocking(process.stdout.fileno(), False) 239 os.set_blocking(process.stdout.fileno(), False)
239 while time.time() < endtime and not eof: 240 while not has_timeout and not eof:
240 try: 241 try:
241 logger.debug('Waiting for process output: time: %s, endtime: %s' % (time.time(), endtime)) 242 logger.debug('Waiting for process output: time: %s, endtime: %s' % (time.time(), endtime))
242 if select.select([process.stdout], [], [], 5)[0] != []: 243 if select.select([process.stdout], [], [], 5)[0] != []:
@@ -257,6 +258,10 @@ def SSHCall(command, logger, timeout=None, **opts):
257 logger.debug('BlockingIOError') 258 logger.debug('BlockingIOError')
258 continue 259 continue
259 260
261 if time.time() >= endtime:
262 logger.debug('SSHCall has timeout! Time: %s, endtime: %s' % (time.time(), endtime))
263 has_timeout = True
264
260 process.stdout.close() 265 process.stdout.close()
261 266
262 # process hasn't returned yet 267 # process hasn't returned yet
@@ -293,6 +298,16 @@ def SSHCall(command, logger, timeout=None, **opts):
293 pass 298 pass
294 process.wait() 299 process.wait()
295 300
301 if has_timeout:
302 # Version of openssh before 8.6_p1 returns error code 0 when killed
303 # by a signal, when the timeout occurs we will receive a 0 error
304 # code because the process is been terminated and it's wrong because
305 # that value means success, but the process timed out.
306 # Afterwards, from version 8.6_p1 onwards, the returned code is 255.
307 # Fix this behaviour by checking the return code
308 if process.returncode == 0:
309 process.returncode = 255
310
296 options = { 311 options = {
297 "stdout": subprocess.PIPE, 312 "stdout": subprocess.PIPE,
298 "stderr": subprocess.STDOUT, 313 "stderr": subprocess.STDOUT,
diff --git a/meta/lib/oeqa/runtime/cases/ssh.py b/meta/lib/oeqa/runtime/cases/ssh.py
index 13aac54396..cdbef59500 100644
--- a/meta/lib/oeqa/runtime/cases/ssh.py
+++ b/meta/lib/oeqa/runtime/cases/ssh.py
@@ -13,6 +13,9 @@ class SSHTest(OERuntimeTestCase):
13 @OETestDepends(['ping.PingTest.test_ping']) 13 @OETestDepends(['ping.PingTest.test_ping'])
14 @OEHasPackage(['dropbear', 'openssh-sshd']) 14 @OEHasPackage(['dropbear', 'openssh-sshd'])
15 def test_ssh(self): 15 def test_ssh(self):
16 (status, output) = self.target.run('sleep 20', timeout=2)
17 msg='run() timed out but return code was zero.'
18 self.assertNotEqual(status, 0, msg=msg)
16 (status, output) = self.target.run('uname -a') 19 (status, output) = self.target.run('uname -a')
17 self.assertEqual(status, 0, msg='SSH Test failed: %s' % output) 20 self.assertEqual(status, 0, msg='SSH Test failed: %s' % output)
18 (status, output) = self.target.run('cat /etc/controllerimage') 21 (status, output) = self.target.run('cat /etc/controllerimage')