#! /usr/bin/env avocado-runner-avocado-classless # SPDX-License-Identifier: GPL-2.0-or-later # # Copyright Red Hat # Author: David Gibson """ Test A Simple Socket Transport tasst/exesite.py - Manage simulated network sites for testing """ import contextlib import avocado from avocado.utils.process import CmdError from avocado_classless.test import assert_eq, assert_raises, test_output class Site(contextlib.AbstractContextManager): """ A (usually virtual or simulated) location where we can execute commands and configure networks. """ def __init__(self, name): self.name = name # For debugging def hostify(self, cmd, **kwargs): raise NotImplementedError def __enter__(self): return self def __exit__(self, *exc_details): pass def output(self, cmd, strip_trail_nl=False, **kwargs): kwargs['strip_trail_nl'] = strip_trail_nl cmd, kwargs = self.hostify(cmd, **kwargs) return avocado.utils.process.system_output(cmd, **kwargs) def fg(self, cmd, **kwargs): cmd, kwargs = self.hostify(cmd, **kwargs) return avocado.utils.process.system(cmd, **kwargs) def require_cmds(self, *cmds): missing = [c for c in cmds if self.fg(f'type {c}', ignore_status=True) != 0] if missing: raise avocado.TestCancel( f"Missing commands {', '.join(missing)} on {self.name}") def test_site(sitefn): def test_true(s): with s as site: site.fg('true') def test_false(s): with s as site: assert_raises(CmdError, site.fg, 'false') def test_echo(s): with s as site: msg = 'Hello tasst' out = site.output(f'echo {msg}') assert_eq(out, msg.encode('utf-8') + b'\n') def test_timeout(s): with s as site: site.fg('sleep infinity', timeout=0.1, ignore_status=True) return test_output(test_true, test_false, test_echo, test_timeout)(sitefn) class RealHost(Site): """Represents the host on which the tests are running (as opposed to some simulated host created by the tests) """ def __init__(self): super().__init__('REAL_HOST') def hostify(self, cmd, *, sudo=False, **kwargs): assert not sudo, "BUG: Shouldn't run commands with privilege on host" return cmd, kwargs REAL_HOST = RealHost() @test_site def real_host(): return REAL_HOST