diff options
Diffstat (limited to 'meta/lib')
| -rw-r--r-- | meta/lib/oeqa/core/target/ssh.py | 17 | ||||
| -rw-r--r-- | meta/lib/oeqa/runtime/cases/ssh.py | 3 |
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') |
