#! /usr/bin/python3 # SPDX-License-Identifier: GPL-2.0-or-later # # tasst - Test A Simple Socket Transport # library of test helpers for passt & pasta # # tasst/site.py - Manage simulated network sites for testing # # Copyright Red Hat # Author: David Gibson import contextlib import avocado from avocado.utils.process import CmdError from tasst import Tasst 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 __enter__(self): raise NotImplementedError def __exit__(self, *exc_details): raise NotImplementedError def output(self, cmd, **kwargs): raise NotImplementedError def fg(self, cmd, **kwargs): self.output(cmd, **kwargs) def require_cmds(self, *cmds): missing = [c for c in cmds if self.fg('type {}'.format(c), ignore_status=True) != 0] if missing: raise avocado.TestCancel("Missing commands {} on {}" .format(', '.join(missing), self.name)) class SiteTasst(Tasst): """ Basic tests for executing commands on sites :avocado: disable :avocado: tags=meta """ timeout = 1.0 # Derived classes must redefine this def setup_site(self): raise NotImplementedError("{} must implement setup_site() method".format(type(self).__name__)) def test_true(self): with self.setup_site() as site: site.fg('true') def test_false(self): with self.setup_site() as site: self.assertRaises(CmdError, site.fg, 'false') def test_echo(self): with self.setup_site() as site: s = 'Hello tasst' out = site.output('echo {}'.format(s)) self.assertEquals(out, s.encode('utf-8')) # Represents the host on which the tests are running, as opposed to # some simulated host created by the tests class RealHost(Site): def __init__(self): super().__init__('REAL_HOST') def __enter__(self): return self def __exit__(self, *exc_details): pass def output(self, cmd, sudo=False, **kwargs): assert not sudo, "BUG: Shouldn't run commands with privilege on host" return avocado.utils.process.system_output(cmd, **kwargs) def fg(self, cmd, sudo=False, **kwargs): assert not sudo, "BUG: Shouldn't run commands with privilege on host" return avocado.utils.process.system(cmd, **kwargs) REAL_HOST = RealHost() class RealHostTasst(SiteTasst): def setup_site(self): return REAL_HOST